PHPexcel - getOldCalculatedValue和rangeToArray

时间:2014-11-14 08:39:58

标签: phpexcel

现在搜索了很长一段时间,但我遇到了以下问题。

我正在使用PHPexcel 1.8.0 使用以下代码读取电子表格:

$rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, TRUE);

到目前为止还可以。 但是一些电子表格包含外部引用的数据。 为此,我想使用" getOldCalculatedValue"。

如何组合" getOldCalculatedValue"与" rangeToArray" ?

或者" rangeToArray"不适合这个?

感谢您提供任何帮助或提示!

3 个答案:

答案 0 :(得分:0)

简单回答,你不能把两者结合起来

rangeToArray()是一个简单的方法,它不会尝试做任何聪明的事情,只是为了尽可能有效和快速地从工作表中返回数据

getOldCalculatedValue()用于非常特殊的情况,即使在那时也不保证是正确的,因为它检索MS EXcel本身为单元格计算的最后一个值,如果是,则不正确在这种情况下,MS Excel无法使用外部工作簿,或MS Excel公式评估被禁用。

从公式计算单元格值时,PHPExcel计算引擎应该使用getOldCalculatedValue()作为后备,如果找到外部引用,rangeToArray()将尝试使用此方法,但它不是' t perfect,特别是当嵌套深度嵌入其他单元格中引用的其他公式中时。

如果您知道单元格中的公式包含外部引用,则应直接对该单元格使用getOldCalculatedValue()

答案 1 :(得分:0)

我提出了以下解决方案。 也许并不完美,但它目前正在完成这项工作。感谢您的任何改进!

包含PHPExcel并上传并准备好excel文件后,我继续:

$sheet = $objPHPExcel->getSheet(0); 
$highestRow = $sheet->getHighestRow(); 

创建一个新数组来存储行的单元格值

$arr_row = array();

遍历行

for ($rownumber = 2; $rownumber <= $highestRow; $rownumber++){

$row = $sheet->getRowIterator($rownumber)->current();
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false);

然后遍历当前行的单元格

foreach ($cellIterator as $cell) {

使用公式

查找单元格
$cellcheck = substr($cell->getValue(),0,1);

if($cellcheck == '='){      
    $cell_content = $cell->getOldCalculatedValue();
}
else{
    $cell_content = $cell->getValue();
}

将单元格值添加到数组

array_push($arr_row,$cell_content);

关闭单元格循环

    }

此时我使用$arr_row进行进一步的计算和字符串格式化,最后将其插入到mysql表中。

关闭行循环

}

答案 2 :(得分:0)

我在Worksheet.php中的函数rangeToArray()中做了一些更改。 工作得很好!

public function rangeToArray($pRange = 'A1', $nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) {
    // Returnvalue
    $returnValue = array();
    //    Identify the range that we need to extract from the worksheet
    list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange);
    $minCol = PHPExcel_Cell::stringFromColumnIndex($rangeStart[0] -1);
    $minRow = $rangeStart[1];
    $maxCol = PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0] -1);
    $maxRow = $rangeEnd[1];

    $maxCol++;
    // Loop through rows
    $r = -1;
    for ($row = $minRow; $row <= $maxRow; ++$row) {
        $rRef = ($returnCellRef) ? $row : ++$r;
        $c = -1;
        // Loop through columns in the current row
        for ($col = $minCol; $col != $maxCol; ++$col) {
            $cRef = ($returnCellRef) ? $col : ++$c;
            //    Using getCell() will create a new cell if it doesn't already exist. We don't want that to happen
            //        so we test and retrieve directly against _cellCollection
            if ($this->_cellCollection->isDataSet($col.$row)) {
                // Cell exists
                $cell = $this->_cellCollection->getCacheData($col.$row);
                if ($cell->getValue() !== null) {
                    if ($cell->getValue() instanceof PHPExcel_RichText) {
                        $returnValue[$rRef][$cRef] = $cell->getValue()->getPlainText();
                    } else {
                        if ($calculateFormulas) 
                        { ##################################### CHANGED LINES
                            if(!preg_match('/^[=].*/', $cell->getValue()))
                            {
                                $returnValue[$rRef][$cRef] = $cell->getCalculatedValue(); # THE ORIGINAL CODE ONLY HAD THIS LINE
                            }
                            else
                            {
                                $returnValue[$rRef][$cRef] = $cell->getOldCalculatedValue();
                            }
                        } ##################################### CHANGED LINES
                        else 
                        {
                            $returnValue[$rRef][$cRef] = $cell->getValue();
                        }
                    }

                    if ($formatData) {
                        $style = $this->_parent->getCellXfByIndex($cell->getXfIndex());
                        $returnValue[$rRef][$cRef] = PHPExcel_Style_NumberFormat::toFormattedString(
                            $returnValue[$rRef][$cRef],
                            ($style && $style->getNumberFormat()) ?
                                $style->getNumberFormat()->getFormatCode() :
                                PHPExcel_Style_NumberFormat::FORMAT_GENERAL
                        );
                    }
                } else {
                    // Cell holds a NULL
                    $returnValue[$rRef][$cRef] = $nullValue;
                }
            } else {
                // Cell doesn't exist
                $returnValue[$rRef][$cRef] = $nullValue;
            }
        }
    }

    // Return
    return $returnValue;
}