Edited at

PHPExcelで出力したExcelの数式で再計算が実行できなくなった時の対処法

More than 1 year has passed since last update.

PHPExcelでレポート的なものを出力するプログラムの面倒を見ているのですが、最近のWindows Updateに伴ってOffice365がアップデートされ、恐らくそれが原因でPHPExcelで出力したExcelの数式が再計算できなくなってしまったようです。

数式が入力された大量のセルをひとつずつダブルクリックしていけば再計算されて正しいデータが表示されるのですが、そんなにヒマなわけもないので対処法を探し出しました。


発生バージョン


  • Office365 bussiness バージョン1803(これ以前のバージョンでは発生していないようです)

参考:https://technet.microsoft.com/ja-jp/office/mt465751


前程


  • PHPExcelのPHPExcel_IOFactory::createWriterでExcel2007を使用している

参考:PHPExcel https://github.com/PHPOffice/PHPExcel


対処法

PHPExcelの中を直に変更してしまうことになりますが、下記対応で一旦解消しました。


PHPExcel/Classes/PHPExcel/Writer/Excel2007.php

protected $preCalculateFormulas = false;


protected $preCalculateFormulas = true;

2018年6月追記

setメソッドがあるとご指摘いただいたので修正です。

PHPExcelではhttps://github.com/PHPOffice/PHPExcel/blob/1.8/Classes/PHPExcel/Writer/Abstract.php#L110 にsetメソッドがあるので、こちらを使用するようにしてください。

ちゃんとドキュメントにも記載がありました。

https://github.com/PHPOffice/PHPExcel/blob/1c8c2379ccf5ab9dd7cb46be965821d22173bcf4/Documentation/markdown/Overview/10-Reading-and-Writing.md#formula-pre-calculation

これで出力されたファイルで開いた際にちゃんと数式が計算された状態にすることができます。

ただし、書き込み時に再計算している?挙動になるかと思うので、書き込みにかかる時間は少し長くなりますのでご注意ください。

2018年6月追記

ただし、この修正の仕方だと書きこんだ部分しか再計算が適用されません。

書き込み箇所以外の再計算が必要な場合はこちらも直修正にはなってしまいますが

https://qiita.com/no22@github/items/3401b10d2e389b9ed55e

を参照ください。

なお、PHPExcelはサポートを中止してPhpSpreadsheetに移行していますので、あんまりいないかもしれませんがこれから利用を検討している方はhttps://github.com/PHPOffice/PhpSpreadsheet を利用するようにしましょう。

これ、PhpSpreadsheetに移行したらデフォルトでもちゃんと再計算されるようになるんだろうか?

試せたらまた追記しますね。もっと良さげな対処法知っている方は是非教えてくださいー。