excella-reportsを使ってみた
excellaを使って、Excelをテンプレートとして読み込んでPDFとして出力してみた
出力概要
excella-reportsのサンプルに入ってるExcelをちょっといじって
的なのをPDFにエクスポートできるように作る
環境構築
上記のリンクからcoreとreportsのライブラリを取ってくる。あとはそれをクラスパスにぶっこむだけ
ベースとなるExcelファイルを作成
な感じで
- ${client_name}は単純埋め込み
- $BR[]{販売データ} は配列オブジェクトを展開して埋め込み(12行目のセルにて埋め込まれるデータはその繰り返しオブジェクトのデータ)
- $SUM($BR[]:販売データ.price)は配列オブジェクトのpriceデータを集計
- $SUM($BR[]:販売データ.tax)は配列オブジェクトのtaxデータを集計
- $SUM($BR[]:販売データ.priceInTax)は配列オブジェクトのpriceInTaxを集計
的な感じでExcelに値を埋め込むようにテンプレート展開を記述する。一応$SUMのような集計を行う機能自体はあるけど、普通に単純埋め込みの方が良さそうな気もする
Main.java
import java.util.HashMap;
import java.util.Map;
import org.bbreak.excella.reports.exporter.OoPdfExporter;
import org.bbreak.excella.reports.model.ReportBook;
import org.bbreak.excella.reports.model.ReportSheet;
import org.bbreak.excella.reports.processor.ReportProcessor;
import org.bbreak.excella.reports.tag.BlockRowRepeatParamParser;
import org.bbreak.excella.reports.tag.SingleParamParser;
public class Main {
private static final Item[] ITEMS = new Item[] {
new Item("A", 100, 10),
new Item("B", 200, 20),
new Item("C", 300, 30)
};
public static void main(String[] args) throws Exception {
// pdfでエクスポートする際には設定しておいた方が無難かも
System.setProperty("java.io.tmpdir", "/tmp/");
ReportBook rb = new ReportBook(
Main.class.getResource("sample1.xls").getFile(),
"out1", // Exporterのextensionによって拡張子は自動で付与される
OoPdfExporter.FORMAT_TYPE
);
ReportSheet sheet = new ReportSheet("請求書");
Map<String, Object> extra_params = new HashMap<String, Object>(1);
extra_params.put("client_name", "株式会社ほげ");
// Mapじゃなくてもsheet.addParamでやればいい
sheet.addParams(SingleParamParser.DEFAULT_TAG, extra_params);
sheet.addParam(
BlockRowRepeatParamParser.DEFAULT_TAG,
"販売データ",
ITEMS
);
rb.addReportSheet(sheet);
ReportProcessor processor = new ReportProcessor();
processor.process(rb);
}
}
ってな感じで単純埋め込みで必要なclient_nameをaddParamsでMapで突っ込んで、$BRで必要なBlockRowRepeatParamな販売データを配列オブジェクトを突っ込む
実行結果
っていうようなPDFが出来上がる(PDFでエクスポートする際はOpenOfficeの機能を用いて出力される模様なのでその辺のパッケージが必要かと)
んまぁそこまでがっつりと書いてないけど、まぁ詳しいことはドキュメント読めってことで
てな感じでちょっとExcelでテンプレート書いて帳簿出力的なのを作りたいとかであればこういうの使ってみてもいいんじゃないかと