Size: a a a

2021 March 15

K

Kiss My Backend in symfony
Если я правильно понимаю, то это сработает только с xls, т.к. там формат XML'подобный. А потом, следовательно, конвертировать в xlsx. Так?
источник

D

Dmitry in symfony
да, попробовать так
источник

MG

Michael Garifullin in symfony
Kiss My Backend
Если я правильно понимаю, то это сработает только с xls, т.к. там формат XML'подобный. А потом, следовательно, конвертировать в xlsx. Так?
да как то так... вообще чоб тебе сразу csv не отдавать? но помню там был упрощенный формат для экселя в виде не сложноного xml
источник

DM

Daria Motorina in symfony
Kiss My Backend
Простите, вопрос не совсем по теме фреймворка.
Какой самый быстрый вариант конвертации данных из бд (Массива или коллекции) в XLSX?
Я работал с PhpSpreadsheet. Он прожорливый и крайне медленный.
Работал с конвертацией данных предварительно в csv, а потом в конвертацию csv -> xlsx через отдельный сервис с поднятым serverless libreOffice. Было намного лучше, Но всё равно с большим объёмом данных было тяжеловато.

Какие варианты ещё могут быть? Куда смотреть?

Допустим нужно сделать эксельку в миллион строк (предел эксельки). Как это рекомендуется делать? Очереди, к сожалению, под запретом. Ответ должен приходить в рантайме.

Что-то подсказывает мне, что надо избежать прослойки в виде пхп и вставить более эффективную прослойку. На перле, вроде, быстрее работало раньше это. Но это было давно и неправда.
https://github.com/box/spout
Когда-то Валентин упоминал эту либу как менее ресурсожрущую
источник

R

Roman in symfony
SPOUT да, работает на временных файлах и максимум 3mb жрет
источник

K

Kiss My Backend in symfony
Michael Garifullin
да как то так... вообще чоб тебе сразу csv не отдавать? но помню там был упрощенный формат для экселя в виде не сложноного xml
Я бы двумя руками за CSV, но клиентам не особо нравится разделители использовать. И почему-то это стало блокирующим фактором для этого решения.
источник

MG

Michael Garifullin in symfony
Roman
SPOUT да, работает на временных файлах и максимум 3mb жрет
угуг похоже на то я кажется использовал http://faisalman.github.io/simple-excel-php/ но это было много веков назад
источник

K

Kiss My Backend in symfony
Благодарю, сейчас бенчмарки сделаю и все варианты буду тестировать, потом скину сюда.
источник

R

Roman in symfony
ну вот SPOUT мы для генерации реестров используем для проекта с мтс, отрабатывает отлично, но там сотни тысяч записей, правда
источник

K

Kiss My Backend in symfony
Ну, миллион это критическое, конечно, значение (лимит просто экселя). В целом будет среднее значение, насколько я помню, около 200-400 тысяч.
источник

R

Roman in symfony
тогда SPOUT хорошо будет. А если из базы (pgsql), то можно с небольшим скриптом почти напрямую генерить xlsx
источник

R

Roman in symfony
на перле был скрипт
источник

MG

Michael Garifullin in symfony
Roman
на перле был скрипт
нуда лучше притащить перл чем очереди
источник

R

Roman in symfony
так на сервере перл все равно есть 🙂
источник

MG

Michael Garifullin in symfony
источник

MG

Michael Garifullin in symfony
ну собственно если без очередей
твоя задача максимально упростить генерацию
что бы быстренький запрос в бд
быстро гидрировался в массивчик и шаблонизировался в xml
с надеждой что это вся муть уложиться в таймаут
источник

D

Dmitry in symfony
https://gitlab.com/DerLinkshaender/csv2xlsx
вот вообще бинарник можно сделать
источник

MG

Michael Garifullin in symfony
источник

D

Dmitry in symfony
хз, думаю лучше будет поднять там k8s под это дело, чтобы масштабировалося
источник

JK

Jeka Kovtun in symfony
Michael Garifullin
ну собственно если без очередей
твоя задача максимально упростить генерацию
что бы быстренький запрос в бд
быстро гидрировался в массивчик и шаблонизировался в xml
с надеждой что это вся муть уложиться в таймаут
Можно потоком отдавать.
И собственно генерить потоком.
Читаем БД пачками, сериализуем пачку и выплёвываем в StreamedResponse

Так и timeout не наступит, и память можно после пачки чистить. В итоге хоть гигабайтами плевать можно.

Конкретную реализацию не подскажу, долго код искать, на старом проекте так генерил большие CSV.
источник