button for download
<a href="?export=csv">Download CSV</a>

for wp list table
function extra_tablenav($which) {
if ($which == "top") {
echo '<a href="' . esc_url(add_query_arg('export', 'csv')) . '" class="button button-primary">Export as CSV</a>';
}
}


function export_to_csv() {
if (isset($_GET['export']) && $_GET['export'] === 'csv') {
global $wpdb;

// The SQL query for fetching data
$sql = "SELECT * FROM wp_users";

$data = $wpdb->get_results($sql, ARRAY_A);

// Set headers for CSV download
header('Content-Type: text/csv');
header('Content-Disposition: attachment;filename=user_report.csv');

// Open output stream to write CSV
$output = fopen('php://output', 'w');

// Output column headers
fputcsv($output, array('ID', 'email'));

// Output data rows
foreach ($data as $row) {
fputcsv($output, $row);
}

fclose($output);

// Stop further execution after outputting the CSV
exit();
}
}
add_action('admin_init', 'export_to_csv');