// 下階層用テンプレート #topicpath ---- //ここにコンテンツを記述します。 #contents **XLSBeansというライブラリとは [#y497f32e] 開発をしてると設計書がExcelで記述されていたりします。んで設計書から一覧を作るとか、なにか資料をまとめるときにJavaを使ってExcelファイルの内容を取り扱いたいことが結構あります。通常、JavaとMicro$oft系は相性があんまりよくないのですが、ExcelファイルとJavaBeansをマッピングするライブラリ[[XLSBeans>http://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi?page=XLSBeans]]というのがあったので、早速試してみました。 **ダウンロード・インストール [#yb307b5a] https://sourceforge.jp/projects/amateras/files/ よりダウンロードします。ダウンロード後、 javassist.jar jxl.jar ognl-2.6.9.jar xlsbeans_1.0.2.jar commons-lang-2.3.jar らにクラスパスに通しておきました。 **やってみる [#h4b57b4c] 下記のような株価情報が書いてあるExcelファイルをJavaBeansにマッピングします。 #ref(excel.png) 銘柄ごとの株価情報(Excelの行)をひとつのJavaBeansとします。クラス名はIStockとしました。 public interface IStock { String getMarket(); <-市場 String getStockCode(); <-銘柄コード String getName(); <-銘柄名 String getPrice(); <-現値 String getVolume(); <-出来高 } ***ExcelシートとJavaBeansの指定 [#wfdf9d02] また、Excelの行のIStockのリストとして返すStocksクラスも定義します。 import java.util.List; import net.java.amateras.xlsbeans.annotation.HorizontalRecords; import net.java.amateras.xlsbeans.annotation.Sheet; @Sheet(name = "株価情報") public class Stocks { private List<IStock> stocks; public List<IStock> getStocks() {return stocks;} @HorizontalRecords(tableLabel = "現在値一覧", recordClass = Stock.class) public void setStocks(List<IStock> stocks) { this.stocks = stocks; } } 上のStocksクラスでは、Excelファイルのシート名の指定(株価情報ってシート名)と各行がどのJavaBeansとマッピングするかをTigerのアノテーションで指定しています。上の指定は :@Sheet(name = "株価情報")|このファイルの株価情報シートを参照します :@HorizontalRecords(tableLabel = "現在値一覧", recordClass = Stock.class)|「現在値一覧」というラベルの場所をStockクラスとマッピングします ということを意味しています。 ***JavaBeansのプロパティとExcelの列のマッピング [#ne3c25e4] また、JavaBeansとExcelファイルもXLSBeansライブラリのアノテーションを用います。IStockの実装クラスStockは以下のようにしました。アノテーションでJavaBeansのプロパティとExcelのテーブルのカラム名をマッピングしてるのがわかると思います。 import net.java.amateras.xlsbeans.annotation.Column; import org.apache.commons.lang.builder.ToStringBuilder; public class Stock implements IStock { private String name; private String market; private String price; private String stockCode; private String volume; //このプロパティはシート上の「市場」とマッピング //セルの結合をサポートする @Column(columnName = "市場", merged = true) public void setMarket(String market) {this.market = market;} //このプロパティはシート上の「銘柄」とマッピング @Column(columnName = "銘柄") public void setName(String name) {this.name = name;} //このプロパティはシート上の「現在値」とマッピング @Column(columnName = "現在値") public void setPrice(String price) {this.price = price;} //このプロパティはシート上の「コード」とマッピング @Column(columnName = "コード") public void setStockCode(String stockCode) {this.stockCode = stockCode;} //このプロパティはシート上の「出来高」とマッピング @Column(columnName = "出来高") public void setVolume(String volume) {this.volume = volume;} // getterは省略してます... } 以上でクラス構成は以下のようになりました。 #ref(classdiagram.png) **Mainクラス [#w008ef05] 最後にMainクラスです。実際にデータを読み込んでみます。 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.List; import net.java.amateras.xlsbeans.XLSBeans; import net.java.amateras.xlsbeans.XLSBeansException; public class Main { public static void main(String[] args) throws FileNotFoundException, XLSBeansException { InputStream in = new FileInputStream("株価ファイル.xls"); // streamからStocksクラスを作成 // ここでアノテーションからJavaBeansのマッピングがされ、 // インスタンスまで生成される Stocks stocks = new XLSBeans().load(in, Stocks.class); List<IStock> list = stocks.getStocks(); for (IStock stock : list) { System.out.println(stock); } } } 実行結果は以下の通り(多少整形してます) [市場=東証,銘柄コード=4689,銘柄名=ヤフー ,株価=42750,出来高=419] [市場=東証,銘柄コード=6758,銘柄名=ソニー ,株価=6410,出来高=4503100] [市場=東証,銘柄コード=6501,銘柄名=日立製作所 ,株価=899,出来高=15749000] [市場=東証,銘柄コード=,銘柄名=日経平均(225) ,株価=17394.92,出来高=] [市場=東証,銘柄コード=,銘柄名=TOPIX ,株価=1704.22,出来高=1708120000] JavaBeansvのプロパティにExcelデータがマッピングされています。日経平均とTOPIXには市場がマッピングされないかなあと思ってましたが、まあ想定通りです。というかかなり簡単ですね、これ。。 **このライブラリ、かなりよいかもっ。 [#v40e7741] これを使えばExcelからJava定義クラスを自動生成するとか、色々できそうですね。まあVBA使えばいいのかもしれませんが(´д`;)。。 **関連リンク [#h1f2b0e5] このライブラリを用いて、ExcelでJavaBeansしてソースコードを自動生成するEclipseプラグインを作成しました。詳しくは -Eclipse/プラグイン開発のTIPS集/JavaBeansGenerator こちらをどうぞ。 ---- この記事は #vote(おもしろかった[16],そうでもない[0]) #comment #topicpath SIZE(10){現在のアクセス:&counter;}