现在搜索了很长一段时间,但我遇到了以下问题。
我正在使用PHPexcel 1.8.0 使用以下代码读取电子表格:
$rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, TRUE);
到目前为止还可以。 但是一些电子表格包含外部引用的数据。 为此,我想使用" getOldCalculatedValue"。
如何组合" getOldCalculatedValue"与" rangeToArray" ?
或者" rangeToArray"不适合这个?
感谢您提供任何帮助或提示!
答案 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;
}