Index: src/include/lib/Garradin/Membres/Import.php ================================================================== --- src/include/lib/Garradin/Membres/Import.php +++ src/include/lib/Garradin/Membres/Import.php @@ -260,11 +260,11 @@ fclose($fp); return true; } - public function toCSV() + public function toCSV($excel = false) { $db = DB::getInstance(); $champs = Config::getInstance()->get('champs_membres')->getKeys(); $champs = 'm.' . implode(', m.', $champs); @@ -271,25 +271,26 @@ $res = $db->prepare('SELECT ' . $champs . ', c.nom AS categorie FROM membres AS m LEFT JOIN membres_categories AS c ON m.id_categorie = c.id ORDER BY c.id;')->execute(); $fp = fopen('php://output', 'w'); + fputs($fp, Utils::csv_header($excel)); $header = false; while ($row = $res->fetchArray(SQLITE3_ASSOC)) { unset($row->passe); if (!$header) { - fputcsv($fp, array_keys($row)); + fputs($fp, Utils::row_to_csv(array_keys($row), $excel)); $header = true; } - fputs($fp, Utils::row_to_csv($row) . "\r\n"); + fputs($fp, Utils::row_to_csv($row, $excel)); } fclose($fp); return true; } } Index: src/include/lib/Garradin/Utils.php ================================================================== --- src/include/lib/Garradin/Utils.php +++ src/include/lib/Garradin/Utils.php @@ -721,16 +721,33 @@ { fseek($fp, 0); } } - static public function row_to_csv($row) + static public function row_to_csv($row, $excel = false) { $row = (array) $row; + $eol = "\r\n"; + // Excel ne comprends pas les virgules en france, le c*****! + $separator = $excel ? '";"' : '","'; + array_walk($row, function ($field) { return strtr($field, ['"' => '""', "\r\n" => "\n"]); }); - return '"' . implode('","', $row) . '"'; + $out = '"' . implode($separator, $row) . '"' . $eol; + + return $out; + } + + static public function csv_header($excel = false) + { + if ($excel) + { + // BOM spécifique pour Excel sinon il ne sait pas lire l'UTF8! + return chr(0xEF) . chr(0xBB) . chr(0xBF); + } + + return ''; } } Index: src/templates/admin/membres/import.tpl ================================================================== --- src/templates/admin/membres/import.tpl +++ src/templates/admin/membres/import.tpl @@ -1,10 +1,11 @@ {include file="admin/_head.tpl" title="Import & export des membres" current="membres" js=1}
{form_errors} {if $ok} Index: src/www/admin/membres/import.php ================================================================== --- src/www/admin/membres/import.php +++ src/www/admin/membres/import.php @@ -9,11 +9,11 @@ if (null !== qg('export')) { header('Content-type: application/csv'); header('Content-Disposition: attachment; filename="Export membres - ' . $config->get('nom_asso') . ' - ' . date('Y-m-d') . '.csv"'); - $import->toCSV(); + $import->toCSV(qg('export') == 'excel' ? true : false); exit; } $champs = $config->get('champs_membres')->getAll(); $champs->date_inscription = (object) ['title' => 'Date inscription', 'type' => 'date'];