2015-06-16 9 views
6

मुझे स्वचालित रूप से एक्सेल फ़ाइल जेनरेट करना है, एक्सेल फ़ाइल में 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(); 
    } 

    ?> 
+0

यह वास्तव में अपने कोड पर निर्भर करता है, और आप एक बड़े स्प्रेडशीट पैदा कर रहे हैं .... PHPExcel तेजी से नहीं है, लेकिन आम तौर पर अपनी स्क्रिप्ट है कि होगा कोड करने के लिए तरीके हैं समग्र प्रदर्शन में सुधार ..... अपने कोड को देखे बिना, यह कहना मुश्किल है कि कैसे; लेकिन आपके विवरण के आधार पर .... पहले अपने डेटाबेस से बड़े सरणी न बनाएं, और फिर सरणी को PHPExcel पर लिखें .... PHPExcel पर लिखें जैसा कि आप डेटाबेस से पढ़ते हैं, और इससे आपको एक बड़ा प्रदर्शन सुधार मिलेगा –

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद :) मैंने समय को कम करने के लिए एक लंबा समय खोजा और मुझे कुछ भी नहीं मिला ... मैं अपना कोड पहले संदेश में चिपकाता हूं। – Krokodile

उत्तर

19

बॉक्सस्पॉट का उपयोग करें।

यह पढ़ सकते हैं और CSV और XLSX फ़ाइलें लिखने, एक तेजी से और स्केलेबल तरह से करने के लिए एक PHP पुस्तकालय है। अन्य फ़ाइल पाठकों या लेखकों के विपरीत, यह को स्मृति उपयोग वास्तव में कम (10MB से कम) रखते हुए बहुत बड़ी फ़ाइलों को संसाधित करने में सक्षम है। स्पॉट के प्रदर्शन के संबंध में कुछ संख्याएं यहां दी गई हैं।

box spout reading and writing speeed

https://github.com/box/spout

+0

धन्यवाद आपके लिए फ़ेज़ रसूल उत्तर: पी मैंने स्पॉट का परीक्षण किया लेकिन मैं सूत्रों के बारे में दस्तावेज़ीकरण ठीक नहीं कर सकता, इस सूत्र को कैसे लिखूं? $ शीट -> सेटसेलवेल ('एम' $ पंक्ति, '= आईएफ (या (सीएनएन (एन'। $ पंक्ति। ') = 1, सीएनएम (एन' $ पंक्ति। ') = 2), 0,1 + CNUM (एम '$ पंक्ति।।')) '); – Krokodile

+0

@ क्रोकोडाइल आप PHP में गणना क्यों नहीं करते हैं और सेल में मान पेस्ट करते हैं? –

+0

यह तकनीक सबसे अच्छी है? – Krokodile

संबंधित मुद्दे