我正在使用PHPExcel为我们的用户动态生成一些庞大的电子表格。这似乎很好用,直到我们开始处理中等规模的电子表格。我有一个用户试图导出一个大约有6000行和11列的电子表格,这让我的脚本崩溃了。不幸的是,由于电子表格非常动态,所以没有办法提前生成它们,因此我被迫为每个用户请求即时生成电子表格。
我进行了一些测试,发现随着脚本的进行,将行添加到电子表格中变得越来越慢。例如,以下内容是由我的错误日志报告的:
我已经调整了脚本,使用以下代码将每一行添加到电子表格中:
任何想法为什么这会导致我的脚本崩溃,或者有没有一种方法使其在合理的时间内完成?
我进行了一些测试,发现随着脚本的进行,将行添加到电子表格中变得越来越慢。例如,以下内容是由我的错误日志报告的:
1st set of 1000 rows completes 13.34 Seconds into the script
2nd set of 1000 rows completes 54.57 Seconds into the script
3rd set of 1000 rows completes 135.33 Seconds into the script
4th set of 1000 rows completes 250.60 Seconds into the script
5th set of 1000 rows completes 394.53 Seconds into the script
我已经调整了脚本,使用以下代码将每一行添加到电子表格中:
$sheet->fromArray($row_array, NULL, 'B' . $row_counter);
与逐个添加每个单元格不同,但是没有看到速度上的增加。
创建每行并进行格式化的总代码如下:
if($row_counter % 2 == 0){
$active_color = $even;}
Else{
$active_color = $odd;}
$sheet->getStyle('B' . $row_counter . ':' . chr($colspan_endletter) . $row_counter)->applyFromArray(
array('fill' => array(
'type' => PHPExcel_Style_Fill::FILL_SOLID,
'color' => array('argb' => $active_color)
),
'borders' => array(
'left' => array('style' => PHPExcel_Style_Border::BORDER_MEDIUM),
'right' => array('style' => PHPExcel_Style_Border::BORDER_MEDIUM)
)
)
);
$sheet
->getStyle('B' . $row_counter . ':' . chr($colspan_endletter) . $row_counter)
->getAlignment()
->setWrapText(true)
->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
任何想法为什么这会导致我的脚本崩溃,或者有没有一种方法使其在合理的时间内完成?