Создание очень большой электронной таблицы с помощью таблицы PHPS - PullRequest
0 голосов
/ 07 июня 2018

Я проверяю, как PHPSpreadsheet работает с большими таблицами Excel.Первоначальные тесты показывают, что для большой электронной таблицы быстро истощается память.

Есть ли способ писать электронную таблицу постепенно?

У меня есть старый фрагмент кода, который я использовалдавно использовал для создания электронных таблиц из PHP.Он использует очень старый стандарт и должен быть обновлен.Но одним из преимуществ моего старого кода является то, что я мог записывать в файл по ходу дела, а не создавать все это в памяти, и в результате мог легко справиться с очень большой электронной таблицей без превышения предела памяти.

Можно ли сделать нечто подобное в PHPSpreadsheet?Я пытался читать документацию и искал разные форумы, но большинство ответов, похоже, просто «увеличивают доступную память».

Ответы [ 2 ]

0 голосов
/ 22 августа 2018

К сожалению, PHPExcel и PHPSpreadsheet не очень эффективны для больших файлов.

Ваши параметры довольно ограничены:

  • Продолжайте увеличивать лимит памяти
  • Данные чанка вотдельные таблицы
  • Откат к CSV (с использованием встроенных функций PHP)

Предложение по кэш-памяти от Maarten - хорошая идея, но по моему опыту я получил огромные затраты на скорость, которые полностью сводили на нет всепреимущество памяти.


Я бы предложил полностью отказаться от PHPSpreadsheet и попробовать коробка / носик

Он создан с учетом производительности.и обещает использовать менее 3 МБ памяти независимо от размера файла!Он не только эффективно использует память, но был примерно в 20-30 раз быстрее, чем PHPSpreadsheet.

Он имеет некоторые ограничения (поддерживаются только 3 формата файла, нет автоматической ширины столбца, нет номера столбца / форматирования строки), но я думаю,некоторые из этих недостающих функций запланированы, и на данный момент это был лучший вариант для меня при написании массивной электронной таблицы.

Примечание: я не связан с проектом

0 голосов
/ 07 июня 2018

В их документации есть тема на эту тему:

https://phpspreadsheet.readthedocs.io/en/latest/topics/memory_saving/#memory-saving

Вы можете хранить ячейки в кеше, например, в Redis ( из их документации ):

$client = new \Redis();
$client->connect('127.0.0.1', 6379);
$pool = new \Cache\Adapter\Redis\RedisCachePool($client);
$simpleCache = new \Cache\Bridge\SimpleCache\SimpleCacheBridge($pool);

\PhpOffice\PhpSpreadsheet\Settings::setCache($simpleCache);

Если вы используете Predis, вы можете использовать следующий репозиторий:

https://github.com/php-cache/predis-adapter

И использовать этот код:

$client = new \Predis\Client($yourParameters, $yourOptions);
$pool = new \Cache\Adapter\Predis\PredisCachePool($client);
$simpleCache = new \Cache\Bridge\SimpleCache\SimpleCacheBridge($pool);

\PhpOffice\PhpSpreadsheet\Settings::setCache($simpleCache);
...