web-dev-qa-db-fra.com

Construire un très grand tableur avec PHPSpreadsheet

Je teste le fonctionnement de PHPSpreadsheet avec des feuilles de calcul Excel volumineuses. Les tests initiaux indiquent que pour une grande feuille de calcul, la mémoire sera rapidement saturée.

Existe-t-il un moyen d’écrire progressivement le tableur?

J'ai un vieux morceau de code que j'utilise depuis longtemps pour créer des feuilles de calcul à partir de PHP. Il utilise un très vieux standard et doit être mis à jour. Mais un des avantages de mon ancien code est que je pouvais écrire dans un fichier tel quel, plutôt que de tout construire en mémoire, ce qui me permettait de gérer facilement un très grand tableur sans dépasser la limite de mémoire.

Peut-on faire quelque chose de similaire dans la feuille de calcul PHPS? J'ai essayé de lire la documentation et consulté plusieurs forums, mais la plupart des réponses semblent simplement "augmenter la mémoire disponible".

4
xtempore

Malheureusement, PHPExcel et PHPSpreadsheet ne sont pas très performants pour les gros fichiers.

Vos options sont assez limitées:

  • Continuez à augmenter la limite de mémoire
  • Couper les données dans des feuilles de calcul séparées
  • Retour au format CSV (utilisant les fonctions intégrées de PHP)

La suggestion de Maarten en matière de cache est une bonne idée, mais selon mon expérience, le coût de la vitesse était énorme, ce qui annulait complètement les avantages mémoire.


Ma suggestion serait de laisser tomber complètement la feuille de calcul PHPS et d’essayer box/spout

Il est conçu pour la performance et promet d’utiliser moins de 3 Mo de mémoire, quelle que soit la taille du fichier! Non seulement la mémoire est efficace, mais elle était environ 20-30 fois plus rapide que PHPSpreadsheet.

Il a quelques limitations (seulement 3 formats de fichier pris en charge, pas de largeur de colonne automatique, pas de format de chaîne/nombre de colonne), mais je pense que certaines de ces fonctionnalités manquantes sont prévues et que pour le moment c'était la meilleure option pour moi de traiter un tableur volumineux .

Note: je ne suis pas affilié au projet

6
andrewtweber

Il y a un sujet à ce sujet dans leur documentation:

https://phpspreadsheet.readthedocs.io/en/develop/topics/memory_saving/

Vous pouvez généralement avoir des cellules stockées dans le cache, par exemple dans Redis (de leur documentation):

$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);

Si vous utilisez Predis, vous pouvez utiliser le référentiel suivant:

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

Et utilisez ce code:

$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);
0
Maarten Manders