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

标签 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) 一起应用?

最佳答案

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

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

关于phpexcel - 使用PHPExcel读取Excel文件时忽略计算值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25533090/

相关文章:

javascript - 使用 PHPExcel 从 Excel 加载动态数据

php PHPExcel拆分Excel单元格坐标

codeigniter-2 - PHPExcel - 从 HTML 表格创建电子表格?

php - 未能删除缓冲区。没有要删除的缓冲区

php - 如何将大型 mysql 数据库表导出到 Excel

PHP SpreadSheet 找不到自动调整列宽的功能

php - 如何使用 php Excel 生成漂亮的 PDF?

PHPExcel 检查文件是否保存

PHPExcel 将文件保存在文件夹中或打开 excel

php - 如何在php中连接csv文件中的两列?