Как стать автором
Обновить

Комментарии 37

Интересно, что потом пользователи делают с отчётом из 600К строк? Глазами, очевидно, все тысячи строк не смотрят…
Скорее, они могут использовать этот же эксель для импорта в другую софтину. Хотя, выгрузить тот же прайс с 100к позиций, которые разложены по вкладкам — тоже возможный сценарий :)
Действительно. Скорее всего анализируется какой-то срез данных из всех этих 600К строк. Может нужно было посмотреть в строну формирования не полностью отчета, а именно тех данных которые нужны.
Передают людям, которые не имеют доступа в систему. Система располагается в закрытой корпоративной сети, а часть пользователей — удаленно, и они могут не иметь доступа. Кто-то ходит через vipnet, а кто-то получает файлы в 600К строк
а экспортировать в csv а потом конвертнуть какойто консольной утилиткой в эксель файл?
Я думаю, если бы документ состоял чисто из таблицы с данными — то скорее всего просто использовали бы CSV формат.А так — данные в документе дополнительно можно форматировать (шрифты, цвета, фильтры, дропдауны), да и разбиение по листам — тоже нередко нужная вещь для тех, кто потом работает с excel.
Из личного опыта — найти утилиту правильно конвертирующую таблицу в соиню полей и пару сотен тысяч строк — не так просто, это ещё не учитывая того что в поле название организации вполне могут быть любые символы в т.ч. перенос строки во всех трёх известных вариантах.
p.s. а у Oracle ещё number(38 цифр) — один из наиболее распоспостранённых типов, да и номер счёта (20 цифр) excel очень любит сохранить как число (с округлением ;)).

"Пучеглазят"
Но по факту обычно фильтры/формулы/суммы/сводные таблицы/сравнения с другими данными/системы построенные на ссылках на другие файлы (это то что видел лично).
Причём если вам покажется что эти процессы легко автоматизировать — это не совсем так, т.к. процесс может слишком часто меняться ввиду внешних причин/часто присутствует "экпертное мнение"/банально для многих ручных вещей может не существовать более удобного и гибкого инструмента чем эксель :)

Zodiak_smr, пришлось ли отказаться от функционала исходной библиотеки или все необходимое затащили в свою?

К сожалению, отказаться полностью от PhpSpreadsheet не удалось. Например, в некоторых отчетах требуется сохранить html-разметку (цвет текта, размер и т.д.) в формируемом эксельнике. В этих случаях и некоторых других оставили старую библиотеку. Свое решение применили точечно к крупным отчетам.

Форматирование корректно работает у вас? Текст, чтобы ведущие нули не терялись, не конвертировались в числа/деньги значения, количество нолей после запятой и др.

Форматирование — корректно с этим проблем нет. Это один из важных моментов, на который обращали внимание. Если бы можно было убрать форматирование, то время построения файла сократилось бы ~ 30%, проводили такие тесты.
А какого рода данные постоянно нужны сотрудникам в виде отчетов? Да еще и в экселе… Намекните хотя бы)
Увы. Заказчик — гос структура, и данные весьма… специфичны. А у нас соглашение о неразглашении
По фразе доступ через VipNet я уже стал догадываться)
потом каждая операция в таком файле выпооняется несколько минут, или у юзеров машины хорошие
Во время тестирования объем данных искусственно увеличивали для оценки потенциала. Так при этих тестах несколько одновременно просто открытых файлов иногда подвешивали систему. Но заказчик пока не жалуется)

Для некоторых отчётов эффективно сделать xlsx, который тянет данные напрямую из базы (лучше из реплики) и строит срезы или сводные.

Держали в уме подобный вариант на случай, если не удастся достичь успеха внутри системы. Еще был резервный вариант с подключением к реплике Power BI и построение этого отчета оттуда. Но оказалось, что Power BI имеет ограничение: максимальное количество строк, которое можно экспортировать в XLSX-файл — 150 000
А почему не банальный csv? который влет открывается тем же Excel?
видимо из-за раскраски разметки
Это было первое, что предлагали в качестве решения. Но заказчика вариант не устроил, хотели только xlsx на выходе. Переубедить не удалось. Пришлось «плакать, колоться, но продолжать жрать кактус»
А чем csv плох? Если конечно нет требований к заранее подготовленным формулам и не нужно цветами играть.

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

Данные можно лить в csv используя генераторы (yield) и поток с блокировкой напрямую в файл.

Проблема с совместимостью обычно решается двумя кнопками «скачать для windows (cp1251, ';')» и «скачать для unix (utf8, ',')

Csv насколько я знаю идеально открывается во всех существующих экселях, опендокументах, спредшитах и в чем угодно вообще.
В отдельно взятом проблемном отчете никаких требований к формулам и цветам не было, csv строился очень быстро и без дополнительных манипуляций, но заказчик хотел только xlsx на выходе, никаких других вариантов.

CSV надо импортировать, что требует лишних действий пользователей, а часто ещё необходимо типы данных вручную указывать (текст и др.).

