ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

Excel to DMDL(Java8サンプル)

2014-04-02 22:13:14 | PG(Java)

ExcelファイルをJavaのPOIで読み込むことになったので、勉強の為にサンプルを作ってみた。せっかくなので出たばかりのJava8で(笑)

題材は、Asakusa Frameworkのデータモデル定義を記述したExcelファイルからDMDLファイルを作成するもの。
以前Excelマクロで作ったことはあるけど、今回はJavaで。

このプログラム(Excel to DMDL)の使い方としては、まず、RecordModelGeneratorを継承したクラスを作る。
これは、データモデル名やプロパティー名・データ型などをExcelシートのどのセルから読み込むかを記述するもの。(Excelファイルのレイアウトは人によって違うだろうから)
主処理はExcelToDmdlというクラスであり、このクラスを継承して前述のModelGeneratorのインスタンスを生成するメソッドとmainメソッドを記述すれば、そこから実行することが出来る。


ExcelToDmdlクラスはGenerateMainというクラスを呼び出し、そこがExcelファイルを読み込んで、シート毎にModelGeneratorを呼び出す。

Java8を使っているところは、まず、ExcelToDmdlに定義されたModelGeneratorインスタンス生成メソッドを、GenerateMainに渡しているところ。
GenerateMain側はSupplierインターフェースを使用し、メソッド参照(this::createGenerator)でメソッドを渡している。
今回の様に値を返す関数としては、Supplier(供給者)を使うのが分かりやすい。

メソッド参照やラムダ式で処理(抽象クラス)の渡し方が簡単になったのもさる事ながら、Supplierのように汎用的に使えるインターフェースが整備された事もありがたい。


Excelのワークシート一覧を取得する部分(GenerateMain#getSheetNames())ではStreamやfilterを使っている。
データの絞り込みをfilterメソッドで行えるのはやはり分かりやすい。

取ってきたワークシート一覧に対して1個ずつModelGeneratorを作って呼び出しているが、ここではListのforEachメソッドを使っている。
でも今回のようなケースでは、従来通りの拡張for文で良かったかも?

ちなみに、ModelGeneratorの呼び出しで例外が発生した場合、それをキャッチしてシート名を出力し、例外はそのまま再スローしている。
例外の発生した場所はスタックトレースを見れば分かるけど、そのときに処理していたシート名は自分で出力しておかないとデバッグしづらいから。
このキャッチはExceptionクラスで捕捉しているが、メソッドにはthrows Exceptionを記述していない。これはJava7の安全な再スロー機能。 


他に使っているのはOptionalクラス。値の有無を表現することが出来るクラス。値が存在する場合はその値そのものを保持する。
Excelのセルは値が無い場合があるので、セルの値の取得結果を保持するのにちょうどいい。
値の有無をif文で判定するとわざわざOptionalクラスを使う意味は無いが、OptionalのifPresentメソッドを使うとすっきり書ける。
ModelGeneratorクラスのwriteModelDescription()やRecordModelGeneratorクラスのwriteProperties()とかで使っている。


Java8で追加された関数プログラミングっぽいメソッドはScalaに比べれば足りないけれども、実際にJava8でコーディングしてみると、それでもかなり便利だった(笑) 


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« AsakusaFW0.6.1便利な小修正 | トップ | アニメ『ノラガミ』 »
最新の画像もっと見る

コメントを投稿

PG(Java)」カテゴリの最新記事