Привет всем!
Понадобилось мне как-то отдавать табличные данные пользователю в несколько страниц.
Хм, "csv" - подумал я! Но не тут-то было.. не поддерживает csv страницы. И вот тогда, подумалось, что все это дело можно засунуть в xls файл, но хостинг был шаред, практически пустой. После некоторых часов поисков готового рабочего варианта было принято решение писать свой "велосипед"...
Вобщем методом научного тыка в течении пары часов нашел что за что отвечает и как этот xlsx генерируется. Потом порядком времени ушло на то чтобы это все собрать воедино в более-менее вменяемый вариант. Ну, и собственно все получилось, и даже работает!
Итак, класс "zV-class XLSX"! Не требователен к серверу, требуется модуль Zlib, но он практически везде есть. Архив с нужными файлами прикрепил, а сейчас опишу как там все работает.
В архиве найдете:
папку skeleton - тут лежит "скелет" будующих xlsx файлов
папку templates - тут темплитки файлов, которые будем менять
файл sxlsx.php - сам файл класса
файл zipfile.php - класс zip-архиватора
Работает в 2007-м екселе!
Как сгенерировать файл
include(dirname(__FILE__) . '/sxlsx/sxlsx.php'); // инклюдим файл класса
$sxlsx = new sxlsx('/tmp/test.xlsx'); // будем создавать файл /tmp/test.xlsx
$sxlsx->addSheet(1, 'страница 1'); // создаем новую страницу. '1' - ID страницы; 'страница 1' - её название (если не указано, будет использоваться дефолтное)
$sxlsx->addData('a1', 'Здесь A1'); // добавляем данные в ячейку A1 на ПЕРВОЙ странице. 'a1' - ячейка (колонка-ряд); 'Здесь A1' - контент ячейки (если не указан, ячейка очищается)
$sxlsx->addSheet(2, 'номер два'); // добавляем вторую страницу
$sxlsx->addData('b3', 'Здесь B3'); // добавляем данные в ячейку b3 на ВТОРОЙ странице
// теперь хотим снова добавить данные на первую страницу:
$sxlsx->selectSheet(1); // "перелистываем" на первую страниу. '1' - ID страницы
$sxlsx->addData('b1', 'Здесь B1 на первой странице');
$sxlsx->generate(); // генерируем
// ВСЁ!, файл можно забирать!
/// еще есть метод deleteSheet(ID) - удаляет страницу по её ID
/// класс выбрасывает исключение sxlsx_Exception при ошибке
Есть варианты генерации:
- если при создании объекта указывается путь до конечного файла, то файл сохраняется туда. Если ничего не указывать, то, соответственно ничего никуда не сохранится.
- если при вызове функции generate() передать в нее название файла (например, просто file.xlsx), то файл будет предложен к скачиванию пользователю под этим именем.
- ну, и тут уже можно комбинировать: можно просто отдать файл пользователю, без сохранения на сервер, а можно и сохранить и отдать... А можно вообще ничего не делать
На будущее
- сделать возможным изменять ширину колонок и высоту строк
- стили тектса, цвета и прочие красивости
- немного разделить исключения на разные типы
- еще че-нибудь
Cамое сложное в программировании - писать описание к тому что напрограммировал Смотрите класс, там могут быть недокументированные функции.
И еще...
Может такое быть, что файл не будет открываться. Решение есть :) В файлах:
\xl\sharedStrings.xml
\xl\workbook.xml
сменить кодировку на utf8. + можно добавить к класс принудительную установку кодировки.
Все)
Удачи!
- Владислав
- 23-02-2012, 22:28
- 5 074