PHPExcel花费了不合理的时间来创建电子表格

时间:2015-03-05 16:55:53

标签: php phpexcel

我正在使用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);

知道为什么这会杀死我的脚本,或者是在合理的时间范围内完成它的方法吗?

2 个答案:

答案 0 :(得分:2)

首先,您设置样式的两个调用可以合并为一个调用:

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

您也可以将其设置为默认工作簿样式,并仅为不同的单元格/范围设置样式

答案 1 :(得分:1)

不幸的是,随着电子表格的增长,PHPExcel将需要更长时间才能生成它们。如果您认为每个电子表格中有6.000行是您需要支持的最大值,那么您可以优化当前代码以使其更快。

但是,如果您认为可能需要生成更大的电子表格,那么您将达到PHPExcel的限制,我建议您查看专门为此用例构建的其他库,例如Spout({ {3}})。您的代码将面向未来。