【问题标题】:PHPExcel - Value from a Cell referencing to another Cell Did Not Obtained ProperlyPHPExcel - 引用另一个单元格的单元格的值未正确获得
【发布时间】:2012-02-04 11:29:42
【问题描述】:

我在尝试从 Excel 文件中提取信息时遇到了这个问题。这是我的情况,我从不同的用户那里收到了 34 个 Excel 文件。

我使用 PHP 版本 5 从 Excel 文件中提取。我的脚本会循环每个文件,并根据工作表名称再次循环,最后根据单元格地址再次循环。

当用户输入一个单元格时出现问题,例如=+A1 表示用户将单元格值引用到另一个单元格,因为它与单元格 A1 具有相同的值。

当我签入 mysql 时(因为我保存了这些以供将来使用),我从特定单元格的记录中发现与从同一单元格但在不同 excel 文件中获得的另一条记录相同。我的意思是,由于我的 php 脚本将从一个文件循环到另一个文件,因此 PHPExcel 第一次读取例如具有 3,000.00 美元价值的单元格 C3 时,PHPExcel 的下一个文件可能会转到同一个单元格 C3 但这次C3 单元格包含一个引用单元格 A1 的公式(“=+A1”公式),其价值为 5,000.00 美元。

PHP 脚本假设以 5,000.00 美元的价格记录在 mysql 中,但它没有。我怀疑 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());

                                                        }

                                                }

                                        }


                                    }

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

提前谢谢你。

【问题讨论】:

    标签: phpexcel


    【解决方案1】:

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

    【讨论】:

    • PHPExcel_Calculation::getInstance($sheet->getParent())->clearCalculationCache();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    相关资源
    最近更新 更多