Otomatik olarak Excel dosyası oluşturmalıyım, Excel dosyası 15.000 ila 50.000 satır ve 75 sütun içeriyor.PHP ile büyük bir Excel dosyası nasıl oluşturulur?
Excel'de bir birleştirme ve formüller kullanılarak elde edilir (68 Excel formülleri, IF, IFERROR, COUNTIF ... var).
PHPExcel
numaralı kitaplığı seçtim, işe yarıyor ama 1 saat 15 ile 1 saat arasında beklemek zorundayım, döngü sayısını en aza indirdim. Çok fazla belge okuduktan sonra, bunun PHPExcel'in problemi olduğunu fark ettim.
Tüm Excel formüllerini ve veritabanımdan alınan verileri içeren bir php dizisi oluşturma olasılığını düşündüğümde, uzun süren ve işe yaradığından emin olmadığım bir yöntem.
Sana soruyorum, başka bir yolu var mı? Çok hızlı bir şekilde (1 veya 2 milyon hücreli) ve formüllerle çok hızlı bir şekilde (15 dakika içinde) bir Excel çalışma kitabı türü oluşturmak için bir yöntem.
<?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();
}
?>
.... PHPExcel hızlı değil, ama olacak Senaryonu kodlamak için yollar genellikle vardır Genel performansınızı geliştirin ..... kodunuzu görmeden nasıl olduğunu söylemek zor; ancak açıklamanıza bağlı olarak .... önce veritabanından büyük diziler oluşturmayın ve sonra PHPExcel'e dizini yazın. Veritabanından okudukça PHPExcel'e yazın ve size büyük bir performans artışı sağlar. –
Cevabınız için çok teşekkür ederim :) Zamanı en aza indirgemek için uzun bir süre aradım ve hiçbir şey bulamadım ... Kodumu ilk mesaja yapıştırıyorum. – Krokodile