Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 4 phpexcel、laravel公式在加载的文件上不起作用_Laravel 4_Phpexcel - Fatal编程技术网

Laravel 4 phpexcel、laravel公式在加载的文件上不起作用

Laravel 4 phpexcel、laravel公式在加载的文件上不起作用,laravel-4,phpexcel,Laravel 4,Phpexcel,我有一个测试excel文件,我试图更新一个单元格并重新计算结果,但它不起作用?甚至通过该单元格上的接口显式设置公式 $prevI11 = $reader->getActiveSheet()->getCell('I11')->getCalculatedValue(); $reader->getActiveSheet()->setCellValue('I11','=G11'); $reader->getActiveSheet()->setCellValue

我有一个测试excel文件,我试图更新一个单元格并重新计算结果,但它不起作用?甚至通过该单元格上的接口显式设置公式

$prevI11 = $reader->getActiveSheet()->getCell('I11')->getCalculatedValue();

$reader->getActiveSheet()->setCellValue('I11','=G11');
$reader->getActiveSheet()->setCellValue('G11',89.0);
$newformulaI11 = $reader->getActiveSheet()->getCell('I11')->getValue();
$newI11 = $reader->getActiveSheet()->getCell('I11')->getCalculatedValue();

dd($prevI11.'|'.$newformulaI11.'|'.$newI11);
I11的excel文件中的初始值为-2
结果是string8 2 |=G11 | 2,这显然只是加载文件中的原始值。默认情况下,PHPExcel缓存计算结果,以便在多次请求同一单元格的计算值时不需要重新计算

这意味着,如果您在本例中检索单元格I11的计算值,然后更改会影响计算的单元格的值并再次检索计算值,则您将从缓存中检索以前的结果,而不是重新计算它

可以使用禁用此缓存行为

PHPExcel_Calculation::getInstance($reader)->disableCalculationCache();
或在任意点使用刷新缓存

PHPExcel_Calculation::getInstance($reader)->clearCalculationCache();
编辑

作为一种测试方法,PHPExcel计算引擎具有内置调试器:

// Create new PHPExcel object
$objPHPExcel = new PHPExcel();

// Add some data
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('G11', 2)
            ->setCellValue('I11', '=G11');

$objPHPExcel->getActiveSheet()->setTitle('Simple');


function testFormula($sheet, $cell) {
    $formulaValue = $sheet->getCell($cell)->getValue();
    echo 'Formula Value is ' , $formulaValue , EOL;
    $expectedValue = $sheet->getCell($cell)->getOldCalculatedValue();
    echo 'Expected Value is '  , ((!is_null($expectedValue)) ? $expectedValue : 'UNKNOWN') , EOL;

    $calculate = false;
    try {
        $tokens = PHPExcel_Calculation::getInstance($sheet->getParent())
            ->parseFormula($formulaValue, $sheet->getCell($cell));
        echo 'Parser Stack :-' , EOL;
        print_r($tokens);
        echo EOL;
        $calculate = true;
    } catch (Exception $e) {
        echo 'PARSER ERROR: ' , $e->getMessage() , EOL;

        echo 'Parser Stack :-' , EOL;
        print_r($tokens);
        echo EOL;
    }

    if ($calculate) {
        try {
            $cellValue = $sheet->getCell($cell)->getCalculatedValue();
            echo 'Calculated Value is ' , $cellValue , EOL;

            echo 'Evaluation Log:' , EOL;
            print_r(PHPExcel_Calculation::getInstance($sheet->getParent())
                ->getDebugLog()->getLog());
            echo EOL;
        } catch (Exception $e) {
            echo 'CALCULATION ENGINE ERROR: ' , $e->getMessage() , EOL;

            echo 'Evaluation Log:' , EOL;
            print_r(PHPExcel_Calculation::getInstance($sheet->getParent())
                ->getDebugLog()->getLog());
            echo EOL;
        }
    }
}


$sheet = $objPHPExcel->getActiveSheet();
PHPExcel_Calculation::getInstance($objPHPExcel)
    ->getDebugLog()->setWriteDebugLog(true);

testFormula($sheet,'I11');


$objPHPExcel->setActiveSheetIndex(0)
    ->setCellValue('G11', 89.0);

PHPExcel_Calculation::getInstance($objPHPExcel)
    ->clearCalculationCache();

testFormula($sheet,'I11');
在没有清除缓存的行的情况下运行此命令,我得到以下输出

Formula Value is =G11
Expected Value is UNKNOWN
Parser Stack :-
Array
(
    [0] => Array
        (
            [type] => Cell Reference
            [value] => G11
            [reference] => G11
        )

)

Calculated Value is 2
Evaluation Log:
Array
(
    [0] => Testing cache value for cell Simple!I11
    [1] => Simple!I11 => Evaluating Cell G11 in current worksheet
    [2] => Simple!I11 => Evaluation Result for cell Simple!G11 is a floating point number with a value of 2
)

Formula Value is =G11
Expected Value is UNKNOWN
Parser Stack :-
Array
(
    [0] => Array
        (
            [type] => Cell Reference
            [value] => G11
            [reference] => G11
        )

)

Calculated Value is 2
Evaluation Log:
Array
(
    [0] => Testing cache value for cell Simple!I11
    [1] => Retrieving value for cell Simple!I11 from cache
)
显示第二次检索单元格I11的计算值时,它不会重新计算,而是检索缓存的值

有了清除缓存的线路,我就可以

Formula Value is =G11
Expected Value is UNKNOWN
Parser Stack :-
Array
(
    [0] => Array
        (
            [type] => Cell Reference
            [value] => G11
            [reference] => G11
        )

)

Calculated Value is 2
Evaluation Log:
Array
(
    [0] => Testing cache value for cell Simple!I11
    [1] => Simple!I11 => Evaluating Cell G11 in current worksheet
    [2] => Simple!I11 => Evaluation Result for cell Simple!G11 is a floating point number with a value of 2
)

Formula Value is =G11
Expected Value is UNKNOWN
Parser Stack :-
Array
(
    [0] => Array
        (
            [type] => Cell Reference
            [value] => G11
            [reference] => G11
        )

)

Calculated Value is 89
Evaluation Log:
Array
(
    [0] => Testing cache value for cell Simple!I11
    [1] => Simple!I11 => Evaluating Cell G11 in current worksheet
    [2] => Simple!I11 => Evaluation Result for cell Simple!G11 is a floating point number with a value of 89
)

显示缓存已清除,并且计算引擎被迫重新计算公式,同时考虑到单元格G11的新值,该值没有帮助。将disableCalculationCache放入,然后将clearCalculationCache放入所有可能的组合中-不更改公式单元格-始终为旧值-还有一件事-如果结果单元格为空,而不是在原始excel中使用,则计算有效!这会将excel文件上的任何工作呈现为模板-无用…这仅适用于新的phpexcel工作表,不适用于加载的excel占用的单元格,Sorry PHPExcel对象既不知道也不关心它是作为新的电子表格创建的,还是从文件加载的。事实证明,将结果移动到未占用的单元格有效,而在已占用的单元格上无效。这不是真正的争论