※ ChatGPTを利用し、要約された質問です(原文:POIで出力したExcelファイルで変更メッセージ)
POIで出力したExcelファイルで変更メッセージ
このQ&Aのポイント
POIを利用して出力したExcelファイルを開くと変更メッセージが表示される問題について
Excelファイルの読み込みと値のセット、保存を行うプログラムの実装方法について
'sheet.setForceFormulaRecalculation(true);'の挙動による変更メッセージの解決方法
POIで出力したExcelファイルで変更メッセージ
POIで出力したExcelファイルを開いてすぐに閉じると
「'○○.xls'への変更を保存しますか?」といったメッセージが出てしまい、
何とかならないかと困っている状況です。
全体的な流れとしては単純で、テンプレートとなるExcelファイルを用意して
それをPOIを利用して読み込み、値をセットして、別名で保存しなおしています。
テンプレートは、SUM関数が書かれただけのシンプルなものです。
POIのバージョンは、3.8です。
JREは、1.5.0_15を使用しています。
プログラムは以下になります。
-----------------------------------------------------
int rowNo = 0;
int colNo = 0;
FileOutputStream fileOutputStream = null;
try{
//EXCEL読み込み
HSSFWorkbook inputWorkbook = new HSSFWorkbook(
new FileInputStream(new File("C:\\Test1.xls")));
fileOutputStream = new FileOutputStream("C:\\結果.xls");
//最初のシートを取得する
HSSFSheet sheet = inputWorkbook.getSheetAt(0);
sheet.setForceFormulaRecalculation(true);
//ROW取得
HSSFRow row = sheet.getRow(rowNo);
if(null == row)row = sheet.createRow(rowNo);
//CELL取得
HSSFCell cell = row.getCell(colNo);
if(null == cell)cell = row.createCell(colNo);
//値を書き込む
cell.setCellValue(1);
//EXCELファイル書き出し
inputWorkbook.write(fileOutputStream);
}catch (Exception e) {
e.printStackTrace();
}finally{
try{
if(null != fileOutputStream)fileOutputStream.close();
}catch (Exception e) {
e.printStackTrace();
}
}
-----------------------------------------------------
以下の一文を除くと、変更メッセージは表示されなくなります。
sheet.setForceFormulaRecalculation(true);
しかし、この一文がないとSUM関数の計算が動作しません。
記述、認識の不備、また解決に向けた良い方法がありましたら
ご教授のほど、よろしくお願いします。
お礼
ご回答ありがとうございます。 クライアント上での設定作業等は不可であるため 対応案として挙げて頂いた「2.VBAで強制保存させる」など Java以外の仕組みを併用した方法で解決策を練ってみます。 もう少し他の方の回答も待ってみようと思います。 ありがとうございました。
補足
解決策を見つけましたので、補足として記述させて頂きます。 sheet.setForceFormulaRecalculation(true); ではなく、全て値を書き込んだ後に HSSFFormulaEvaluator.evaluateAllFormulaCells(inputWorkbook); を記述することで、引数に指定したブック上の全ての数式がその場で再計算されるようです。 英語がしっかりと読めれば、もっと早くたどり着けたのですが、、。 teketonさん、ご回答ありがとうございました。 この補足も含めて、ベストアンサーとさせて頂きます。