あちこちの現場で、エクセルファイルから create table をつくったり Bean をつくったりするマクロをみかけます。 ぼくもつくったことありますが、こういうのってワンショットで一回つくったら大抵もう使わないプログラム。
エクセル VBA でつくりますが、ぼくら VBA ってあんまり使わないのですぐ忘れてしまい、あれ文字列の連結 & だっけ?とか、 ; つけてすまったー! とか、たくさんのファイルを処理するとぱかぱかエクセルあがったりしてうーん、とかいろいろ、、、というわけで Java からエクセルを読み込む XLSBeans を試してみました。
実は VBA も RANGE オブジェクトつくって Iterator っぽくまわせたり結構やるなって思う部分もあるのですが、やっぱり書き方的に慣れてない部分も多々あります。 で、Java って思うのですが、ワンショットにしては適当にかけない部分もあり、、ってことで今回は Groovy から XLSBeans を呼び出してみました。 🙂
ExcelとJavaBeansをJava 5のアノテーションでマッピングするためのライブラリです。
MYCOMジャーナルに簡単な紹介記事が掲載されています。まずはこちらをご覧いただくとXLSBeansがどのようなものかをご理解いただけるのではないかと思います。
とりあえず、XLSBeans と Groovy を使えるようにしてこんな感じに・・・。
Excel をつくります。 OOo で xls 形式にしましたが問題ありませんでした。
たとえば、画面定義。 本物は 100 とか 200行オーダで、もっといろいろ書いているもんですが、とりあえず。 これの struts FormBean をつくるようなイメージで。(あくまでイメージね)
で、ソースをかきます。 Groovy なので単一モジュールで、main もなく、がりがりいけます。 試験的に漢字変数とかも使ってみました。 なんかこわい(笑)
import net.java.amateras.xlsbeans.*;
import net.java.amateras.xlsbeans.annotation.*;
// エクセルファイルを定義に従って読み込む
sheet = (new XLSBeans()).load(
new FileInputStream("xls/項目定義.xls")
, ExcelSheet.class);
// 定義からデータ呼んでファイル出力
new File("xls/test.txt").withPrintWriter { w ->
for(画面項目 in sheet.画面項目行) {
upper = 画面項目.物理名[0].toUpperCase();
upper +=
画面項目.物理名[1..画面項目.物理名.length() - 1];
str = """
// ${画面項目.論理名}
private String ${画面項目.物理名};
private String get${upper}() {
return ${画面項目.物理名};
}
private void set${upper}(String str) {
${画面項目.物理名} = str;
}""";
w.println(str);
}
}
// 以下エクセルの定義
@Sheet(name="Sheet1")
class ExcelSheet {
@HorizontalRecords(tableLabel="画面項目定義"
, recordClass=画面項目.class)
public List<画面項目> 画面項目行;
}
class 画面項目 {
@Column(columnName="論理名")
public String 論理名;
@Column(columnName="物理名")
public String 物理名;
@Column(columnName="タイプ")
public String タイプ;
@Column(columnName="長さ")
public String 長さ;
@Column(columnName="出力編集")
public String 出力編集;
}
これを実行するとエクセルを処理して内容を吸い出して整形したテキストファイルができあがります。 サンプルでも JavaDoc くらいつけろですか。 😀
// タイトル
private String title;
private String getTitle() {
return title;
}
private void setTitle(String str) {
title = str;
}
・・・。 ・・・。 まちがって getter / setter を private にしてしまいました。 まぁサンプルということでご愛敬。。(笑)
さて、最初エクセルを取得する Bean を Groovy のプロパティをつかって public をつけずに定義していたら、うまく値が入りませんでした。 Groovy でも public String hoge; とかするのが正解のようです。
VBA で処理すると座標系でやってしまいがちで、これが結構数えたり面倒だったりするもんですが、XLSBeans を使うとオートで Bean にマッピングしてくれるので大変便利です。 エクセルのあちこちの位置に置いてみたりしてみましたが、うまく検索して場所を探してくれるようです。
Groovy から呼ぶと、public static void main() いらなかったり、ヒアドキュメント + GString のうめこみ変数とか、ファイルのオープンクローズとか不要とか、文字列操作とかいろいろ楽かもですね。 ぼくは慣れてないので、まだまだ簡単にかく方法あると思います。
てなわけで、Eclipse にプロジェクトひとつ準備しておくと何かのおりに使えるかもしれません。 🙂