Не открывается он идеально (из личного опыта) выше писал комментарий, если импортировать в эксель из csv, то нужно правильно задавать форматы полей, ну и самое главнре в csv нельзя залить поля текста с переводами строки.

Все там можно в csv с переводом строки, в двойные кавычки многострочный текст и экранирование внутри

Формально да на практике:
"
Эксель убивает ведующие нули и приводит типы даже тогда, когда значение указано в кавычках. Делать так не надо, это ошибка. Но чтобы обойти эту проблему экселя, можно сделать небольшой «хак» — значение начать со знака «равно», после чего поставить в кавычках то, что необходимо передать без изменения формата.
У экселя есть спецсимвол «равно», который в CSV рассматривается как идентификатор формулы. То есть, если в CSV встретится =2+3, он сложит два и три и результат впишет в ячейку. По стандарту он это делать не должен.

И
и ещё много чего, статья — https://m.habr.com/company/mailru/blog/129476/
К сожалению приходилось ломать голову как экспортировать и импортировать, реально если подразумевать импорт в excel то универсального варианта не зависящего от настроек у пользователя просто нет.

У нас в системе тоже был подобный опыт, когда клиенту требовались большие отчеты со сложно-форматированной шапкой и разметкой. Мы тоже вынесли это в фоновые задачи, которые обрабатывались не php, а nodejs-скриптом с библиотекой exceljs.

Но это померкло в сравнении с задачей от другого клиента, которому потребовались фото-отчеты оформленные в формате PowerPoint'a. Вот тут пришлось подумать, но в итоге сделали по томуже принципу: nodejs с библиотекой officegen успешно смог осилить формирование pptx-файлов на 2-5 Gb.
Сталкивался с подобной задачей. Формирование больших экселей на PhpExcel приводило к кошмарному расходу RAM и занимало часы времени. Я изучил известные на то время альтернативы, и в итоге был вынужден создать свой велосипед.
Для этого был изучен формат .xlsx. Оказалось что это обычный архив с кучей xml файлов (данные, стили, настройки...), картинок и прочих вспомогательных файлов. Используя эти файлы как примеры, был создан собственный велосипед с набором необходимых функций, которые работал в сотни (!) раз быстрее и практически не расходовал память. Объем потребляемой памяти не зависил от объема данных.
Правильным выбором оказалось формирование xml файлов без всяких библиотек и готовых решений, а просто путем дозаписи строчек в файл. Именно это позволило не расходовать RAM как большинство других решений и не хранить сложные структуры данных в памяти. После формирования всех xml файлов и добавления вспомогательных статических файлов и изображений, они архивировались и получался готовый .xlsx файл.
Ничего удивительного. Вы создали частное решение которые быстрее универсального. Сам тоже так делал когда-то с docx, там тоже xml в архиве :)
Совсем другое дело doc…
В принципе получилось не так уж и специализированно. Там было и форматирование и формулы. Но было одно важное требование — листы и ряды можно было создавать только последовательно. Собственно за счет этого и удалось добиться огромной скорости и экономии ресурсов.

Отличная идея, спасибо, тоже

Я думаю для целей автора надо было использовать именно такой подход. Причем писать в файл кусками (батчами) например по 1000 строк. 500к строк скрипт наполнит мгновенно, даже на слабом компьютере. Тут проблема уже будет со скоростью подготовки этих данных.
Помню, когда делали выгрузку XML для яндекс маркета на стандартном шаред хостинге (ограничение 30 секунд и 32 мегабайта памяти) каталога с 15к номенклатуры, просто делали кусками по 500 номенклатур, а потом склеивали. Учитывая, что xlsx — это зип архив с XML, тут можно было бы применить тот же подход.
Пару лет назад решали точно такую же проблему. Есть сайт с огромным кол-вом товаров и каждый пользователь (гость) должен иметь возможность выгрузить себе любую конфигурацию. Правда у нас на тот момент максимальное кол-во было около 100К, но в случае с PhpExcel этого более чем достаточно что бы понять, что если одновременно 2 и более гостя запустят формирование прайса — сервер ляжет. Пробовали различные варианты, в том числе csv с дальнейшим конвертированием в xls, но у клиента прайс разрисован всеми цветами радуги (цвет как индикатор кол-ва таваров: много/мало/достаточно и т.д.) и помимо этого строки должны быть ссылками на товарные позиции, а так же подкатегории красиво оформлены бордерами и фоновыми заливками. В результате недельных поисков обнаружили идеальное решение — библиотека LibXL. Устанавливается как расширение для php, помимо этого можно использовать в С/С++/С#/Delphi проектах. Она платная, но 199$ это не цена для такой библиотеки.
К сожалению не панацея. Кушает память эта библиотека поменьше, но всё равно немало. При попытке сгенерировать файл размером в 70 Мб уходит около 2,5 Гб оперативки. Написал в саппорт — разводят руками, говорят, что ничего поделать не могут, такова специфика работы.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории