【问题标题】:PHPExcel Fatal error: Uncaught exception 'Exception' with message 'Formula Error: Unexpected ,'PHPExcel 致命错误:未捕获的异常“异常”,消息“公式错误:意外,”
【发布时间】:2013-02-28 08:45:12
【问题描述】:

我在谷歌上搜索过,但找不到任何解决方案。
我想要做的是用 php 从报告中制作一个 excel5 导出文件。

每当我尝试平均次数时,我都会收到以下错误:

Fatal error: Uncaught exception 'Exception' with message 'myexcelsheet!F38 -> Formula Error: Unexpected ,'

这是给出错误的公式:

=SUM(F9:F36)/COUNTIF(F9:F36, "*" & "<>00:00:00" & "*")

单元格数据类型是时间。使用 COUNT 可以正常工作,但需要忽略 00:00:00 次。

这是包括:

require_once("PHPExcel/Classes/PHPExcel.php");
require_once("PHPExcel/Classes/PHPExcel/Writer/Excel5.php");
require_once 'PHPExcel/Classes/PHPExcel/Cell/AdvancedValueBinder.php';

整个错误:

Fatal error: Uncaught exception 'Exception' with message 'myexcelsheet!F38 -> Formula Error: Unexpected ,' in /path/to/PHPExcel/Classes/PHPExcel/Cell.php:293 Stack trace: #0 /path/to/PHPExcel/Classes/PHPExcel/Worksheet.php(702): PHPExcel_Cell->getCalculatedValue() #1 /path/to/PHPExcel/Classes/PHPExcel/Writer/Excel5/Worksheet.php(295): PHPExcel_Worksheet->calculateColumnWidths() #2 /path/to/PHPExcel/Classes/PHPExcel/Writer/Excel5.php(194): PHPExcel_Writer_Excel5_Worksheet->close() #3 /path/to/rep-functions.php(985): PHPExcel_Writer_Excel5->save('/path/t...') #4 /path/to/report.php(462): export_excel(Array, Array, 'report.ph...', Array, Array, Array) #5 {main} thrown in /path/to/PHPExcel/Classes/PHPExcel/Cell.php on line 293

这是我从 testFormula 函数中得到的

公式值为=SUM(F9:F36)/COUNTIF(F9:F36,"*" & "00:00:00" & "*") 期望值未知 解析器堆栈:- 大批 ( [0] => 数组 ( [类型] => 单元格参考 [值] => F9 [参考] => F9 ) [1] => 数组 ( [类型] => 单元格参考 [值] => F36 [参考] => F36 ) [2] => 数组 ( [类型] => 二元运算符 [价值] =>: [参考] => ) [3] => 数组 ( [type] => 函数 SUM() 的操作数计数 [值] => 1 [参考] => ) [4] => 数组 ( [类型] => 功能 [值] => 总和( [参考] => ) [5] => 数组 ( [类型] => 单元格参考 [值] => F9 [参考] => F9 ) [6] => 数组 ( [类型] => 单元格参考 [值] => F36 [参考] => F36 ) [7] => 数组 ( [类型] => 二元运算符 [价值] =>: [参考] => ) [8] => 数组 ( [类型] => 值 [值] => "*" [参考] => ) [9] => 数组 ( [类型] => 值 [值] => "00:00:00" [参考] => ) [10] => 数组 ( [类型] => 二元运算符 [价值] => & [参考] => ) [11] => 数组 ( [类型] => 值 [值] => "*" [参考] => ) [12] => 数组 ( [类型] => 二元运算符 [价值] => & [参考] => ) [13] => 数组 ( [type] => 函数 COUNTIF() 的操作数计数 [值] => 2 [参考] => ) [14] => 数组 ( [类型] => 功能 [值] => COUNTIF( [参考] => ) [15] => 数组 ( [类型] => 二元运算符 [价值] => / [参考] => ) ) 计算引擎错误:工作表!F38 -> 公式错误:意外, 评估日志: 大批 ( )

如果您需要更多信息,请告诉我。

提前致谢!

【问题讨论】:

    标签: exception excel-formula export-to-excel average phpexcel


    【解决方案1】:

    使用该函数调试计算引擎:

    function testFormula($sheet,$cell) {
        $formulaValue = $sheet->getCell($cell)->getValue();
        echo 'Formula Value is' , $formulaValue , PHP_EOL;
        $expectedValue = $sheet->getCell($cell)->getOldCalculatedValue();
        echo 'Expected Value is '  , ((!is_null($expectedValue)) ? $expectedValue : 'UNKNOWN') , PHP_EOL;
    
    
         PHPExcel_Calculation::getInstance()->writeDebugLog = true;
        $calculate = false;
        try {
            $tokens = PHPExcel_Calculation::getInstance()->parseFormula($formulaValue,$sheet->getCell($cell));
            echo 'Parser Stack :-' , PHP_EOL;
            print_r($tokens);
            echo PHP_EOL;
            $calculate = true;
        } catch (Exception $e) {
            echo 'PARSER ERROR: ' , $e->getMessage() , PHP_EOL;
    
            echo 'Parser Stack :-' , PHP_EOL;
            print_r($tokens);
            echo PHP_EOL;
        }
    
        if ($calculate) {
            try {
                $cellValue = $sheet->getCell($cell)->getCalculatedValue();
                echo 'Calculated Value is ' , $cellValue , PHP_EOL;
    
                echo 'Evaluation Log:' , PHP_EOL;
                print_r(PHPExcel_Calculation::getInstance()->debugLog);
                echo PHP_EOL;
            } catch (Exception $e) {
                echo 'CALCULATION ENGINE ERROR: ' , $e->getMessage() , PHP_EOL;
    
                echo 'Evaluation Log:' , PHP_EOL;
                print_r(PHPExcel_Calculation::getInstance()->debugLog);
                echo PHP_EOL;
            }
        }
    }
    

    您需要将工作表对象和单元格 ID 作为参数传递,它会生成有关词法分析器和解析器如何评估公式的详细日志

    【讨论】:

    • 我已经添加了这个功能,但我无法从中做出什么。
    • 输出在问题中。
    • S抱歉,函数中漏了一行
    • 好的,谢谢,我想我找到了问题所在。 [14] => 工作表!F38 -> 评估 COUNTIF( { 25569; 25569; 25569; 25569; 25569; 25569; 25569; 25569; 25569; 25569; 25569; 25569; 25569; 25569; 25569; 292;96; 6 25569; 25569; 25569; 25569; 25569; 25569; 25569; 25569,000081019; 25569; 25569 }, ">25569" ) 我在这里看到一个值是 25569,000081019 (这个值是 7 秒后)。
    • 看起来 25569,000081019 有逗号而不是小数点 - 内部需要美国/英国格式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2016-07-09
    相关资源
    最近更新 更多