如何使用PHPExcel自动读取计算值?
我有以下Excel文件: 我通过在每个单元格上循环并使用如何使用PHPExcel自动读取计算值?,php,phpexcel,Php,Phpexcel,我有以下Excel文件: 我通过在每个单元格上循环并使用getCell(…)->getValue()获取值来读取它: 我从来没有在PHP中导入excel文件,所以这只是一个暗中操作 为什么不检查单元格中的第一个字符是否有“=” 如果为true,则getCalculatedValue() 如果不是getCell()getCalculatedValue()似乎适用于所有单元格,请参见上文getCalculatedValue()似乎可以完成您想要的正确工作。如果单元格包含FBV(基于公式的值),它将
getCell(…)->getValue()获取值来读取它:
我从来没有在PHP中导入excel文件,所以这只是一个暗中操作
为什么不检查单元格中的第一个字符是否有“=”
如果为true,则getCalculatedValue()
如果不是getCell()getCalculatedValue()似乎适用于所有单元格,请参见上文getCalculatedValue()
似乎可以完成您想要的正确工作。如果单元格包含FBV(基于公式的值),它将返回正确的值。如果不是,则将返回正常值。看起来getCalculatedValue()已被弃用。请尝试改用getFormattedValue() 如果您不确定单元格的内容(包括值或公式),
我建议您首先检查单元格是否有公式,然后相应地复制粘贴。getOldCalculatedValue()在这种情况下非常有用。以下是一个例子:
$code = $sheet->getCell('A'.$y)->getValue();
if(strstr($code,'=')==true)
{
$code = $sheet->getCell('A'.$y)->getOldCalculatedValue();
}
$objPHPExcel4->setActiveSheetIndex(0)
->setCellValue('A'.$l, $code);
对于大型数据集,getCalculatedValue()函数非常麻烦,需要大量内存才能正确执行。getCalculatedValue()将返回包含公式的单元格的计算值,或返回非公式单元格的实际值。getValue()将始终返回单元格的实际值,包括包含公式的单元格的公式。getFormattedValue()将以字符串形式返回公式单元格的计算值或非公式单元格的实际值,并应用任何数字格式掩码。至于getValue()返回公式的原因,请说明历史原因。在某种程度上,我计划引入getFormula()/setFormula()方法,弃用getCalculatedValue()并更改getValue()以返回计算值。。。但我需要在几个版本中逐步做到这一点,以允许向后兼容。我发现了一个原因,即getCalculatedValue()
确实不是默认值,这是好的:在我将其更改为getCalculatedValue()
之后,PHP进程在处理3MB Excel时总是内存不足,因为有太多的计算,大概是使用1..65535的VLOOKUPs。但是,由于我可以选择是否计算每个单元格,我可以对一张表进行“智能计算”,例如计算简单的SUM
s,但不能计算资源密集型VLOOKUP
sgetCalculatedValue
现在已弃用并返回未格式化的结果。看起来getFormattedValue
可能是要使用的,但这取决于用户的需要。在我的情况下,Not getCalculatedValue和getFormattedValue以及getOldCalculatedValue()可以工作,并引发公式错误:使用getCalculatedValue()时总是出现意外错误
可能是带前导零的数值的自动转换。例如'0600'将被计算为“600”,而PHP/数据库端需要字符串“0600”。因此,我首先使用getValue()
获取单元格的内容,然后通过前导“=”识别方程,通过getCalculatedValue()获取它们的计算值
PHPExcel
现在已被PhpSpreadsheet
取代,我正在使用PHPExcel 1.7.8
,看起来它可以自动获取公式值,而无需做任何特殊操作,我今天在我的开发机器上对它进行了测试。即便如此,一位客户报告说,对他来说,这不起作用,所以我正在等待,看看到底是什么情况不起作用。配方的类型?Excel文件的类型?我们会看到,现在,奇怪的是,它只是工作。更新:我正在使用$sheet->rangeToArray
方法,这就是为什么!PHPExcel库有一个函数来解决这个问题,它屏蔽了=符号。getValue()调用会返回允许您的解决方案工作的计算结果,但正如Mark Baker在对Edward Tanquiy的评论中所回答的,正确的函数确实存在。
...->getCell($columnAsLetters.$row)->getCalculatedValue();
$code = $sheet->getCell('A'.$y)->getValue();
if(strstr($code,'=')==true)
{
$code = $sheet->getCell('A'.$y)->getOldCalculatedValue();
}
$objPHPExcel4->setActiveSheetIndex(0)
->setCellValue('A'.$l, $code);