PHPExcel - 从引用到另一个单元的单元格中获取的值未正确获取

时间:2012-02-04 11:29:43

标签: phpexcel

当我尝试从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());

                                                        }

                                                }

                                        }


                                    }

我真的希望你能在这里帮助我..

提前谢谢。

1 个答案:

答案 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();