PHPExcel не пересчитывает и всегда показывает одно и то же значение

Я работаю над проектом и читаю значения из документа Excel. При использовании функции getCalculatedValue она всегда возвращает одно и то же значение. Я безуспешно пробовал функцию getOldCalculatedValue. Я где-то читал, что будет полезно очистить кеш перед пересчетом значения из этой ячейки. Может кто-нибудь объяснить, как я могу это сделать с помощью приведенного ниже кода?

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');  
$objPHPExcel = $objReader->load("test.xlsx");
$value1 = $objPHPExcel->getActiveSheet()->getCell('B1')->getCalculatedValue();
$value2 = $objPHPExcel->getActiveSheet()->getCell('D1')->getCalculatedValue();

person Demetris    schedule 09.07.2015    source источник


Ответы (1)


Когда вы впервые получаете вычисленное значение с помощью вызова getCalculatedValue(), PHPExcel (по умолчанию) кэширует результат, поэтому последующие вызовы не будут пересчитывать, а просто вернут кэшированное значение.

Это уменьшает накладные расходы на вычисления, которые обычно возникают, когда на одну и ту же вычисляемую ячейку ссылаются в других формулах ячеек.


Это может быть проблемой, когда вы читаете вычисляемые данные, затем меняете значения ячеек, а затем пересчитываете, поэтому PHPExcel предоставляет методы, позволяющие вам управлять кешем.

Вы можете изменить поведение по умолчанию, чтобы вычисленные результаты никогда не кэшировались, отключив кеш вычислений одним из следующих способов:

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

or:

PHPExcel_Calculation::getInstance($objPHPExcel)->setCalculationCacheEnabled(false);

Или вы можете очистить кеш в любой момент, выполнив вызов:

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

Обратите внимание, что метод getOldCalculatedValue() используется для получения последнего значения, рассчитанного для ячейки самим MS Excel, а не из PHPExcel. Не гарантируется, что текущие данные каким-либо образом будут отражаться, потому что можно отключить MS Excel от выполнения вычислений по формуле; но иногда может быть полезно для формул, которые ссылаются на внешние файлы или источники данных.

person Mark Baker    schedule 09.07.2015
comment
Спасибо Марк за ваш ответ. Я попробовал приведенные выше предложения, но это не сработало. Значение в ячейке excel изменяется в зависимости от моих входных значений, и когда я открываю excel, значение становится правильным. Когда я читаю его из своего сценария, он все время один и тот же (и значение неверное). $objPHPExcel = $objReader-›load(test.xlsx); PHPExcel_Calculation::getInstance($objPHPExcel)->setCalculationCacheEnabled(false); PHPExcel_Calculation::getInstance($objPHPExcel)-›clearCalculationCache(); $value1 = $objPHPExcel->getActiveSheet()->getCell('B1')->getCalculatedValue(); - person Demetris; 10.07.2015
comment
Не могли бы вы привести пример формулы, которая демонстрирует такое поведение? - person Mark Baker; 10.07.2015
comment
Возможно, вы используете функцию, которая не поддерживается PHPExcel. Я объяснил, как кэширование вычислений можно подавить или сбросить, запрограммированное поведение; но не зная конкретных деталей вашего расчета или вносимых вами изменений, которые должны повлиять на этот расчет, я не могу объяснить, почему вы каждый раз получаете один и тот же результат..... обычно я ожидал, что если формула или базовые данные не были изменены, но вы не говорите, какие изменения вы внесли - person Mark Baker; 10.07.2015
comment
На моем сайте у меня есть поля ввода, и пользователь может вводить разные значения. Эти значения вставляются в некоторые ячейки в документе Excel. После ввода у меня есть ряд ячеек с вычислениями в каждой ячейке с использованием функции ЕСЛИ следующим образом (пример): =ЕСЛИ(ЗНАЧ(F49)‹›1, E33-F49-E57-E58-E60-E61+E59, 1). Моя цель - получить максимальное значение, содержащееся во всех этих ячейках в строке. Итак, ячейка, которую я читаю из своего скрипта (B1), имеет следующий формат: =MAX(D63:AF63). - person Demetris; 10.07.2015
comment
А это мой код: $objReader = PHPExcel_IOFactory::createReader('Excel2007'); $objPHPExcel = $objReader-›load(test.xlsx); $objPHPExcel-›getActiveSheet() ->setCellValue('B3',$input1) ->setCellValue('B4',$input2); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter-›save('test.xlsx'); $objPHPExcel = $objReader-›load(test.xlsx); $value1= $objPHPExcel->getActiveSheet()->getCell('B1')->getCalculatedValue(); - person Demetris; 10.07.2015
comment
Исходя из вышеизложенного, почему любое изменение в ячейках B3 или B4 должно влиять на результат =MAX(D63:AF63) в ячейке B1? - person Mark Baker; 10.07.2015
comment
Можете ли вы привести рабочий пример всего с несколькими ячейками? - person Mark Baker; 10.07.2015
comment
Я хотел бы прикрепить сюда некоторые документы, чтобы это было действительно то, что я сделал, но я не могу, так как я новый пользователь. Есть ли другой способ? - person Demetris; 10.07.2015
comment
Вы не можете прикреплять документы на SO, вам нужно загрузить их куда-нибудь, например, в дропбокс, и предоставить ссылку. - person Mark Baker; 10.07.2015
comment
Воспользуйтесь этой ссылкой: filedropper.com/webtool . Я загрузил весь проект (2 страницы и 1 документ Excel). - person Demetris; 10.07.2015