我正在创建一个使用PHPExcel进行工资计算的Excel文件/工作簿。每个员工的计算都在一个单独的工作表中完成。
重命名工作表可以正常工作,但它非常耗时!
通过在代码中加入微秒时间戳,我看到testserver花费40-50秒(!)运行此行150次:
$objPHPExcel->getActiveSheet()->setTitle($name);
因此,当在Web服务器上进行计算时,服务器"放弃"并在完成工作簿之前给出了503消息....
我尝试过使用最新版本的PHPExcel而没有任何改进。有没有人有更好的解决方案来重命名工作表?
提前致谢!
答案 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