Help us understand the problem. What is going on with this article?

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

makasn
yourmystar
サービス産業のIT化プラットフォーム「ユアマイスター」と大切なものをもっと大切にするメディア「ユアマイスター スタイル」を運営するスタートアップです。
http://corp.yourmystar.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした