POIを使うときの注意点

セルへのアクセスが微妙。

セルアドレス(行,列)を指定して、直接セルにアクセスできません。
シート→行→セル という構造なので、まず行を取得して、その行からセルを取得する。
というちょっと面倒くさいやり方をしなければいけません。
まぁこのへんは、ヘルパを作るなりすればいいだけですね。

行の挿入,削除が不自由

Excelで行の挿入や削除するのとは、ちょっと感覚が違います。

行の挿入

HSSFSheet#shiftRowsで、挿入位置以降の行を全て後ろにずらします。
それから、HSSFSheet#createRowで行オブジェクトを作成し、
さらにHSSFRow#createCellでセルオブジェクトを作成する必要があります。

行の削除

HSSFSheet#removeRowで、行オブジェクトを削除したあとに、
HSSFSheet#shiftRowsで、削除位置以降の行を全て前にずらします。
(removeRowで行オブジェクトを削除しただけだと空行になっているので、
その状態で構わないのであれば行の移動は必要ありません。)

スタイルの設定が厄介

一つ一つのセルに対してスタイルを設定しなければいけません。
Excelでするように、範囲を選択して外側は太線で、内側は細線、
ということができません。
また、「スタイルオブジェクトを生成して、それをセルオブジェクトに設定する」
といったことをしないといけません。
さらにスタイルオブジェクトのインスタンスは1ブックに4000個までしか生成できません。
しかし、4000個を超えても例外が投げられるわけではなく、
スタイルが崩れるという分かりにくい事象が起こります。
ちなみにこの制限は、POIではなくExcelの制限です。

行のコピーが凶

行の完全コピー(値や書式を含めたコピー)を行いたい場合は結構メンドイです。
上記の注意点を踏まえて、さらに文字設定(文字サイズ,色etc)、罫線、
セルの結合状態などを自前でコピーしてやらなければいけません。