Java のエクセルを読むライブラリに XLSBeans さんがありますが、こちらを Groovy と組み合わせて使うと非常に便利ですのでメモがてらご紹介です。 実は以前も書いていたりしたのですが改めて。
Groovy + XLSBeans でエクセルでできた設計書からソースコードを作成したり、なにかテキストファイルを作るとき等に簡易的な DB としてエクセルが利用できたりします。 ここでは後者、サンプル的にエクセルで書いた日記を HTML に出力するのをやってみます。 🙂
というわけで、まずは XLSBeans。
ExcelとJavaBeansをJava 5のアノテーションでマッピングするためのライブラリです。
Java のライブラリですので普通に Groovy から呼び出せます。 ここでつくるようなワンショットプログラムは Groovy と非常に相性が良いです。
まずは元データとなるエクセルファイルを作成します。 うちは Linux なので OOo にて。
こんな感じに元データをつくります。 できたらこれを bean にマッピングしてあげます。
@Sheet(name="Sheet1")
public class Nikki {
@HorizontalRecords(tableLabel="日記", recordClass=NikkiLine.class)
public List<NikkiLine> lines;
}
class NikkiLine {
@Column(columnName="日付")
public String date
@Column(columnName="天気")
public String tenki
@Column(columnName="コンテンツ")
public String content
}
アノテーションでシートの構造を指定してあげます。 注目は X/Y 系の位置情報がないところで、これが非常に便利です。 数えなくていいですし、列が増えたとしてもそのままで大丈夫。 🙂
で、bean の定義ができたらエクセルファイルをプログラムから読んであげます。 Groovy なら .groovy ファイルのトップレベルに上のソースと以下をかくだけ。
Nikki nikki = (new XLSBeans()).load(
new FileInputStream("xls/日記.xls"), Nikki.class)
引き続きやりたいことをプログラムしていきます。 ここでのサンプルでは先ほどのエクセルから .html ファイルを生成していきます。 Groovy お得意の Builder をつかって HTML タグ文字列を意識せず生成できますぞ。
全体の .groovy はこんな感じになります。
import groovy.xml.MarkupBuilder
import net.java.amateras.xlsbeans.*;
import net.java.amateras.xlsbeans.annotation.*;
Nikki nikki = (new XLSBeans()).load(
new FileInputStream("xls/日記.xls"), Nikki.class)
for(NikkiLine line : nikki.lines) {
def date = new Date("$line.date")
def writer =
new File("html/${date.format('yyyyMMdd')}.html").newPrintWriter('UTF-8')
def html = new MarkupBuilder(writer)
def name = "${date.format('yyyy/MM/dd(E)')}の日記"
html.html('lang':'ja') {
head {
meta('http-equiv': 'Content-Type', content: 'text/html; charset=UTF-8')
title(name)
}
body {
h1(name)
p("今日は${line.tenki}")
p("${line.content}")
}
}
writer.close()
}
@Sheet(name="Sheet1")
public class Nikki {
@HorizontalRecords(tableLabel="日記", recordClass=NikkiLine.class)
public List<NikkiLine> lines;
}
class NikkiLine {
@Column(columnName="日付")
public String date
@Column(columnName="天気")
public String tenki
@Column(columnName="コンテンツ")
public String content
}
日付のフォーマットやマークアップビルダー、ファイル処理など Groovy パワーをいただきつつ、ちょいちょい 10 分でかけますね。 たぶん VBA でやったらいらっとする類のプログラムです(笑)
[tegaki]できたっ[/tegaki]
先ほどのエクセルからこんな感じの(複数の) HTML が生成されます。
<html lang='ja'>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
<title>2011/08/01(月)の日記</title>
</head>
<body>
<h1>2011/08/01(月)の日記</h1>
<p>今日は晴れ</p>
<p>今日は何事もなかった。</p>
</body>
</html>
Groovy からお手軽にエクセル読めてそれをもとに処理ができるのはかなり適応範囲が広いと思います。 最近もかなり助けられました。。ありがとうございますっ 🙂
てなわけで、Keep on groovy – ing !