我有一个单元格C13,其中有一个简单的测试公式= SUMIF(D8:D18,2,E8:E18)。 D8-> D18保持2 2并且D8:D18的值是硬编码的,不从另一个公式检索。 E8-> E18的范围均为1。在excel中,正确的值是2.但是当我使用以下简单代码调用PHPExcel时。
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
PHPExcel_Calculation::getInstance($objPHPExcel)->clearCalculationCache();
$objReader = $objPHPExcel->setActiveSheetIndexByName("TestSumIf");
$value = $objPHPExcel->getActiveSheet()->getCell('C13')->getCalculatedValue();
我得到$ value = 0.
公式值= SUMIF(D8:D18,2,E8:E18)
预期值为0
Parser Stack: - 数组([0] =>数组([类型] =>单元格参考[值] => D8 [参考] => D8)[1] =>数组([类型] =>单元格参考[ [数学] => D18 [参考] => D18)[2] =>数组([类型] =>二元运算符[值] =>:[参考] =>)[3] =>数组([type] => Value [value] => 2 [reference] =>)[4] =>数组([type] => Cell Reference [value] => E8 [reference] = > E8)[5] =>数组([type] => Cell Reference [value] => E18 [reference] => E18)[6] =>数组([type] =>二进制运算符[value] =>:[reference] =>)[7] =>数组([type] =>函数SUMIF的操作数计数()[value] => 3 [reference] =>) [8] =>数组([type] =>函数[value] => SUMIF([reference] =>))
计算值为0
评估日志:
任何人都可以了解为什么会发生这种情况。我已经看到文档说SUMIF应该没有错误,但只有SUMIFS可以重写为SUMPRODUCT,但在我的情况下,SUMIF导致错误。
答案 0 :(得分:0)
好吧,如果这对任何人造成问题。我个人所做的是将MathTrig.php中的SUMIF函数更改为以下内容。在我的情况下,我想要排除' ---'在我的$ array和$ sum_array中。如果值等于$ checkVars中的值,它还会计算新数组$ ar count。将if语句更改为您自己的规范。
public static function SUMIF($array,$criteria,$sum_array)
{
$array = PHPExcel_Calculation_Functions::flattenArray($array);
$sum_array = PHPExcel_Calculation_Functions::flattenArray($sum_array);
$arraySize = sizeof($array);
$arraySizeCount = 0;
$checkVars = array(18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75);
for($i = 0; $i < $arraySize;$i++)
{
if($array[$i] === '---')
{
unset($array[$i]);
unset($sum_array[$i]);
}
else if(in_array($array[$i], $checkVars))
{
$arraySizeCount++;
}
}
if(is_array($array) && is_array($sum_array) && trim($criteria)!="")
{
$result = 0 ;
for($i=0;$i<$arraySizeCount;$i++)
{
if(preg_match("/^</",$criteria))
{
$value = preg_replace("/^</","",$criteria);
$result += $array[$i] < $value ? $sum_array[$i]:0;
}
elseif(preg_match("/^>/",$criteria))
{
$value = preg_replace("/^>/","",$criteria);
$result += $array[$i] > $value ? $sum_array[$i]:0;
}
else
{
$value = $criteria;
$result += $array[$i] == $value ? $sum_array[$i]:0;
echo $result;
}
}
return $result ? $result:0;
}
}
完美无缺。如果有人有更好的写作方式,请告诉我。