【问题标题】:Wrong reference to cell in PHPExcelPHPExcel 中对单元格的错误引用
【发布时间】:2015-03-16 09:35:26
【问题描述】:

我正在开发基于 PHPExcel 库的导入器。

这段代码保存单元格供以后使用。

foreach ($this->importModel->currentAttributeNames as $columnLabel => $attribute) {
    $cell = $this->_sheet->getCell($columnLabel . $row->getRowIndex());
    $this->importModel->importModelAttributes[$attribute]->setDefaultValueCell($cell);         
}

$this->_sheet 包含有效的PHPExcel_Worksheet 对象的当前工作表。

保存的单元格包含有效的PHPExcel_Cell 对象。

后来我也尝试在foreach循环中使用它:

foreach ($this->importModel->importModelAttributes as $importModelAttribute) {
    var_dump($importModelAttribute->_defaultValueCell);

    ...
}

$importModelAttribute->_defaultValueCell->getValue() 返回正确的值,但getCoordinate() 返回此工作表中包含数据的最后一行的第一个单元格的坐标 (A11),但必须为 B7

完成了一些其他计算,它们取决于单元格的样式(在本例中为颜色),它还从A11 单元格返回样式。

出于测试和调试目的,我还尝试克隆单元对象,但没有成功。

【问题讨论】:

    标签: phpexcel


    【解决方案1】:

    PHPExcel 中的单元格集合对象将一个单元格(最后引用的)保留为活动单元格......您的 $cell 对象实际上是指向该一个活动单元格的指针。

    实际上,您对setDefaultValueCell($cell); 的调用会将单元格指针存储在$defaultValueCell 中,这将指向您进行调用时的正确单元格,但下一次迭代将调整指向的指针新的$cell 值,因为 tat 是新的“活动”单元格。

    您可以尝试使用“克隆”

    $cell = clone $this->_sheet->getCell($columnLabel . $row->getRowIndex());
    

    但您最好将单元格地址/坐标存储在 $defaultValueCell 中,然后使用

    foreach ($this->importModel->importModelAttributes as $importModelAttribute) {
        $cell = $this->_sheet->getCell($importModelAttribute->_defaultValueCell)
        ...
    }
    

    在你的第二个循环中

    【讨论】:

    • 感谢您的解释。我实际上考虑过存储坐标和图纸编号作为替代方案。如果我再次调用getCell($coordinate),它将从哪里加载?从缓存中还是会被再次处理?换句话说,它将如何影响性能?
    • 对 getCell() 的另一个调用将从缓存中重新加载该单元格(如果已缓存)并将其重置为活动单元格...这是多少性能开销取决于您的缓存'正在使用
    猜你喜欢
    • 2017-04-14
    • 2014-07-31
    • 2018-06-08
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多