使用PHPExcel读取Excel文件时忽略计算值

时间:2014-08-27 17:07:32

标签: phpexcel

我正在使用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()显示正确的值。如果我然后保存文件没有 setPreCalculateFormulas(false)并再次读取文件,则getCalculatedValue()和getOldCalculatedValue()都返回相同(不正确)的结果。这符合Mark的解释,如果你没有设置setPreCalculateFormulas(false),将在保存时重新计算值

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

为什么保存后会清除缓存的值?我需要应用setPreCalculateFormulas(false)吗?

1 个答案:

答案 0 :(得分:6)

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

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