2010-10-08 2 views
4

Я использую библиотеку PHPExcel для генерации данных excel на основе базы данных mysql. Результаты запроса MySql составляют 1,34,000 строк. И Excel поддерживает 65 536 строк на одном листе. Сделанная таким образом логика:Ошибка экспорта PHPExcel для больших файлов

 
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'); 

для создания нового листа после достижения 65000 записей для одного wohe-листа.

Но это не сработает; не выдавая никаких результатов или ошибок. Первоначально я думал об этом из-за ограничения памяти. Но при повторном воспроизведении он показывает максимальную память до 1400,5 МБ, и я установил ограничение на память до 3500 МБ, используя ini_set('memory_limit', '3500M');

Не могли бы вы предложить что-нибудь или любую альтернативу?

+0

Можете ли вы изложить изменения, внесенные вами в PHPExcel? Вы ссылаетесь на такие методы, как $ objPHPExcel-> addRow() (которые я ожидаю быть связанными с листом, а не с книгой) и такими свойствами, как $ objPHPExcel-> sFileFormat, которые не являются частью кода библиотеки PHPExcel. –

+0

Вы пробовали отладку, чтобы определить, не работает ли она в цикле foreach() или при попытке записать файл? –

+0

Да Mark, $ objPHPExcel-> addRow() - моя функция, которая ничего не использует -> getActiveSheet() -> setCellValueByColumnAndRow(); –

ответ

2

Возможно, вы превысили предел 65 000, что вы установили начальное значение $ rowscounter? 1 или 0 (ноль)? Причина, по которой я спрашиваю, что результаты массива начинаются с индекса 0 (ноль), вы добавляете строку, а затем увеличиваете счетчик после добавления. Поэтому, если вы начинаете счетчик с 0 (ноль), чем у вас может быть больше строк, которые вы подсчитали. Также отсутствуют строки в операторе еще, вы цикл по значению, но не добавляйте его к листу

попробовать это

$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'); 

простой пример того, что я пытаюсь объяснить, если $ i установлено в 0 (ноль), условие else не выполняется. Таким образом, у вас будет дополнительный ряд результатов. Если $ i установлено в 1, выполняется условие else

$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

Привет, Фил, Да, я пропустил ряд. Благодаря выявлению логической ошибки. Теперь проблема связана с памятью. Поскольку для отображения чего-либо слишком много времени, его трудно определить точный объем памяти для него. Я попытался назначить 35000M, но все равно никакого эффекта. –

+0

Обнаружена интересная тема о том, что PHPExcel является проблемой утечки памяти: http://phpexcel.codeplex.com/Thread/View.aspx?ThreadId=18404 У этого есть обходной путь –