PHPExcel - 为什么setTitle如此耗时

时间:2016-08-25 10:06:46

标签: php excel phpexcel

我正在创建一个使用PHPExcel进行工资计算的Excel文件/工作簿。每个员工的计算都在一个单独的工作表中完成。

重命名工作表可以正常工作,但它非常耗时!

通过在代码中加入微秒时间戳,我看到testserver花费40-50秒(!)运行此行150次:

$objPHPExcel->getActiveSheet()->setTitle($name);

因此,当在Web服务器上进行计算时,服务器"放弃"并在完成工作簿之前给出了503消息....

我尝试过使用最新版本的PHPExcel而没有任何改进。有没有人有更好的解决方案来重命名工作表?

提前致谢!

2 个答案:

答案 0 :(得分:0)

这可能不是一个好习惯,但在PHPExcel的Worksheet.php函数setTitle中注释掉了这一部分(第870-878行):

 if ($this->parent && $this->parent->getCalculationEngine()) {
            // New title
            $newTitle = $this->getTitle();
            $this->parent->getCalculationEngine()
                ->renameCalculationCacheForWorksheet($oldTitle, $newTitle);
            if ($updateFormulaCellReferences) {
                PHPExcel_ReferenceHelper::getInstance()->updateNamedFormulas($this->parent, $oldTitle, $newTitle);
            }
        }

做了150个setTitle动作,从45秒到0.03,我看不出结果的差异。

答案 1 :(得分:0)

我知道这个问题已有4个月了,但我必须在电子表格中导出数据时解决PHPExcel超时的问题,我发现除非被覆盖,否则std::make_shared会调用setTitle(),然后扫描工作表中的每个单元格以查看它是否是PHPExcel_ReferenceHelper::updateNamedFormulas()类型的单元格。这意味着如果您正在迭代工作表并为每个工作表设置标题,它将在不断增加的文档中扫描公式单元格。

此案例中的解决方案是确保将PHPExcel_Cell_DataType::TYPE_FORMULA作为false的第二个参数传递。

setTitle()

有关详细信息,请参阅方法的定义:https://github.com/PHPOffice/PHPExcel/blob/1.8/Classes/PHPExcel/Worksheet.php