Идеальным решением является создание независимого от платформы файла "Excel", который может быть открыт любой программой для работы с электронными таблицами или текстовым редактором (не только в Excel). Под этим я подразумеваю базовый файл CSV.
К счастью, внешние библиотеки не нужны: в PHP есть несколько встроенных функций для чтения / записи файлов CSV. Итак, шаги по извлечению данных из базы данных в Excel-читаемый CSV-файл:
- Запрос БД и итерации по результатам:
mysql_result
документы
- Внутри цикла, который перебирает результаты DB, используйте
fputcsv
docs для записи файла csv.
Теперь вам может быть интересно, как получить созданный вами файл csv на свой компьютер, а не на сервер, где вы его только что создали. К счастью, для этого также есть простое решение.
Допустим, вы хотите, чтобы csv являлся фактическим содержимым создаваемой вами страницы. Я имею в виду, что вы хотите, чтобы браузер обрабатывал файл PHP так, как если бы он сам был файлом CSV .
Хранение файла CSV в памяти, а не на диске
Вместо того, чтобы использовать настоящий дескриптор файла для записи csv в ваших fputcsv
операциях, откройте дескриптор файла в памяти, чтобы сделать то же самое. Это имеет преимущество в том, что выполняется быстрее, чем запись на диск. Чтобы открыть дескриптор файла в памяти для использования в fputcsv
вызовах, вы должны сделать:
$tmp_handle = fopen('php://temp', 'r+');
Это откроет дескриптор файла в памяти, а не в файловой системе. Обратите внимание, что как только дескриптор файла достигнет значения по умолчанию 2 МБ в файловом размере, PHP переключит его прозрачно во временный файл в файловой системе. Вы можете избежать этого и заставить дескриптор файла оставаться в памяти, используя вместо этого:
$tmp_handle = fopen('php://memory', 'r+');
Затем вы будете использовать этот дескриптор в своих звонках на fputcsv
:
fputcsv($tmp_handle, $fields);
Подробнее о php://memory
и php://temp
вы можете узнать в PHP-справке по теме .
Заставить браузер думать, что это CSV-файл
Последнее, что вам нужно сделать, чтобы убедить браузер, что страница на самом деле является файлом csv после того, как вы сгенерировали данные, это отправить правильные заголовки типа содержимого HTTP вместе с вашими данными:
// generate my csv data here
header('Content-type: text/csv');
header('Content-disposition: attachment;filename=MyVerySpecial.csv');
// reset the file handle's pointer to the beginning of the stream
rewind($tmp_handle);
// output the contents of the file handle to the browser
echo stream_get_contents($tmp_handle);