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の中を直に変更してしまうことになりますが、下記対応で一旦解消しました。
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に移行したらデフォルトでもちゃんと再計算されるようになるんだろうか?
試せたらまた追記しますね。もっと良さげな対処法知っている方は是非教えてくださいー。