Мой клиент попросил меня создать систему экспорта, которая экспортирует всю базу данных SQL в файл CSV, который работает в Excel. Я нашел PHPexcel, и это здорово, но я думал, что могу делать вещи намного проще и быстрее, используя свои собственные функции.
После борьбы с кодировкой Excel мне наконец удалось экспортировать CSV, который будет работать в Excel, используя следующий код:
<?php
$data = showData("price"); //Function that loads all the SQL database into an array.
function array2csv(array &$array)
{
if (count($array) == 0) {
return null;
}
ob_start();
$df = fopen("php://output", 'w');
fputcsv($df, array_keys(reset($array)));
foreach ($array as $row) {
fputcsv($df, $row);
}
fclose($df);
return ob_get_clean();
}
function download_send_headers($filename) {
// disable caching
$now = gmdate("D, d M Y H:i:s");
header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
header("Last-Modified: {$now} GMT");
header ( 'HTTP/1.1 200 OK' );
header ( 'Date: ' . date ( 'D M j G:i:s T Y' ) );
header ( 'Content-Type: application/vnd.ms-excel') ;
header ( 'Content-Disposition: attachment;filename=export.csv' );
}
download_send_headers("export.csv");
$final = array2csv($data);
print chr(255) . chr(254) . mb_convert_encoding($final, 'UTF-16LE', 'UTF-8');
die();
?>
Проблема в том, что при попытке открыть файл в Excel нет столбцов. Каждая строка представляет собой большой столбец, содержащий все данные конкретной строки, разделенные запятой.
Я понял, что мне нужно заменить эти запятые на что-то, что Excel может прочитать как «новый столбец». Но мне все еще нужно, чтобы мой CSV работал так, как есть.
Я безуспешно искал SO и Google, находя решение, которое сохранит мой CSV-файл нетронутым, и все же разделит данные на столбцы Excel. Если нет способа сделать оба, я думаю, что более важным для моего клиента является то, что версия Excel будет работать так, как должна (каждая строка разделена на столбцы).
Это картина того, как это выглядит на CSV (с использованием чисел на Mac)
И это картина того, как это выглядит в Excel 2007 на Windows
Это все в функции fputcsv ():
http://php.net/manual/en/function.fputcsv.php
Попробуйте выбрать правильный $delimiter
, $enclosure
а также $escape_char
,
Символ по умолчанию, используемый в качестве разделителя полей в Excel, задается настройками локали. Это означает: импорт файлов CVS может зависеть от языка. Экспорт в CSV из Excel, чтобы увидеть, что он делает в вашей системе, и проверить, что ваша клиентская система имеет те же настройки.
Лучше экспортировать в XML вместо CSV, потому что это обойдет эту проблему:
Других решений пока нет …