当我尝试从excel文件中提取信息时,我遇到了这个问题。这是我的情况,我收到了来自不同用户的34个Excel文件。
我正在使用PHP版本5从Excel文件中提取。我的脚本将循环访问每个文件,并根据工作表名称再次循环,最后根据单元格地址再次循环。
当用户输入单元格时出现问题。 = + A1表示用户将单元格值引用到另一个单元格,因为它与单元格A1具有相同的值。
当我在mysql中检查时(因为我将其保存以备将来使用)我从记录中发现特定单元格与从同一单元格但在不同excel文件中获得的另一条记录相同。我的意思是,因为我的PHP脚本将从一个文件循环到另一个文件,PHPExcel第一次读取例如单元格C3,其值为USD3,000.00,下一个文件PHPExcel可能会转到相同的单元格C3但是这次C3单元格包含一个引用单元格A1(“= + A1”公式)的公式,其值为USD5,000.00。
PHP脚本假设在mysql中记录USD5,000.00,但事实并非如此。我怀疑PHPExcel脚本在第一轮没有清除变量。我尝试过unset($ objPHPExcel)并销毁变量,但它仍然在发生。
我的编码很简单如下:
if(file_exists($inputFileName))
{
$inputFileType = PHPExcel_IOFactory::identify($inputFileName);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($inputFileName);
//to obtain date from FILE and store in DB for future comparison
$validating_date_reporting = $objPHPExcel->getSheet(0)->getCell('C10')->getValue();
$validating_date_reporting = PHPExcel_Style_NumberFormat::toFormattedString($validating_date_reporting,"YYYY-MMM-DD");
$validating_date_reporting = date('Y-m-d',strtotime($validating_date_reporting));
//first entry
$entry = mysql_query('INSERT INTO `'.$table.'`(`broker_code`, `date`, `date_from_submission`) VALUES("'.$broker_code.'","'.$reporting_date.'","'.$reporting_date.'")') or die(mysql_error());
foreach($cells_array as $caRef=>$sName)
{
foreach($sName as $sNameRef=>$cells)
{
$wksht_page = array_search($caRef, $sheetNameArray);
$cell_column = $wksht_page.'_'.$cells;
echo $inputFileName.' '.$caRef.' '.$cell_column.'<br>';
$value = $objPHPExcel->setActiveSheetIndexByName($caRef)->getCell($cells)->getCalculatedValue();
echo $value.'<br>';
if($value)
{
$isdPortal->LoginDB($db_periodic_submission);
$record = mysql_query('UPDATE `'.$table.'` SET `'.$cell_column.'` = "'.$value.'" WHERE broker_code = "'.$broker_code.'" AND date_from_submission = "'.$validating_date_reporting.'"') or die(mysql_error());
}
}
}
}
我真的希望你能在这里帮助我..
提前谢谢。
答案 0 :(得分:6)
PHPExcel也包含计算缓存,当您取消设置工作簿时不会清除它:必须使用以下方法手动清除它:
PHPExcel_Calculation::flushInstance();
或
PHPExcel_Calculation::getInstance()->clearCalculationCache();
您还可以完全禁用计算缓存(尽管如果您有很多公式引用包含其他公式的单元格,这可能会减慢速度):
PHPExcel_Calculation::getInstance()->setCalculationCacheEnabled(FALSE);
开始处理文件之前
这是因为目前PHPExcel使用单例作为计算引擎。在今年晚些时候切换到使用多重模式的路线图中,它将有效地为每个工作簿维护一个单独的缓存,从而缓解这个问题。
修改强>
请注意,简单地取消设置$ objPHPExcel不起作用。您需要在取消设置$ objPHPExcel之前分离工作表。
$objPHPExcel->disconnectWorksheets();
unset($objPHPExcel);
如开发人员文档的第4.3节所述。在这一点上你还应该添加PHPExcel_Calculation :: flushInstance();