【问题标题】:PHPExcel not recalulating and shows always the same valuePHPExcel 不重新计算并始终显示相同的值
【发布时间】:2023-03-26 22:20:01
【问题描述】:

我正在进行一个项目,我正在从一个 Excel 文档中读取值。使用 getCalculatedValue 函数时,它总是返回相同的值。我尝试了 getOldCalculatedValue 函数但没有成功。我在某处读到,如果您在重新计算该单元格的值之前清除缓存,将会很有帮助。有人可以用下面的代码解释我怎么能做到这一点吗?

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');  
$objPHPExcel = $objReader->load("test.xlsx");
$value1 = $objPHPExcel->getActiveSheet()->getCell('B1')->getCalculatedValue();
$value2 = $objPHPExcel->getActiveSheet()->getCell('D1')->getCalculatedValue();

【问题讨论】:

    标签: php phpexcel phpexcelreader


    【解决方案1】:

    当您第一次通过调用getCalculatedValue() 检索计算值时,PHPExcel(默认情况下)会缓存结果,因此后续调用不会重新计算,而只是返回缓存的值。

    这减少了在其他单元格公式中引用相同计算单元格时通常会发现的计算开销


    当您读取计算数据,然后更改单元格值然后重新计算时可能会出现问题,因此 PHPExcel 提供了允许您控制缓存的方法

    您可以更改默认行为,以便从不缓存计算结果,方法是使用以下任一方法禁用计算缓存:

    PHPExcel_Calculation::getInstance($objPHPExcel)->disableCalculationCache();
    

    或:

    PHPExcel_Calculation::getInstance($objPHPExcel)->setCalculationCacheEnabled(false);
    

    或者您可以随时通过调用以下命令刷新缓存:

    PHPExcel_Calculation::getInstance($objPHPExcel)->clearCalculationCache();
    

    请注意,getOldCalculatedValue() 方法用于检索 MS Excel 本身为单元格计算的最后一个值,而不是从 PHPExcel 中。不能保证以任何方式反映当前数据,因为可以禁用 MS Excel 执行公式计算;但有时对于引用外部文件或数据源的公式很有用。

    【讨论】:

    • 感谢马克的回复。我尝试了上述建议,但没有奏效。 excel 单元格中的值会根据我的输入值而变化,当我打开 excel 时,值是正确的。当我从脚本中读取它时,它一直都是一样的(并且值是错误的)。 $objPHPExcel = $objReader->load("test.xlsx"); PHPExcel_Calculation::getInstance($objPHPExcel)->setCalculationCacheEnabled(false); PHPExcel_Calculation::getInstance($objPHPExcel)->clearCalculationCache(); $value1 = $objPHPExcel->getActiveSheet()->getCell('B1')->getCalculatedValue();
    • 您能否提供一个表现出这种行为的公式示例?
    • 也许您正在使用 PHPExcel 不支持的函数。我已经解释了如何抑制或刷新计算缓存,编程行为;但是在不知道您的计算的具体细节或您所做的应该影响该计算的更改的情况下,我无法解释为什么您每次都得到相同的结果......通常我希望除非公式或基础数据已更改,但您不说您做了哪些更改
    • 在我的网站中,我有输入框,用户可以输入不同的值。这些值被插入到 excel 文档中的某些单元格中。输入后,我有一行单元格,每个单元格中使用 IF 函数进行计算,如下所示(示例): =IF(VALUE(F49)1, E33-F49-E57-E58-E60-E61+E59, 1)。我的目标是获得包含在行中所有这些单元格中的最大值。因此,在我从脚本 (B1) 中读取的单元格中,它的格式为:=MAX(D63:AF63)。
    • 这是我的代码:$objReader = PHPExcel_IOFactory::createReader('Excel2007'); $objPHPExcel = $objReader->load("test.xlsx"); $objPHPExcel->getActiveSheet() ->setCellValue('B3',$input1) ->setCellValue('B4',$input2); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save('test.xlsx'); $objPHPExcel = $objReader->load("test.xlsx"); $value1= $objPHPExcel->getActiveSheet()->getCell('B1')->getCalculatedValue();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2018-12-23
    相关资源
    最近更新 更多