Apache POI 3.7

今やりたいのは

Excelで、データベースのテーブルのテストデータをつくって、そのテストデータをMySQLに読み込ませるという作業を、できるだけかんたんにできるようにしたい。

できれば、JUnitの実行時に自動でおこないたい。

ビジネスロジックがやや複雑で作成するテストケースも多めで、手作業でのテストデータ作成+投入とJUnitの実行の反復がめんどうなのだ。

DbUnitは、ためしにつかってみたけど、イマイチつかいこなせなかった。

  • IDataSetに対するassertが便利なような不便なような。
  • CsvDataSetは、文字コード指定できなかった。
  • XlsDataSetは、1行目が列名で、あとはデータというところが、もうちょっと自由にできればな。5行目までテーブル定義をコピーして、6行目以降にテストデータつくってるんだよな。型とかバイト数とかがわかりやすいから。

数年前につかった、Seasar2の、S2TestCaseも便利な機能があったが、今の職場、Seasar2使ってないし。たしか日時の指定で、はまった記憶もある。

DbTestCaseみたいなのを自作してみるか。

  1. Excelに手作業でテストデータを入力
  2. ExcelCSVファイルの作成(JUnit実行時)
  3. CSVファイルをMySQLへロード(JUnit実行時)
  4. ビジネスロジック実行(JUnit実行時)
  5. assert(JUnit実行時)

2番目と3番目の処理をつくる必要がある。
5番目も、JUnitからselect文を発行できるようにするか。
そうしたら、手作業でテストでやっていることが、そのまんまJUnitに記述できるな。やっぱり、DbUnitを勉強したほうがよいのか?

前置きが長くなりすぎた。

そんなわけで、手始めに、
ExcelCSVファイルの作成
の処理をつくろう。
数年ぶりにApache POIをつかってみることにする。

Apache POI 3.7を調べてみる

poiのbinとsrcをダウンロードする。
Apache POI - Download Release Artifacts
poi-bin-3.7-20101029.zip
poi-src-3.7-20101029.zip

やりたいのはExcelファイルの読み込み。
ドキュメントはどこだ?

Excelを処理するためのAPIについては、ここか。
POI-HSSF and POI-XSSF/SXSSF - Java API To Access Microsoft Excel Format Files

Busy Developers’Guide が便利なサンプルコード集のようだ。
Busy Developers' Guide to HSSF and XSSF Features

読み込みは、Busy Developers’Guide の以下のあたりが、そのまんま参考になりそうだ。
Iterate over rows and cells
Iterate over rows and cells using Java 1.5 foreach loops
Getting the cell contents
Text Extraction

さらに、
Text Extraction


ExcelExtractor
クラスがまんまやりたいことができるような気がする。

こいつを知らべてみるか。

ダウンロードしたsrcで、Eclipseのプロジェクトをつくって、ソースコードEclipseから検索できるようにしよう。

コンパイルエラーがでている。


poi-bin-3.7
poi-bin-3.7\lib
poi-bin-3.7\ooxml-lib

においてあるjarをビルドパスにふくめる。コンパイルエラーがひとつ消えないな。


org.openxmlformats.schemas.wordprocessingml.x2006.main.STStyleType

まあ、いいや。ExcelExtractorクラスを探してみよう。こんなときは「Ctrl + Shift + R」が大活躍


poi-src-3.7\src\java\org\apache\poi\hssf\extractor\ExcelExtractor.java

getTextがExcelのセルから値を取得する処理のようだ。Busy Developers’Guideの例とそんなに変わらないな。getTextが呼ばれているところを探してみよう。「呼び出し階層を開く」だ。うわいっぱいある。


TestExcelExtractor.java
もばっちり書いてあるようだ。

うーん、ExcelExtractorを直接使って思いどおりのCSVファイルをつくる方法がぱっとわからない。getTextを参考にして、Excelのセルの値を取得して、CSVファイルにする処理を書くことにするか。

  • エクセルファイル名→ディレクトリ名
  • シート名→CSVファイル名
  • シートの中のテーブル定義の行→無視
  • シートの中のテストデータの行→CSVのフィールド

その他Excelを使えるライブラリ

JExcelApi

ExCella

JXLS -

XLSBeans - Project Amateras