12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-03

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に移行したらデフォルトでもちゃんと再計算されるようになるんだろうか?
試せたらまた追記しますね。もっと良さげな対処法知っている方は是非教えてくださいー。

12
12
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?