PHPExcel,chunkReadFilter,计算单元
要读取xlsx大文件,我使用部分读取(chunkReadFilter),但如果文件位于引用文件开头单元格的公式单元格中,它将返回一个错误#N/a。我认为这是因为从文件中读取另一个数据块和访问公式单元格的权限不再存在。如何解决这个问题。我的代码示例如下:PHPExcel,chunkReadFilter,计算单元,filter,phpexcel,Filter,Phpexcel,要读取xlsx大文件,我使用部分读取(chunkReadFilter),但如果文件位于引用文件开头单元格的公式单元格中,它将返回一个错误#N/a。我认为这是因为从文件中读取另一个数据块和访问公式单元格的权限不再存在。如何解决这个问题。我的代码示例如下: $oExcel = new Excel(); $objReader = $oExcel->CreateObjectExcel2007(); for ($iList=0;$iList<$list_count;$i
$oExcel = new Excel();
$objReader = $oExcel->CreateObjectExcel2007();
for ($iList=0;$iList<$list_count;$iList++){
$iAllStringsTotal += ($row_start - 1);
$iAllStringsCurrentList = ($row_start - 1);
for($iStartRow = $row_start; $iStartRow <= $ExelInfo[$iList]['totalRows']; $iStartRow += $iChunkSize) {
$objReader = $oExcel->SetCreateReader();
$oChunkFilter = new chunkReadFilter();
$objReader->setReadFilter($oChunkFilter);
$oChunkFilter->setRows($iStartRow,$iChunkSize);
$objReader->setReadFilter($oChunkFilter);
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($files['path']);
$objPHPExcel->setActiveSheetIndex($iList);
$sFromCell = 'A'.$iStartRow;
$aData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,false,$sFromCell);
// free memory
unset($objPHPExcel);
unset($objReader);
unset($oChunkFilter);
// parse data
foreach ($aData as $sKey => $aValue) {
$iAllStringsCurrentList += 1;
$iAllStringsTotal += 1;
// this code parsing data
}
// real data rows
if (count($aData) < $iChunkSize) {
unset($aData);
break;
}
unset($aData);
}
}
$oExcel=new Excel();
$objReader=$oExcel->CreateObjectExcel2007();
对于($iList=0;$IListesteTreadFilter($oChunkFilter);
$oChunkFilter->setRows($iStartRow,$iChunkSize);
$objReader->setReadFilter($oChunkFilter);
$objReader->setReadDataOnly(true);
$objPHPExcel=$objReader->load($files['path']);
$objPHPExcel->setActiveSheetIndex($iList);
$sFromCell='A'.$iStartRow;
$aData=$objPHPExcel->getActiveSheet()->toArray(null、true、true、false、$sFromCell);
//空闲内存
未设置($objPHPExcel);
unset($objReader);
未设置($oChunkFilter);
//解析数据
foreach($sKey=>$aValue){
$IALLSTRINGSCURENTLIST+=1;
$IALLSTRINGSTOAL+=1;
//此代码用于解析数据
}
//实际数据行
if(计数($aData)<$iChunkSize){
未结算($阿达塔);
打破
}
未结算($阿达塔);
}
}
一种解决方案是不分块读取……如果您有一个单元格需要计算并且引用了其他单元格,那么它需要访问这些其他单元格来读取/计算其值。否则,您可以尝试使用显式调用getOldCalculatedValue()
,但这永远无法保证。此函数有帮助。Thx