Думаю, что по скриншоту уже понятно, о чём идёт речь. Но, дабы не дублировать текст, который уже описан в документации, я расскажу только о важных моментах.
Дело в том, что php-библиотека для работы с excel-документами появилась давно, но для неё так до сих пор не придумали шаблонизатор (по крайней мере я практически ничего более толкового не нашёл). А всем нам нужна такая библиотека для excel, в которой в шаблоне вбил шаблонные переменные, передал параметры для них, и отправить в рендер. Всё это делается одной командой:
use alhimik1986\PhpExcelTemplator\PhpExcelTemplator;
PhpExcelTemplator::saveToFile('./template.xlsx', './exported_file.xlsx', [
'{current_date}' => date('d-m-Y'),
'{department}' => 'Sales department',
]);
При этом у нас имеются следующие хотелки:
- мы хотим применять несколько шаблонных переменных в одной ячейке
- а ещё мы хотим передать массив, а в excel для этого в ячейке создавались соответствующие строки
- а как насчёт двумерного массива, чтобы создавались не только строки, но и столбцы
- а ещё нам нужно применять стили для каждой вставленной ячейки, например, чтобы выделить зелёным цветом крупные суммы или выделить жирным цветом отличившихся сотрудников
Вы скажете, что я уже пытался делать подобное: когда создаются строки, то колонки справа от этой ячейки будут дублироваться. Нет такого не произойдёт, потому что на самом деле не строки создаются, а «добавляются ячейки со сдвигом вниз». Кстати, в PHP Spreadsheet на данный момент такой функции нет, он может только вставлять строки.
Возможны ли побочные эффекты при использовании большого количества одномерных и двумерных массивов? Да, возможны. Особенно, когда используются несколько двумерных массивов в одном ряду и на нескольких строчках подряд. Дело в том, что ячейки (находящиеся с права), которые не содержат шаблонные переменные, они не сдвигаются. В результате они могут быть перекрыты ячейками с двумерным массивом. Выход из ситуации — создавать шаблонные переменные с пустыми данными и располагать эти переменные рядом с ячейками, для которых нужно делать отступы. Пример побочных эффектов имеется в папке «samples».
Звучит сложно, но, если бы создавались строки, то побочных эффектов было бы намного больше. То есть шансы побочных эффектов сравнительно низки.
В планах: создать пример, в котором показано, как бороться с побочными эффектами; возможность применять стили без использования сеттеров (чтобы экспортировать меньше классов и уменьшить количество применяемого кода). Почему я не сделал этого сейчас? Мне нужна поддержка, то есть мне мне надо знать, что это кому-то нужно. А то вдруг окажется, что я изобрёл велосипед и всё, что я сделал — дичь полнейшая. Поэтому жду ваши отзывы.
Ссылка на проект
Комментарии (11)
ilyaplot
09.10.2018 10:43А по производительности что? Оно не мрет на 1000 строк?
AlexLeonov
09.10.2018 10:58Если вам нужна производительность, вам нужен настоящий Excel, например через COM-объекты.
Hardcoin
09.10.2018 11:43е нужен. 50к строк мы вполне делаем на php, слава Ктулху, никакого com на линукс-машине для этого не требуется.
Hardcoin
09.10.2018 11:45На первый взгляд очень круто. Планировал в конце месяца писать свое, необходимо на работе, но попробую использовать ваш.
michael_vostrikov
09.10.2018 14:34У нас было так. В Excel есть какой-то формат в виде одного XML-файла, сначала в Excel делаешь пример документа, сохраняешь в этот формат, открываешь в текстовом редакторе, убираешь все лишнее, добавляешь вывод через
<?= ... ?>
, и рендеришь как обычный HTML-шаблон.
Fantyk
09.10.2018 15:33Не совсем понял какого функционала не хватает в PHPExcel/PhpSpreadsheet по сравнению с вашим пакетом?
holymolycasinos
10.10.2018 10:26Это обёртка над PhpSpreadsheet. Добавляет возможность задания формата и расположения повторяющихся значений не в коде, а в Excel.
PQR
09.10.2018 20:03Про сдвиг ячеек вниз, чтобы то что справа не дублировалось: актуальная и классная фича! Лет 10 назад делали шаблонизатор, но по этому моменту ограничиться правилом: если вставляем двумерный массив, справа в шаблоне ничего не должно быть.
А вот вам ещё задачка на проработку: если во вставляемом двумерном массиве слишком много строк, так что при печати получается разбивка на несколько страниц, на каждой странице нужно повторить шапку! Что считать шапкой -отдельный вопрос. Это могут быть не только заголовки таблицы, а вообще произвольный шаблон из нескольких строк.alhimik1986 Автор
12.10.2018 15:07Это всё можно настроить в файле шаблона. Например, в разделе «Разметка страницы» -> «Печатать заголовки». В открывшемся окне есть поле «сквозные строки» — в нём и выбираем строку (т.е. строку шапки), которая будет повторяться на каждой странице.
kvantik
Спасибо, я буду пользоваться!