44898
# 環境

  * Apache POI 3.17
  * JDK 1.8.0_162
  * Excel 2016

# やりたいこと

Apache POIで、Excelファイルを読み込む機能があります。  
以下のようなコードです。

```

    public static void read(File file) throws IOException, InvalidFormatException {
        Workbook workbook = WorkbookFactory.create(file);
        Sheet sheet = workbook.getSheetAt(0);
        //セルの中身を読み取る処理
        workbook.close();
    }
    
```

今、このメソッドのテストコードを作成したいです。  
テストデータ用のExcelファイルも、リポジトリに登録します。

# 問題

上記のメソッドでExcelファイルを読み込むと、Excelファイルが更新され、リポジトリに登録してあるExcelファイルと差分が出てしまいます。

# 詳細事項

## 差分の内容

空のExcelファイル（新規作成時のファイル）を使って、`cmp`コマンドでバイナリ差分を確認しました。

```

    $ cmp -b sample-after.xlsx sample4-before.xlsx
    sample-after.xlsx sample4-before.xlsx differ: byte 7, line 1 is  12 ^J   6 ^F
    
```

  * sample-before.xlsx : テストコード実行前のExcelファイル
  * sample-after.xlsx : テストコード実行後のExcelファイル

## `close`メソッド

`close`メソッドの呼び出さなければ、Excelファイルは更新されませんでした。

# 質問

  * 上記のコードで、なぜExcelファイルが更新されるのでしょうか？
  * Excelファイルのどういった情報が、更新されているのでしょうか？
  * Excelファイルが更新されないように、読み込む方法はありますか？あれば、その方法を教えていただきたいです。（`close`メソッドを呼ばないは除外）
CC BY-SA 4.0
2018-06-19T16:17:26.850
44897
2018-06-20T01:51:25.653
2018-06-19T16:23:36.000
19524
19524
question
java excel apache-poi
Apache POIでExcelファイルを読み込むと、Excelファイルが更新されてしまいます。なぜでしょうか？
> Excelファイルが更新されないように、読み込む方法はありますか？

javaの開発環境が手元にないため、動作確認できていませんが、  
WorkbookFactoryの以下の第3引数をtrueにするとリードオンリーで開けるようです。

```

    static Workbook create(java.io.File file, java.lang.String password, boolean readOnly)
    
```

[JavaDoc](https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/WorkbookFactory.html#create-
java.io.File-java.lang.String-boolean-)には以下と記載されています。

```

    @param readOnly If the Workbook should be opened in read-only mode to avoid writing back
          changes when the document is closed.
    
```

そのため、以下のようにWorkbookを作成すればclose時にファイルが更新されないと思います。

```

    Workbook workbook = WorkbookFactory.create(file, null, true);
    
```
CC BY-SA 4.0
2018-06-19T17:36:11.667
44898
2018-06-20T01:51:25.653
2018-06-20T01:51:25.653
19524
44897
answer