我正在使用setReadDataOnly(true)读取XLS文件。读取对象将再次保存为新的Excel文件。不幸的是,有些单元格值计算不正确(这与小计公式上单元格上的计算错误有关)。如果我正确理解,XLS文件中的每个单元格都包含一个预先计算的值以及公式。如果我可以让PHPExcel在读取文件时不尝试计算公式(而只是按原样使用预先计算的值),我就可以解决这个问题。我认为setReadDataOnly(真)或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)保存文件setPreCalculateFormulas(这似乎是正确的方法)并再次读取文件,则getCalculatedValue()返回不正确的结果,getOldCalculatedValue()返回0,这是错误的。
为什么在保存后清除缓存的值?是否还有其他设置需要与setPreCalculateFormulas(假)一起应用?
发布于 2014-08-27 20:46:17
当加载电子表格文件时,PHPExcel不计算而不是计算任何值。它只在显式调用单元格的getCalculatedValue()
或getFormattedValue()
方法时,或者在保存时默认情况下计算单元格值(除非使用写入器的setPreCalculateFormulas(false)
).尽管使用autofit列强制对这些列中的任何单元格进行重新计算,但不考虑任何其他设置。
PHPExcel通常会在电子表格中保存所有公式单元格的计算值(除非此值被显式禁用),并且可以使用单元格的PHPExcel()方法在getOldCalculatedValue中读取该值。
https://stackoverflow.com/questions/25533090
复制相似问题