日々常々

ふつうのプログラマがあたりまえにしたいこと。

POIを使ってみる/セルのコピー

POIのバージョンは3.6です。
値、書式と出したのでセルおよび行のコピーが出来るようになりました。やり方は想像通り、コピーしたいセルのある対象のシートから、セルの値と書式を取り出して、コピー先のセルに設定していくだけ。とりあえずこの場合、対象のセルや行が未定義の場合、POIはNULLを返しますのでそこだけ注意点なのかもしれない。

まず、コピー元のセルを取得します。コピー元は普通に定義されているということで、Row#getCellを使用します。取得できない場合は処理を飛ばして次のコピー対象セルに進むといいと思います。値をCell#getStringCellValue等や、書式をCell#getCellStyleで取得します。これでコピー元セルが取得できました。
次に、コピー先セルを取得します。コピー先セルは普通に何も定義されていないと思われるので、Row#getCellをしたところでnullが返るだけです。そもそもSheet#getRow自体もnullの可能性が高いです。よって、Sheet#createRowで作成したRowに対しRow#createCellでセルを作成し、作成したCellに対してCell#setCellValueとCell#setCellStyleでコピー元の値と書式を設定します。
蛇足ですが、既に存在しているセルに対して、Row#createCellをすると、対象セルはCell.CELL_TYPE_BLANKに上書きされるので、情報があったとしたら消えます。一応注意。

無理矢理文章で書いてみようとしたけれども、大半がメソッド名になってて日本語じゃない。困ったお話ですが、こんなもんです。下のようにコードを書くのが手っ取り早いのですが、実際にこんなコードを書かれると、間違いなく突き返します。とはいえあまり時間をかけて長々と書いてもなぁ、とも思う葛藤。

// sheetは対象Sheetのインスタンス
// 1行目の2セル(B1)を3行目の1セル(A3)にコピーする
Row srcRow = sheet.getRow(0);
Row destRow = sheet.createRow(2);
destRow.createCell(1).setCellValue(srcRow.getCell(2).getStringCellValue());
destRow.getCell(1).setCellStyle(srcRow.getCell(2).getCellStyle());

たまに日常会話で喋っている言葉が、日本語じゃなくJavaとかSQLに近い時があるのが最近の悩みだったり。