Excel+POIで自動計算されない †
Excelでテンプレートを作り、プログラムで必要なセルだけ埋めてダウンロードするというプログラム。例えばテンプレート側でA3のセルに「=A1+A2」と入れておくと、プログラムでA1とA2に数字を入れるとA3のセルは自動的に計算されると思いきや、うまくいかない。ダウンロードしたエクセルを開いてみると、A1=100、A2=200とすればA3は自動的に300になるところ、0になっているのだ。
該当のエクセルファイルを一度オープンオフィスで開いてそのまま上書き保存して使うと期待通りA3のセルも計算される。この挙動から、Windowsのエクセルでファイルを保存する際になにか設定が必要なのかと思っていたが、実はPOI側での対処方法があるとのこと。
@IT会議室 jakarta-POI でテンプレートに埋め込んだ計算式が反映されない
POIの3.1-FINALだと自動計算しないので、 各シートで sheet.setForceFormulaRecalculation(true); してあげればOKです。
手元の POI3.8 beta3 でも再計算されないが、紹介文通りにやってみるとうまく再計算された。こんな対処方法があったのか。ありがとう。
Class HSSFSheet setForceFormulaRecalculation
さっそく対処だ †
ところで、プログラム中ではシートはクローンして使うことにしている。クローンして新しいシートを作成した後に再計算依頼メソッドを呼んであげればよいので以下の対処でよい。
private void createSummarySheet(final Workbook book, final List<RichItem> items) {
final Sheet sheet = book.cloneSheet(0);
sheet.setForceFormulaRecalculation(true);
と思いますか?これには問題があります。該当プロジェクト中のではいくつかのテンプレートファイルを扱い、さまざまなシートをクローンして使っています。book.cloneSheet() を使っている箇所がいっぱいあるし、今後も増える可能性がある。今回「sheetを作成したら再計算メソッドを呼ぶ」さもないとバグになる、というルールを徹底するためにはどうしたらよいだろう?
半年後、僕がこのプログラムを修正しているときに「sheetを作成したら再計算メソッドを呼ぶ」ルールをうっかり忘れていた時、バグを誘発して数時間無駄な時間を費やすだろう。それを今の僕が防ぐには、どういう対処をしておけばよいだろうか。