Top / Java / ExcelとJavaBeansをマッピングするライブラリXLSBeansを使う

XLSBeansというライブラリとは

開発をしてると設計書がExcelで記述されていたりします。んで設計書から一覧を作るとか、なにか資料をまとめるときにJavaを使ってExcelファイルの内容を取り扱いたいことが結構あります。通常、JavaとMicro$oft系は相性があんまりよくないのですが、ExcelファイルとJavaBeans?をマッピングするライブラリXLSBeansというのがあったので、早速試してみました。

ダウンロード・インストール

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

らにクラスパスに通しておきました。

やってみる

下記のような株価情報が書いてあるExcelファイルをJavaBeans?にマッピングします。

excel.png

銘柄ごとの株価情報(Excelの行)をひとつのJavaBeans?とします。クラス名はIStockとしました。

public interface IStock {
  String getMarket(); <-市場
  String getStockCode(); <-銘柄コード
  String getName(); <-銘柄名
  String getPrice(); <-現値
  String getVolume(); <-出来高
}

ExcelシートとJavaBeans?の指定

また、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の列のマッピング

また、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は省略してます...
}

以上でクラス構成は以下のようになりました。

classdiagram.png

Mainクラス

最後に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には市場がマッピングされないかなあと思ってましたが、まあ想定通りです。というかかなり簡単ですね、これ。。

このライブラリ、かなりよいかもっ。

これを使えばExcelからJava定義クラスを自動生成するとか、色々できそうですね。まあVBA使えばいいのかもしれませんが(´д`;)。。

関連リンク

このライブラリを用いて、ExcelでJavaBeans?してソースコードを自動生成するEclipseプラグインを作成しました。詳しくは

こちらをどうぞ。


この記事は

選択肢 投票
おもしろかった 26  
そうでもない 1  

Top / Java / ExcelとJavaBeansをマッピングするライブラリXLSBeansを使う

現在のアクセス:20947


添付ファイル: fileexcel.png 700件 [詳細] fileclassdiagram.png 686件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-04-05 (木) 08:29:10 (45d)