我有一个单元格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
分析器堆栈:-Array([0]=>Array([type]=>Cell Reference[value]=>D8[Reference]=>D8)[1]=>Array]=>单元格引用[value]=>E18[Reference]=>E18)[6]=>数组([type]=>二进制运算符[value]=>:[Reference]>>)[7]=>数组
计算值为0
评估日志:
任何人都知道为什么会发生这种情况。我看到文档中说SUMIF不应该有错误,而只能将SUMIFS重写为SUMPRODUCT,但在我的情况下,SUMIF导致了错误。
如果这会给任何人带来问题。我个人所做的是将MathTrig.php中的SUMIF函数更改为以下内容。在我的例子中,我想排除$array和$sum_array中的值"---"。如果值等于$checkVars中的值,它还会计算新数组$ar计数。将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;
}
}
它工作得很好。如果有人想把这篇文章写得更好,请告诉我。