2014-10-24 2 views
4

Я пытаюсь экспортировать около 40 000 строк данных Mysql в PHP (Laravel4) с использованием библиотеки PHPExcel. Ниже мой код:Экспорт больших файлов в excel с помощью PHPExcel

($ patList представляет собой массив из столбцов результата)

set_time_limit (3000); 

$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp; 

$cacheSettings = array('memoryCacheSize' => -1); 

PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); 

$objPHPExcel = new PHPExcel(); 
$i = 1; 
$patList = $result[0]; 

for ($r = 0; $r < count($patList); $r++) { 

    $objPHPExcel->setActiveSheetIndex(0) 

     ->setCellValue("A$i", $patList[$r][0]) 
     ->setCellValue("B$i", $patList[$r][1]) 
     ->setCellValue("C$i", $patList[$r][2]) 
     ->setCellValue("D$i", $patList[$r][1]) 
     ->setCellValue("E$i", $patList[$r][2]) 
     ->setCellValue("F$i", $patList[$r][1]) 
     ->setCellValue("G$i", $patList[$r][2]) 
     ->setCellValue("H$i", $patList[$r][2]) 
     ->setCellValue("I$i", $patList[$r][1]) 
     ->setCellValue("J$i", $patList[$r][2]) 
     ->setCellValue("K$i", $patList[$r][5]); 
    $i++; 
} 

$objPHPExcel->getActiveSheet()->setTitle('Name of Sheet 1'); 

header('Content-Type: application/vnd.ms-excel'); 

header('Content-Disposition: attachment;filename="result.xls"'); 

header('Cache-Control: max-age=0'); 

ob_clean(); 

flush(); 

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 

$objWriter->save('php://output'); 

Приведенный выше код работает нормально, если есть 3-4 столбцы в Excel и 15000 строк. Однако, если я увеличу no. строк до 30 000 или нет. столбцов до 10, excel не генерируется.

+2

вы получаете какие-либо ошибки? Включено ли сообщение об ошибках? Убедитесь, что ваш скрипт не исчерпывает память, потому что вы сохраняете довольно большие переменные в памяти. – Bogdan

+1

Попробуйте установить 'ini_set ('memory_limit', '1024M');' или то, что вы считаете достаточным для сценария. – Bogdan

+1

Да, сейчас это работает! Он потреблял 228 МБ памяти, поэтому он терпел неудачу. Большое спасибо :) –

ответ

0
$cacheSettings = array('memoryCacheSize' => -1); 

неразумно .... Я даже не знаю, будет ли работать значение -1; но если это произойдет, это будет означать, что вы храните все в памяти и ничего в php: // temp

Значение memoryCacheSize сообщает потоку кэша, сколько данных должно храниться в памяти перед переключением данных в php: // temp; так

$cacheSettings = array('memoryCacheSize' => '8MB'); 

расскажет поток кэша использовать 8Мбы памяти, а затем, если дополнительные данные, необходимые для хранения использовать PHP: // темп вместо

+0

О, это полезно. Я увеличил размер кеша до 500M, но все же он был неудачным. Потому что самого ограничения памяти недостаточно. Итак, теперь, после того как я установил memory_limit в 500M или 1024M, он работает! –

Смежные вопросы