Как сгенерировать большой файл Excel с помощью php?


Мне нужно автоматически сгенерировать файл Excel, файл Excel содержит от 15 000 до 50 000 строк и 75 столбцов.

Он получен с помощью соединения и формул в Excel (68 формул Excel, есть IF, IFERROR, COUNTIF...).

Поэтому я выбрал библиотеку PHPExcel, она работает, но мне приходится ждать с 1 часа 15 минут до 1 часа 30 минут, я свел к минимуму количество циклов. Прочитав много документации, я заметил, что это проблема PHPExcel.

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

Поэтому я спрашиваю вас, есть ли другой способ? Метод для создания типа книги Excel с большим количеством данных (с 1 или 2 миллионами ячеек) и формулами довольно быстро (в течение 15 минут).

<?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();
    }

    ?>
Author: ROMANIA_engineer, 2015-06-16

1 answers

Используйте коробчатый желоб.

Это библиотека PHP для чтения и записи CSV и XLSX файлы, быстрым и масштабируемым способом. В отличие от других устройств чтения или записи файлов, он способен обрабатывать очень большие файлы, сохраняя при этом очень низкое использование памяти (менее 10 МБ). Вот несколько цифр, касающихся производительности носика.

box spout reading and writing speeed

Https://github.com/box/spout

 23
Author: Faiz Rasool, 2015-06-16 08:33:29