我正在使用PHPExcel为我们的用户即时生成一些非常庞大的电子表格.在我们开始使用中等大小的电子表格之前,这似乎很好用.我有一个用户试图导出一个包含11列的约6000行的电子表格,这使我的脚本陷于瘫痪.不幸的是,由于电子表格非常动态,因此无法提前生成它们,因此我不得不为每个用户请求即时执行此操作.
我已经进行了一些测试,随着脚本的进行,将行添加到电子表格的速度似乎越来越慢.例如,我的错误日志记录了以下内容:
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);
知道为什么这会杀死我的脚本,或者是一种在合理的时间内完成脚本的方法吗?
解决方法:
首先,您可以将两个用于设置样式的调用合并为一个调用:
$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)
),
'alignment' => array(
'wrap' => true,
'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER
)
)
);
您还可以将其设置为默认工作簿样式,并且仅为不同的单元格/范围设置样式