コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

KotlinでExcelを操作するのは簡単っPOI

最近はやりのKotlinで、Excel操作してみました。

Kotlinでは、演算子のオーバーロード拡張関数が使えるため、POIをかなり便利な形にできます。

# 以下、POIを使ったことがある前提で書いています。

早速、実際のコードを見ていきます。

演算子オーバーロードと拡張関数を使い、

fun Sheet.get(n: Int): Row {
    return this.getRow(n) ?: this.createRow(n)
}

とすることで、Sheetのインスタンス(Sheetはインターフェースなので、その実装のインスタンス)に対して、

sheet[5]

のようにアクセスできます。Sheetはインターフェースですが、Kotlinの拡張関数を使うとその実装すべてで拡張した関数を使用できます。POIはExcelは2003までのxls形式と、それ以降のxlsxでSheetの実装クラスが違いますが、すべての実装に拡張した関数が反映されます。

同様に、Rowに対してもCellを取得する拡張をします。

fun Row.get(n: Int): Cell {
    return this.getCell(n) ?: this.createCell(n, Cell.CELL_TYPE_BLANK)
}

SheetとRowにget関数を作ることで、C2セルにアクセスする場合には

sheet[1][2]

のように書くことができます。

ただ、これだとsheet[y][x]のようになっているため直感的に操作できません。そのため、以下の関数を追加して、sheet[x, y]でアクセスできるようにしました。

fun Sheet.get(x: Int, y: Int): Cell {
    var row = this[y]
    return row[x]
}

この関数があると、C2セルにアクセスするにはsheet[2, 1]と書くことができます。

また、sheet[x, y] = valueのようにしてセルに値をセットするため、set関数も追加しました。(とりあえず、文字列と数値のみ対応しました)

fun Sheet.set(x: Int, y: Int, value: Any) {
    var cell = this[x, y]
    when (value) {
        is String -> cell.setCellValue(value)
        is Int -> cell.setCellValue(value.toDouble())
        is Double -> cell.setCellValue(value)
        else -> throw IllegalArgumentException("文字列か数値だけにして")
    }
}

このように、Kotlinを使うとPOIをかなり簡単に、便利に使うことができます。ちなみにGroovyだともっと直感的に使うことができるようです。

最後に、動作確認用に作ったサンプルのコードです。

用意したブック1.xlsxファイルはこんなかんじです。
f:id:kuwalab:20150311184311p:plain

実行すると

あ
い
え

と出力されて、ブック2.xlsxは以下のようになります。

f:id:kuwalab:20150311192200p:plain

Kotlinを使うとPOIもかわいく扱うことができます。演算子オーバーロードとか、拡張関数とかJavaにはない概念ですが、こんなにも便利なものなんだなあと実感することができました。

Kotlinまとめ http://kuwalab.hatenablog.jp/entry/Kotlin