2014-08-27 158 views
4

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

其他信息

多亏了马克的解释,我在我的情况调查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()将返回相同(不正确)的结果。这是内联与马克的解释,该值将保存,如果你不设置setPreCalculateFormulas(假)

但是,如果我不是文件保存 setPreCalculateFormulas(假)(这似乎是正确的方式重新计算)并再次读取文件,getCalculatedValue()返回不正确的结果,getOldCalculatedValue()返回0,这是错误的。

为什么在保存后清除缓存的值?是否有其他一些设置需要与setPreCalculateFormulas(false)一起使用?

回答

4

PHPExcel确实不是当您加载电子表格文件时计算任何值。如果您明确调用单元格的getCalculatedValue()getFormattedValue()方法,或者在保存时默认保存(除非您使用书写器的setPreCalculateFormulas(false)),但它只会计算单元格值,尽管使用自动调整列强制重新计算保存这些列中的任何单元格任何其他设置。

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

+0

感谢您的反馈马克,我添加了一些更多的细节。任何想法为什么getOldCalculatedValue()返回0? – BOENDAGGER 2014-08-28 09:06:53

+0

当您保存文件时,PHPExcel不会保存getOldCalculatedValue()值,所以如果您已经使用PHPExcel保存了一个文件然后重新加载它,那么该值不再存在,您只需获得默认值0 – 2014-08-28 09:22:03

相关问题