PHPExcel SUMIF返回错误/未计算的公式


PHPExcel SUMIF Returns Wrong / Not Calculated Formula

我有一个单元格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;
 }
}

它工作得很好。如果有人想把这篇文章写得更好,请告诉我。