ひとりはみんなのせいで

調べたことの備忘録など

Apache POIで選択範囲を走査する

Excelで、ある範囲内に対して同じ処理をしたい場合がある。VBAだとこんな感じ

Sub IncrementValues()
    For Each r In Range("A1:D4")
        r.Value = r.Value + 1
    Next r
End Sub

これをApache POIでやろうとすると取得したCellオブジェクトがnull場合の考慮など結構面倒なのだけど、リファレンスを見ていたらちょっと便利なユーティリティクラスCellWalkを発見した。

FileInputStream fis = new FileInputStream(workbookPath);
Workbook wb = WorkbookFactory.create(fis);
Sheet ws = wb.getSheetAt(0);

CellRangeAddress cra = new CellRangeAddress(0, 3, 0, 3); // "A1:D4"
CellWalk cw = new CellWalk(ws, cra);
cw.traverse(new CellHandler() {
    @Override
    public void onCell(Cell cell, CellWalkContext cwc) {
        cell.setCellValue(cell.getNumericCellValue() + 1);
    }
});
End Sub
  • CellHandlerで各セルへの操作を定義する
  • CellWalkContext#getRowNumber()で行インデックス、CellWalkContext#getColumnNumber()で列インデックスを取得
  • 空白のセルには処理が行われないので、そこは注意が必要