Laravel 4 phpexcel、laravel公式在加载的文件上不起作用
我有一个测试excel文件,我试图更新一个单元格并重新计算结果,但它不起作用?甚至通过该单元格上的接口显式设置公式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
$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对象既不知道也不关心它是作为新的电子表格创建的,还是从文件加载的。事实证明,将结果移动到未占用的单元格有效,而在已占用的单元格上无效。这不是真正的争论