excella-reportsを使ってみた

2014-11-24T00:00:00+00:00 Java

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でテンプレート書いて帳簿出力的なのを作りたいとかであればこういうの使ってみてもいいんじゃないかと

okhttp+mockwebserver POIでExcelを生成する