alhimik1986 / php-excel-templator

PHP Spreadsheet extension to the export excel file from excel template
MIT License
344 stars 68 forks source link

Проблемы с обработанным файлом #15

Open Stardisk opened 4 years ago

Stardisk commented 4 years ago

Здравствуйте. Во-первых, файл увеличивается более чем в 2 раза после обработки библиотекой (5 кбайт шаблон, 12 кбайт обработанный, хотя в него вставляется всего пара слов).

Во-вторых, при открытии обработанного файла выскакивает следующая ошибка: "Предупреждение при загрузке документа test2.xlsx: Данные не могут быть загружены полностью, т.к. превышено максимальное количество столбцов в листе." Но при этом файл все равно открывается, переменные заменяются, и никаких излишних столбцов нет. Для открытия использую LibreOffice Calc

alhimik1986 commented 4 years ago

Пришли файл, в котором происходит эта проблема. При необходимости "секретные данные" можешь удалить из него. Попробую разобраться.

Во-первых, файл увеличивается более чем в 2 раза после обработки библиотекой (5 кбайт шаблон, 12 кбайт обработанный, хотя в него вставляется всего пара слов).

Файл может иметь иной размер, потому что он создаётся из Writer-объекта, а не копируется из оригинального файла.

Stardisk commented 4 years ago

Я искал библиотеку, которая по аналогии с PhpWord может заменять переменные в документе на текст. И наткнулся на твою библиотеку. Создал простейший файл для проверки твоей библиотеки. test.xlsx - файл с переменными. test2.xlsx - выходной файл от твоей библиотеки. Код я взял из README с небольшими изменениями: use alhimik1986\PhpExcelTemplator\PhpExcelTemplator; PhpExcelTemplator::saveToFile('./test.xlsx', './test2.xlsx', [ '${test1}' => date('d-m-Y'), '${test2}' => 'English', '${test3}' => 'Русский', '${test4}' => 'Тестирование длинных строк', ]); test.xlsx test2.xlsx И собственно при открытии test2.xlsx в LibreOffice выскакивает ошибка про столбцы.

Vite4eg commented 2 years ago

Это не проблема данной библиотеки, так работает PhpSpreadsheet. Такое происходит например в случае, когда хотят в исходном файле сделать какое-нибудь действие на все колонки. Например, выравнивание во всех ячейках. В таком случае выделяют все ячейки, указывают настройки. В результате этого в структуре xlsx сохраняется, что есть максимальная ячейка, для которой надо применить настройки. Это можно увидеть если распаковать файл .xlsx, внутри есть файл xl/worksheets/sheet1.xml. В файле появится примерно такой узел:

<cols>
    <col collapsed="false" customWidth="false" hidden="false" max="1024" min="1" outlineLevel="0" style="1" width="11.56"/>
</cols>

PhpSpreadSheet при чтении документа учитывает атрибут max, генерит большой документ при сохранении

Варианты решения:

  1. Не применять операции на все колонки документа
  2. Удалить на всякий случай все колонки после последней используемой колонки перед сохранением документа

Удаление колонок:

  1. Выделить колонку, после которой можно всё удалять (сама колонка тоже удалится)
  2. Нажать Ctrl+Shift + 🠖 - так мы выделим все колонки до конца документа
  3. Правой кнопкой - Удалить

Такие действия помогали убрать неиспользуемые столбцы из упоминаний в структуре xlsx, PhpSpreadsheet начинал создавать адекватные файлы