首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHPExcel创建电子表格花费的时间不合理。

问PHPExcel创建电子表格花费的时间不合理。
EN

Stack Overflow用户
提问于 2015-03-05 16:55:52
回答 2查看 1K关注 0票数 3

我正在使用PHPExcel为我们的用户动态生成一些相当庞大的电子表格。在我们开始使用中等大小的电子表格之前,这似乎很好。我有一个用户正在尝试导出一个电子表格,它大约有6000行,有11列,这使我的脚本陷入困境。不幸的是,由于电子表格是非常动态的,因此无法提前生成它们,所以我不得不为每个用户请求执行此操作。

我已经运行了一些测试,似乎随着脚本的执行,将行添加到电子表格中的速度越来越慢。例如,我的错误日志记录报告了以下内容:

代码语言:javascript
复制
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

我调整了脚本,以使用以下代码将每行添加到电子表格中:

代码语言:javascript
复制
$sheet->fromArray($row_array, NULL, 'B' . $row_counter);

而不是单独添加每个单元,但没有看到任何增长的速度。

要创建每一行和每一行格式的总代码是:

代码语言:javascript
复制
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);

你知道为什么这会扼杀我的剧本,或者如何在合理的时间框架内完成它吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-05 17:14:36

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

代码语言:javascript
复制
$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
         )
    )
);

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

票数 2
EN

Stack Overflow用户

发布于 2015-03-05 17:43:31

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

但是,如果您认为您可能需要生成更大的电子表格,您将达到PHPExcel的极限,我建议您查看其他专门为该用例构建的库,如Spout (https://github.com/box/spout)。这样,您的代码将成为未来的证明。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28883380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档