PHPExcel - 为什么 setTitle 如此耗时

PHPExcel - Why is setTitle so time-consuming

我正在创建一个 Excel-file/workbook 并使用 PHPExcel 计算工资。每个员工的计算都在单独的工作表中完成。

重命名工作表很好,但是太费时间了!

通过在代码中添加微秒时间戳,我发现测试服务器花费了 40-50 秒 (!)运行 这一行 150 次:

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

因此,当在网络服务器上进行计算时,服务器 "gives up" 并在完成工作簿之前给出 503 消息....

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

提前致谢!

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

 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,我看不出结果有什么不同。

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

这种情况下的解决方案是确保将 false 作为 setTitle().

的第二个参数传递

$foo->setTitle( 'foo title', false );

在此处查看方法的定义以获取更多信息:https://github.com/PHPOffice/PHPExcel/blob/1.8/Classes/PHPExcel/Worksheet.php