#author("2021-12-14T01:55:51+00:00","","")
// 下階層用テンプレート
#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

こちらをどうぞ。



-[[Jakarta POIで、Excelドキュメントを操作する>http://www.visards.co.jp/java/poi/poi5.html]]
-[[POIで名前定義されているセルを取得する話 - kelkronsoの日記>http://d.hatena.ne.jp/kelkronso/20110425/1303740403]]
-[[POIで、名前定義の入ったカラムから値を取得。 - るいもの戯れ言>http://www.ruimo.com/2010/11/10/1289351460000.html]]

----
この記事は
#vote(おもしろかった[6],そうでもない[0])
#vote(おもしろかった[37],そうでもない[2])

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS