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

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

任何想法为什么这会导致我的脚本崩溃,或者有没有一种方法使其在合理的时间内完成?

1
如果您不应用格式,会发生什么? - cmorrissey
1
你说你不能提前准备它们,但是你能否在后台创建它们呢?如果你使用每分钟触发一次的cron,并且生成需要几分钟时间,那么用户只需要等待五分钟左右,然后你可以自动发送电子邮件给他们,以确保他们知道它已经可用。 - halfer
2个回答

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

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

当我停止对每一行进行格式化时,我们在30秒内完成了整个工作表。谢谢。 - June Lewis

1

很不幸,随着你的电子表格越来越大,PHPExcel 生成电子表格的时间会越来越长。如果你认为每个电子表格最多只需要支持6,000行,那么你可以优化当前代码以使其更快。

然而,如果你认为可能需要生成更大的电子表格,你将达到 PHPExcel 的极限,我建议你查看其他专门为此用例构建的库,例如 Spout(https://github.com/box/spout)。这样做将使你的代码具备未来的可扩展性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接