"Как создать xls таблицу с помощью PHP?", - этим вопросом задался при создании очередного сайта с нестандартным функционалом. Задача оказалось тривиальной. Но с одним подводным камнем.
Эксель таблица (xls) - это html файл с таблицей, но с расширением файла xls. Поэтому для выгрузки данных с сайта в xls достаточно сформировать обычную html таблицу.
Беда кроется в кодировке. При выгрузке получатся кракозябры, если не указать на выгружаемой странице кодировку.
Как выгрузить данные из PHP в XLS
Приведу готовый пример выгрузки данных с сайта в xls файл. Выгружать будем через PHP. Для начала рассмотрим серверную часть. Создаём PHP файл в кодировке UTF-8 (без BOM) со следующим содержанием:
<?
header('Content-Type: application/vnd.ms-excel; format=attachment;');
header('Content-Disposition: attachment; filename=downloaded_' . date('Y-m-d H:i:s') . '.xls');
header('Expires: Mon, 18 Jul 1998 01:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');?>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<table>
<tr>
<th>Первая колонка</th>
<th>Вторая колонка</th></tr>
<tr><td>Вторая строчка</td>
<td>Последняя ячейка</td></tr>
</table>
Первая строка с "header" говорит, что скачиваться будет не просто страница, а application/vnd.ms-excel в формате вложения (attachment).
На второй строке формируется имя файла. В него вставлена дата с точностью до секунд date('Y-m-d H:i:s'). Сделано специально для удобства отладки, чтобы загружать много раз.
Далее идут указания не кешировать страницу Cache-Control: no-store, no-cache, must-revalidate. С уточнением, что время валидности кеша давно прошло.
После php скрипта первой строчкой идёт <meta> тег. В котором стоит "text/html; charset=utf-8". Казалось бы, можно перенести задание кодировки charset внутрь первой строчки header. Но нет! Если задать кодировку через php, то она не воспримется экселем. И из файла полезут не русские символы, а непонятные значки.
Серверная часть готова. Остаётся сделать ссылку для скачивания на стороне клиента. Выглядеть код будет примерно так:
<a href="/xls.php">Скачать</a>
При клике на такую ссылку начнётся скачивание.
Заключение
Чтобы не быть голословным, создал файл с приведённым скриптом и кнопку:
Проверьте, файл должен возвращаться в правильной кодировке.
Добюрый день, в экселе файл открывается без разметки сетки ячеек, почему это может быть и как исправить? заранее благодарю за ответ!
Возможно, ошибка в html коде файла с таблицей: у какого-то тега нет пары или атрибуты тегов неверно открыты/закрыты.