如何使用PHPExcel自动读取计算值?

如何使用PHPExcel自动读取计算值?,php,phpexcel,Php,Phpexcel,我有以下Excel文件: 我通过在每个单元格上循环并使用getCell(…)->getValue()获取值来读取它: 我从来没有在PHP中导入excel文件,所以这只是一个暗中操作 为什么不检查单元格中的第一个字符是否有“=” 如果为true,则getCalculatedValue() 如果不是getCell()getCalculatedValue()似乎适用于所有单元格,请参见上文getCalculatedValue()似乎可以完成您想要的正确工作。如果单元格包含FBV(基于公式的值),它将

我有以下Excel文件:

我通过在每个单元格上循环并使用
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
s
getCalculatedValue
现在已弃用并返回未格式化的结果。看起来
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);