2015-06-16 10 views
6

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

    ?> 
+0

.... 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. –

+0

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

cevap

19

BoxSpout'u kullanın.

CSV ve XLSX dosyalarını hızlı ve ölçeklenebilir bir şekilde okumak ve yazmak için bir PHP kütüphanesidir. Diğer dosya okuyucular veya yazarlarının aksine, çok büyük dosyaları işlemek için bellek kullanımı gerçekten düşük (10MB'den az) tutarken. İşte emzik performansıyla ilgili birkaç sayı.

box spout reading and writing speeed gerçekten kod bağlıdır ve büyük bir elektronik tabloyu ürettiğini

https://github.com/box/spout

+0

Cevabınız için teşekkürler Rasool cevap: P Spout'u test ettim ama formüller hakkında daha iyi bir dokümantasyon, bu formülü nasıl yazacağım? $ sayfası -> setCellValue ('M' $ satır, '= IF (OR (CNUM (N'. $ Satır. ') = 1, CNUM (N'. $ Satır. ') = 2), 0,1 + şirket (M $ satır.. '))'); – Krokodile

+0

@Krokodile neden PHP'de hesaplama yapmıyorsunuz ve değeri hücreye yapıştırıyorsunuz? –

+0

Bu teknik en iyi nedir? – Krokodile

İlgili konular