मुझे स्वचालित रूप से एक्सेल फ़ाइल जेनरेट करना है, एक्सेल फ़ाइल में 15.000 से 50.000 पंक्तियां और 75 कॉलम हैं।php के साथ एक बड़ी एक्सेल फ़ाइल कैसे उत्पन्न करें?
यह एक्सेल में शामिल होने और सूत्रों का उपयोग करके प्राप्त किया जाता है (68 एक्सेल फॉर्मूला, IF, IFERROR, COUNTIF ...) हैं।
इसलिए मैंने पुस्तकालय PHPExcel
का चयन किया, यह काम करता है लेकिन मुझे 1h15 से 1h30 के बीच प्रतीक्षा करना है, मैंने लूप की संख्या को कम किया है। बहुत सारे दस्तावेज पढ़ने के बाद, मैंने देखा कि यह PHPExcel की समस्या है।
यदि मैंने सभी एक्सेल सूत्रों और मेरे डेटाबेस से पुनर्प्राप्त डेटा के साथ एक php सरणी बनाने की संभावना के बारे में सोचा, तो एक विधि जो लंबे समय तक लेती है और मुझे यकीन नहीं है कि यह काम करेगा।
तो मैं आपसे पूछता हूं, क्या कोई और तरीका है? एक्सेल वर्कबुक प्रकार को बहुत सारे डेटा (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();
}
?>
यह वास्तव में अपने कोड पर निर्भर करता है, और आप एक बड़े स्प्रेडशीट पैदा कर रहे हैं .... PHPExcel तेजी से नहीं है, लेकिन आम तौर पर अपनी स्क्रिप्ट है कि होगा कोड करने के लिए तरीके हैं समग्र प्रदर्शन में सुधार ..... अपने कोड को देखे बिना, यह कहना मुश्किल है कि कैसे; लेकिन आपके विवरण के आधार पर .... पहले अपने डेटाबेस से बड़े सरणी न बनाएं, और फिर सरणी को PHPExcel पर लिखें .... PHPExcel पर लिखें जैसा कि आप डेटाबेस से पढ़ते हैं, और इससे आपको एक बड़ा प्रदर्शन सुधार मिलेगा –
आपके उत्तर के लिए बहुत बहुत धन्यवाद :) मैंने समय को कम करने के लिए एक लंबा समय खोजा और मुझे कुछ भी नहीं मिला ... मैं अपना कोड पहले संदेश में चिपकाता हूं। – Krokodile