Apache POIで指定した範囲を空白にする
設定されているExcel式を全消ししたかったので…
Apache POIで指定した範囲を空白にする
動作環境
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <poi.version>3.17</poi.version> </properties> <dependencies> <!-- Apache POI とその依存関係 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>${poi.version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>${poi.version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>${poi.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.6</version> </dependency> ...
コード片
それなりに時間がかかってしまう。もっといい方法(from Javaから)あればコメントで知らせてください。
参考サイト
/** * 指定された範囲のセルを空白(BLANK)にする * @param sheet 作業対象シート * @param rangeString A1形式の範囲を文字列で */ private void setEmptyValuesWithRange(Sheet sheet, String rangeString) { // 処理時間を計測する StopWatch stopWatch = new StopWatch(); stopWatch.start(); System.out.print(String.format("-> %s を空にする…", rangeString)); CellRangeAddress range = CellRangeAddress.valueOf(rangeString); CellWalk cw = new CellWalk(sheet, range); cw.traverse(new CellHandler() { @Override public void onCell(Cell c, CellWalkContext ctx) { c.setCellType(CellType.BLANK); } }); stopWatch.stop(); System.out.println("OK! " + stopWatch.getTime()); }
それよりGoogle Spreadsheetがよさそうですよ
課題
Apache POIはMSが作っているわけではないし技術的(というより仕様的に)に限界がある。最近直面した問題:
- 複雑なExcel式計算をPOIに渡すと空白で返ってくる
- 前のバージョン、Apache POI 3.16だとそういうことがあった
- POIはライブラリの中でExcel式をエミュレートしてるそうですよ
- ユーザの嘆きの声 → excel - Complex cell formula evaluation does not work using apache-poi - Stack Overflow
- Excel式はユーザがWindows上でExcelを使ってファイルを開くまで実行されない、よって式の値が空白になることがある
- それを防ぐために FormulaEvaluator (POI API Documentation) を使って式を計算するんですが、これが重い
- Apache POIの式計算に関するドキュメント Formula Evaluation
根本的にExcelというクライアントツールがファイルの読み書きを握ってるので、あんまり自由度がない(商用だから当たり前だけど)。