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

BOE*_*GER 5 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);
Run Code Online (Sandbox Code Playgroud)

读取文件时,它使用getOldCalculatedValue()显示正确的值.如果我在没有 setPreCalculateFormulas(false)的情况下保存文件并再次读取文件,则getCalculatedValue()和getOldCalculatedValue()都返回相同(不正确)的结果.这符合Mark的解释,如果你没有设置setPreCalculateFormulas(false),将在保存时重新计算值

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

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

Mar*_*ker 6

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

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