PHPExcel 创建电子表格的时间过长

PHPExcel takes unreasonably long to create spreadsheet

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

知道为什么这会终止我的脚本,或者有什么方法可以在合理的时间范围内完成它吗?

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

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

您也可以将其设置为默认工作簿样式,并且仅在 cells/ranges 不同的地方设置样式

遗憾的是,随着电子表格的增大,PHPExcel 生成它们的时间会越来越长。如果您认为每个电子表格 6.000 行是您需要支持的最大值,您可以优化当前代码以使其更快。

但是,如果您认为您可能必须生成更大的电子表格,那么您将达到 PHPExcel 的限制,我建议您查看专门为此用例构建的其他库,例如 Spout (https://github.com/box/spout ).您的代码将面向未来。