【问题标题】:Ignoring calculated values when reading in Excel file with PHPExcel使用 PHPExcel 读取 Excel 文件时忽略计算值
【发布时间】:2014-08-27 17:07:31
【问题描述】:

我正在使用 setReadDataOnly(true) 读取 XLS 文件。读取的对象再次保存为新的 Excel 文件。不幸的是,某些单元格的值计算不正确(这与使用小计公式的单元格的计算错误有关)。如果我理解正确,XLS 文件中的每个单元格都包含一个预先计算的值以及公式。如果我可以让 PHPExcel 在读取文件时不尝试计算公式(而不是按原样使用预先计算的值),我可以解决这个问题。我认为 setReadDataOnly(true) 或 setPreCalculateFormulas(false) 可能会做到这一点,但事实并非如此。

其他信息

感谢 Mark 的解释,我调查了 getCalculatedValue() 和 getOldCalculatedValue() 之间的区别。我使用以下代码读取文件,然后再次将其写出:

$excel_reader = PHPExcel_IOFactory::createReaderForFile($file);
$excel_reader->setReadDataOnly(true);
$excel_obj_temp = $excel_reader->load($file);

// Test one of the values in question
$excel_obj_temp->setActiveSheetIndexByName("Form 11");
error_log("val:".$excel_obj_temp->getActiveSheet()->getCell("E36")->getCalculatedValue());
error_log("old_val:".$excel_obj_temp->getActiveSheet()->getCell("E36")->getOldCalculatedValue());

$new_file = "new_generated_name";

$excel_writer = new PHPExcel_Writer_Excel5($excel_obj_temp);
$excel_writer->setPreCalculateFormulas(false);
$excel_writer->save($unprotected_file);

在读取文件时,它会使用 getOldCalculatedValue() 显示正确的值。如果我随后保存文件 without setPreCalculateFormulas(false) 并再次读取文件,getCalculatedValue() 和 getOldCalculatedValue() 都会返回相同的(不正确的)结果。这与 Mark 的解释一致,即如果您不设置 setPreCalculateFormulas(false),则会在保存时重新计算值

但是,如果我改为保存文件 with setPreCalculateFormulas(false)(这似乎是正确的方法)并再次读取文件,getCalculatedValue() 返回不正确的结果,而 getOldCalculatedValue() 返回0,这是错误的。

为什么保存后会清除缓存的值?我需要与 setPreCalculateFormulas(false) 一起应用其他设置吗?

【问题讨论】:

    标签: phpexcel


    【解决方案1】:

    PHPExcel 在您加载电子表格文件时计算任何值。它只会在您显式调用单元格的 getCalculatedValue()getFormattedValue() 方法时计算单元格值,或者默认情况下在您保存时(除非您使用 Writer 的 setPreCalculateFormulas(false))...尽管使用自动调整列会强制在保存时重新计算无论其他设置如何,这些列中的任何单元格。

    MS Excel 通常会在电子表格中保存所有公式单元格的计算值(除非明确禁用),并且可以使用单元格的 getOldCalculatedValue() 方法在 PHPExcel 中读取此值。

    【讨论】:

    • 感谢马克的反馈,我添加了更多细节。知道为什么 getOldCalculatedValue() 返回 0?
    • PHPExcel 在您保存文件时不会保存 getOldCalculatedValue() 值,因此如果您使用 PHPExcel 保存文件然后重新加载它,则该值不再存在,您只需获得一个默认 0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多