2010-10-08 8 views
4

J'utilise la bibliothèque PHPExcel pour générer des données Excel basées sur la base de données mysql. La requête MySql entraîne les 1 34 000 lignes. Et Excel prend en charge 65 536 lignes sur une feuille de calcul. Donc rendu logique commeÉchec de l'exportation PHPExcel pour les fichiers volumineux

 
foreach($result as $value) 
{ 
    $val = array_values($value); 

    if($rowscounter < 65000) 
    { 
     $objPHPExcel->addRow($val,$rowscounter); 
    } 
    else 
    { 
     $active_sheet++; 
     $objPHPExcel->createSheet(); 
     $objPHPExcel->setActiveSheetIndex($active_sheet); 
     $rowscounter = 1; 
    } 
    $rowscounter++; 
} 
// deliver header 
header("Content-Type: $mtype; charset=" . $objPHPExcel->sEncoding); 
header("Content-Type:application/octet-stream"); 
header("Content-Disposition: inline; filename=\"" . $filename . ".$ext\""); 

// Save it as an excel 2003 file 
$objWriter = IOFactory::createWriter($objPHPExcel,$objPHPExcel->sFileFormat); 
//echo "Peak memory usage: " . (memory_get_peak_usage(true)/1024/1024) . " MB";exit; 
$objWriter->save('php://output'); 

pour créer une nouvelle feuille de calcul après que 65000 enregistrements ont été atteints pour une feuille de travail.

Mais cela ne fonctionne pas; ne donne aucune sortie ou erreur. Au départ, je pensais que c'était à cause de la limite de la mémoire. Mais quand il fait écho, il montre la mémoire de pointe à 1400,5 Mo et j'ai fixé ma limite de mémoire jusqu'à 3500 Mo en utilisant ini_set('memory_limit', '3500M');

Pourriez-vous s'il vous plaît suggérer quelque chose ou une alternative?

+0

Pouvez-vous décrire les modifications que vous avez apportées à PHPExcel? Vous référencez des méthodes telles que $ objPHPExcel-> addRow() (que je m'attendrais à associer à une feuille de calcul plutôt qu'à un classeur) et des propriétés comme $ objPHPExcel-> sFileFormat qui ne font pas partie du code de la bibliothèque PHPExcel. –

+0

Avez-vous essayé le débogage pour déterminer s'il échoue dans la boucle foreach() ou lorsque vous essayez d'écrire le fichier? –

+0

Oui Mark, $ objPHPExcel-> addRow() est ma fonction qui n'est autre que uses -> getActiveSheet() -> setCellValueByColumnAndRow(); –

Répondre

2

Vous pouvez dépasser la limite de 65 000, à quoi définissez-vous la valeur initiale de $ rowscounter? 1 ou 0 (zéro)? La raison pour laquelle je demande que les résultats du tableau commence à l'index 0 (zéro), vous ajoutez la ligne, puis incrémenter le compteur après l'ajout. Donc, si vous démarrez le compteur à 0 (zéro) que vous pourriez avoir plus de lignes que ce que vous avez compté. De plus il vous manque une ligne dans l'instruction else, vous en boucle par une valeur, mais ne pas ajouter à la feuille

essayer cette

$rowscounter = 1; 

foreach($result as $value) 
{ 
    $val = array_values($value); 

    if($rowscounter < 65000) 
    { 
     $objPHPExcel->addRow($val,$rowscounter); 
    } 
    else 
    { 
     $active_sheet++; 
     $objPHPExcel->createSheet(); 
     $objPHPExcel->setActiveSheetIndex($active_sheet); 
     $rowscounter = 1; 

     // add missing row 
     $objPHPExcel->addRow($val,$rowscounter); 
    } 
    $rowscounter++; 
} 
// deliver header 
header("Content-Type: $mtype; charset=" . $objPHPExcel->sEncoding); 
header("Content-Type:application/octet-stream"); 
header("Content-Disposition: inline; filename=\"" . $filename . ".$ext\""); 

// Save it as an excel 2003 file 
$objWriter = IOFactory::createWriter($objPHPExcel,$objPHPExcel->sFileFormat); 
//echo "Peak memory usage: " . (memory_get_peak_usage(true)/1024/1024) . " MB";exit; 
$objWriter->save('php://output'); 

un exemple simple de ce que je suis en train d'expliquer, Si $ i est mis à 0 (zéro), la condition else n'est pas remplie. Vous aurez donc une rangée supplémentaire dans vos résultats. Si $ i est mis à 1, la condition else est remplie

$count = array(1,2,3,4,5,6,7,8,9,10); 
$i=1; // set this to 0 (zero) and test, set to 1 and test 

foreach($count as $cnt) { 
    if($i < 10) { 
     echo "If condition - Count value: ".$cnt." i value:".$i."<br />"; 
    } else { 
     echo "Else condition - Count value: ".$cnt." i value:".$i."<br />"; 
    } 
    $i++; 
} 
+0

Salut Phill, Oui, j'ai raté la ligne. Merci d'identifier une erreur logique. Maintenant le problème est de problème de mémoire. Comme cela prend trop de temps à afficher quoi que ce soit, il est difficile de déterminer la quantité exacte de mémoire pour cela. J'ai essayé d'assigner 35000M, mais toujours aucun effet. –

+0

Trouvé un fil intéressant au sujet de PHPExcel étant le problème pour la fuite de mémoire: http://phpexcel.codeplex.com/Thread/View.aspx?ThreadId=18404 il a une solution de contournement –