Игнорирование вычисленных значений при чтении в файле Excel с помощью PHPExcel


Я читаю файл XLS с setReadDataOnly(true). Прочитанный объект снова сохраняется как новый файл Excel. К сожалению, некоторые значения ячеек вычисляются неправильно (это связано с ошибкой вычисления по ячейкам с формулой промежуточного итога). Если я правильно понимаю, каждая ячейка в файле XLS содержит предварительно рассчитанное значение вместе с формулой. Если я смогу заставить PHPExcel не пытаться вычислять формулы при чтении файла (вместо этого просто используйте предварительно рассчитанные значения как есть) Я могу обойти эту проблему. Я думал, что setreaddataonly(true) или setprecalculateформулы (false) могут выполнить это, но это не так.

Дополнительная информация

Благодаря объяснению Марка я исследовал разницу между getcalculatedvalue() и getOldCalculatedValue() в моем случае. Я использую следующий код, чтобы прочитать файл, а затем записать его снова:

$excel_reader = PHPExcel_IOFactory::createReaderForFile($file);
$excel_reader->setReadDataOnly(true);
$excel_obj_temp = $excel_reader->load($file);

// Test one of the values in question
$excel_obj_temp->setActiveSheetIndexByName("Form 11");
error_log("val:".$excel_obj_temp->getActiveSheet()->getCell("E36")->getCalculatedValue());
error_log("old_val:".$excel_obj_temp->getActiveSheet()->getCell("E36")->getOldCalculatedValue());

$new_file = "new_generated_name";

$excel_writer = new PHPExcel_Writer_Excel5($excel_obj_temp);
$excel_writer->setPreCalculateFormulas(false);
$excel_writer->save($unprotected_file);

При чтении файла в нем отображается правильное значение с getOldCalculatedValue(). Если я затем сохраню файл без setPreCalculateFormulas(false) и снова прочитаю файл, как getcalculatedvalue(), так и getOldCalculatedValue() вернут тот же (неверный) результат. Это согласуется с объяснением Марка о том, что значения будут пересчитаны при сохранении, если вы не установите Setprecalculateформулы(false)

Однако, если я вместо этого сохраню файл с помощью setPreCalculateFormulas(false) (что кажется правильным способом) и прочитаю файл опять же, getcalculatedvalue() возвращает неверный результат, а getOldCalculatedValue() возвращает 0, что неверно.

Почему кэшированные значения очищаются после сохранения? Есть ли какие-то другие настройки, которые мне нужно применить вместе с setprecalculateформулами (false)?

 5
Author: BOENDAGGER, 2014-08-27

1 answers

PHPExcel не вычисляет какие-либо значения при загрузке файла электронной таблицы. Он будет вычислять значения ячеек только в том случае, если вы явно вызовете методы getCalculatedValue() или getFormattedValue() ячейки, или по умолчанию при сохранении (если вы не используете метод записи setPreCalculateFormulas(false))... хотя использование столбцов автозаполнения приводит к пересчету при сохранении для любых ячеек в этих столбцах независимо от любых других настроек.

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

 4
Author: Mark Baker, 2014-08-27 20:46:17