我正在使用 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() 显示正确的值。如果我然后保存文件withoutsetPreCalculateFormulas(false) 并再次读入文件, getCalculatedValue() 和 getOldCalculatedValue() 返回相同(不正确)的结果。这与 Mark 的解释一致,即如果不设置 setPreCalculateFormulas(false),则在保存时将重新计算值
但是,如果我保存文件withsetPreCalculateFormulas(false) (这似乎是正确的方法)并再次读取文件, getCalculatedValue() 返回不正确的结果, getOldCalculatedValue() 返回 0,这是错误的。
为什么保存后缓存的值会被清除?是否需要与 setPreCalculateFormulas(false) 一起应用一些其他设置?
PHPExcel 可以not加载电子表格文件时计算任何值。如果您显式调用单元格的值,它只会计算单元格值getCalculatedValue()
or getFormattedValue()
方法,或者默认情况下保存时(除非您使用 Writer 的setPreCalculateFormulas(false)
)...尽管使用自动调整列会强制在保存这些列中的任何单元格时重新计算,而不管任何其他设置如何。
MS Excel 通常会保存电子表格中所有公式单元格的计算值(除非明确禁用此功能),并且可以使用单元格的 getOldCalculatedValue() 方法在 PHPExcel 中读取该值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)