Comment générer un gros fichier Excel avec php?

je dois générer automatiquement le fichier Excel, le fichier Excel contient 15.000 à 50.000 lignes et 75 colonnes.

il est obtenu en utilisant un join et des formules dans Excel (68 formules Excel, il y a Si, IFERROR, COUNTIF ...).

j'ai Donc opté pour la bibliothèque PHPExcel, ça marche mais je dois attendre entre 1h15 et 1h30,j'ai minimisé le nombre de boucles. Après avoir lu beaucoup de documentation, j'ai remarqué que c'est le problème de PHPExcel.

si je pensais A propos de la possibilité de créer un tableau php avec toutes les formules Excel et les données extraites de ma base de données, une méthode qui prend beaucoup de temps et je ne suis pas sûr qu'elle fonctionnera.

alors je vous le demande, y a-t-il un autre moyen? Une méthode pour générer un type de classeur Excel avec beaucoup de données (avec 1 ou 2 millions de cellules) et des formules assez rapidement (dans les 15 minutes).

<?php       
require_once dirname(__FILE__) . '/Classes/PHPExcel.php';
require_once dirname(__FILE__) .  '/Classes/PHPExcel/IOFactory.php';

$path = "Lirefichierexcel/Trame.xlsx";

$objPHPExcel = new PHPExcel(); 
$sheet = $objPHPExcel-> getActiveSheet();

$rowCount =5;

$worksheetTitle = $sheet->getTitle();
$highestRow = $sheet->getHighestRow(); // e.g. 10
$highestColumn = $sheet->getHighestColumn(); // e.g 'F'
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
$nrColumns = ord($highestColumn) - 64;

$rowCount=5;

   $projet=$_REQUEST['projet'];
     try {
       //Etablir la connexxion
       include 'Proprietes.php';

       $connexion = new PDO("$driver:host=$host;dbname=$dbase", $user, $password);

       //Préparer la requête
       $requeteSQL="select * from $projet as a left join feuille_de_prix as b 
       on b.Liasse = a.Liasse and b.Item = a.Item order by 1";
        $requetePreparee= $connexion->prepare($requeteSQL);

       //Exécuter la requête
     $resultat = $requetePreparee->execute();

     //Tester le résultat
     if(! $resultat) die("<p>La lecture a échoué</>n");
    else {

   echo "<h1>Jointure entre le $projet et la feuille de prix </h1>";

       while($ligne=$requetePreparee->fetch()){

    $sheet->SetCellValue('F'.$rowCount, $ligne[4])
    ->SetCellValue('F'.$rowCount, $ligne[4])    

   $rowCount++;

    } 

       $worksheetTitle = $sheet->getTitle();
$highestRow = $sheet->getHighestRow(); // e.g. 10
$highestColumn = $sheet->getHighestColumn(); // e.g 'F'
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
$nrColumns = ord($highestColumn) - 64;

      for ($row = 5; $row <= $highestRow; ++ $row) {
    $row1=$row+1;
    $rowm1=$row-1;

       //AA4
    $sheet->setCellValue(
            'AA' . $row, '=..............')

//AB4
        ->setCellValue(
            'AB' . $row,'=..............')

}

}

echo date('H:i:s') , " Write to Excel2007 format" , PHP_EOL;
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save(str_replace('.php', '.xlsx', __FILE__));
echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', __FILE__) , PHP_EOL;
// Echo memory peak usage
echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , PHP_EOL;

// Echo done
echo date('H:i:s') , " Done writing file" , PHP_EOL;

     $connexion=null;

   }catch (PDOException $e) {
     print "Erreur !: " . $e->getMessage() . "<br/>";
     die();
    }

    ?>
8
demandé sur ROMANIA_engineer 2015-06-16 11:31:55

1 réponses

Utilisez BoxSpout.

c'est une bibliothèque PHP pour lire et écrire CSV et XLSX fichiers, rapidement et de manière évolutive. Contrairement à d'autres fichiers lecteurs ou auteur, il est capable de traiter de très gros fichiers tout en gardant l'utilisation de la mémoire très faible (moins de 10 MO). Voici quelques chiffres concernant les performances de Bec.

box spout reading and writing speeed

https://github.com/box/spout

23
répondu Faiz Rasool 2015-06-16 08:33:29