1. 帳票出力(Jasper/POI)

Templateの編集画面でExcelやPDFの出力定義を設定することで帳票出力機能を利用することが出来ます。

2. 帳票出力の作成

帳票出力機能を利用するために、Template定義に以下の設定を行わなければなりません。

  1. 帳票定義のTemplateを呼び出すActionクラスを作成します。

  2. Apache POI(Excel)またはJasperReports(PDF)用のテンプレートファイルを作成しておきます。

  3. Template定義の編集画面でテンプレートタイプを Report に、 Report TypeJasperReports または POI を選択し、作成したテンプレートファイルをアップロードします。

    • POIを利用する場合、JavaまたはGroovyを利用してOutput Logicを実装し、Template定義の OutPut Logic に設定します。

    • JasperReportsを利用する場合、Template定義で DataSourceParameters の設定項目 にRequestContextまたはSessionContextにセットしたAttribute名を設定します。

  4. Actionクラスが呼び出されるときに、帳票出力処理が実行されます。

3. 設定

Template定義の編集画面での設定項目

項目 内容

Report Type

出力ライブラリー形式を設定します。

以下の形式をサポートしてます。

JasperReports

JasperReports形式

POI

POI形式

Format

出力するファイルの形式を設定します。
ReportTypeにより、選択可能な形式が異なります。

JasperReportsの場合

PDF(Jasper)
XLS(Jasper)
XLSX(Jasper)

POIの場合

XLS(POI) ※POIのHSSFWorkbook形式のWorkbookを生成します。
XLSX(POI) ※POIのXSSFWorkbook形式のWorkbookを生成します。
XLSX(POI Streaming) ※POIのSXSSFWorkbook形式のWorkbookを生成します。

※PDF出力はJasperReports形式のみ対応しています。

File

各ReportTypeに従ったテンプレートファイルを設定します。
テンプレートファイルを変更する必要がない場合は選択する必要はありません。
未指定の場合は、既に登録済の「Saved File」が利用されます。

Password Attribute Name

出力するレポートに対してパスワードを設定する場合に、そのパスワード値をセットしたRequestのAttribute名を指定します。

パスワードは、ユーザに画面上で指定させてリクエストでもらったり、システム内部で固定したり、ランダムで設定してメール通知したり要件に応じて実装し、このTemplateを利用する前のCommandでここで指定したAttributeに対して、パスワードをセットしてください。

※パスワードはJasper、POIともにXLS形式には対応していません。Excelに対してパスワード指定する場合はXLSX形式を利用してください。

DataSource Attribute Name

Report Typeが JasperReports 形式用の設定です。
JasperFillManager.fillReport実行時のデータソースを設定することができます。

詳細は「JasperReports DataSource設定」を参照してください。

Parameters

Report Typeが JasperReports 形式用の設定です。
JasperReportsに対するパラメータが設定できます。

詳細は「JasperReports Parameters設定」を参照してください。

OutPut Logic

Report Typeが POI 形式用の設定です。
出力ロジックを以下の形式で設定できます。

詳細は「Poi OutPut Logicの設定」を参照してください。

3.1. JasperReports設定

JasperReports DataSource設定

JasperFillManager.fillReport実行時のデータソースを指定することができます。

このTemplateを利用する前のCommandでJRDataSourceを実装したクラスのインスタンスをAttributeにセットしてください。 そのAttribute名をここで指定することで、JasperFillManager.fillReport実行時にデータソースをセットします。 未設定の場合、JREmptyDataSourceをJasperFillManager.fillReportに渡します。

またEntityの検索結果などをデータソースとして利用したい場合は、

org.iplass.mtp.web.template.report.JasperReportingEntityDataSource

を利用することも可能です。 EntityのJavaMappingClassを利用していない場合、EntityにはgetXXXというメソッドがないため、 JRBeanCollectionDataSourceを使うのが難しくなります。 JasperReportingEntityDataSourceを利用することで、EntityのListをそのまま指定し、 Fieldとして利用することができます。

(例)
  • Entity

    テスト用のEntity定義を登録しておきます。
    Entity Setting

  • Command

    /**
     * 検索結果をJasperReportingEntityDataSourceとして「orderItems」Attributeにセット。
     */
    import org.iplass.mtp.ManagerLocator;
    import org.iplass.mtp.entity.Entity;
    import org.iplass.mtp.entity.EntityManager;
    import org.iplass.mtp.entity.query.Query;
    import org.iplass.mtp.entity.SearchResult;
    import org.iplass.mtp.entity.LoadOption;
    import org.iplass.mtp.entity.query.condition.predicate.Equals;
    import org.iplass.mtp.web.template.report.JasperReportingEntityDataSource;
    
    String oid = request.getParam("oid");
    request.setAttribute("oid", oid);
    
    EntityManager em = ManagerLocator.getInstance().getManager(EntityManager.class);
    
    //Order検索(OrderItemは別で取得するのでReferenceは取得しない)
    Entity order = em.load(oid, "test.report.Order", new LoadOption(false, false));
    request.setAttribute("order", order);
    
    //OrderItem検索
    Query query = new Query()
        .select("price", "quantity", "product.name", "product.price")
        .from("test.report.OrderItem")
        .where(new Equals("order.oid", oid));
    SearchResult<Entity> orderItems = em.searchEntity(query);
    
    //JasperReportingEntityDataSourceとしてEntityのListを格納
    request.setAttribute("orderItems", new JasperReportingEntityDataSource(orderItems.getList())); (1)
    1 JasperReportingEntityDataSourceとして「orderItems」Attributeにセット。
  • Template

    Template Setting DataSourceAttributeName Template
  • JasperReports

    Template Setting DataSourceAttributeName Jasper

JasperReports Parameters設定

JasperFillManager.fillReport実行時のパラメータにセットする値を指定することができます。

項目 内容

Value Type

パラメータとして渡す変数タイプを設定をします。

以下の形式をサポートしてます。

Parameter

通常のパラメータです。設定されている値をパラメータとして渡します。

SubReport

サブレポート用に別のTemplateとして登録したファイルをコンパイルしてパラメータで渡します。

Name

パラメータとして渡すMapに設定するKEY名を指定します。

Value

Value Typeが Parameter の場合に、 パラメータとして渡す値が格納されているAttribute名を指定します。 このTemplateを利用する前のCommandでこのAttributeに対して値をセットしてください。

(例) request.hoge

Template

Value Typeが SubReport の場合に、 サブレポート用のJasperReportsテンプレートがセットされているTemplate名を指定します。

パラメータとしてJasperReport形式にコンパイルした結果をセットします。

  • Template

    Template Setting ParametersAttributeName Template
  • JasperReports

    Template Setting ParametersAttributeName Jasper

3.2. 表示方法

作成したCommandクラスとTemplateを呼び出すActionクラスを作成します。

Action Setting Jasper
  1. 作成したCommandクラス

  2. 帳票出力Template定義

管理画面にログインし、http://hostname:port/{コンテキスト名}/{テナント名}/test/report/order?oid=xxx をアクセスすると、帳票出力処理が実行されます。

Report output Jasper
  1. パラメータとして指定されている部分

  2. データソースとして指定されている部分

3.3. Poi OutPut Logicの設定

OutPut Logicの実装方法は2種類あります。

JavaクラスによるOutPut Logicの実装

必ず org.iplass.mtp.web.template.report.PoiReportOutputLogic インターフェースクラスをimplementsし、実装して下さい。

サンプル
import  org.iplass.mtp.command.RequestContext;
import  org.iplass.mtp.web.template.report.PoiReportOutputLogic;
import  org.apache.poi.ss.usermodel.Workbook;

public class TutorialReportLogic  implements  PoiReportOutputLogic {

     @Override
     public void reportOutput(RequestContext context, Workbook book) {

        // 処理
        def sheet = book.getSheet("シート名"); (1)
        sheet.getRow(XXX).getCell(YYY).setCellValue("セルの値"); (2)
    }
}
1 シート名でテンプレートファイルのシートを取得します。
2 テンプレートシートのXXXの行のYYYのセルに値をセットします。
※ SXSSFWorkbookの場合、テンプレートとして設定してあるExcelに既に存在するRowを取得しようとしてもnullが返ってくるので、
「テンプレートのXXXのセルに値を設定する」といった利用はできません。Sheet#createRow(rowIndex)やRow#createCell(colIndex) を利用して、データをExcelに出力する時に利用されます。 詳しくは SXSSFWorkbookのConstructor Detailを参照してください。

GroovyによるOutPut Logicの実装

Groovyの記述形式で実装する事ができます。org.iplass.mtp.web.template.report.PoiReportOutputLogic インターフェースクラスのように以下のバインド変数がGroovyScriptで利用可能です。
利用可能なバインド変数は、編集ダイアログの「Notes」を参照してください。

バインド変数 内容

context

リクエストコンテキスト

book

ワークブック

3.4. 表示方法

(例)
  • Template

    Template Setting OutputLogic POI

    OutputLogicの実装

    import org.iplass.mtp.entity.Entity;
    import org.iplass.mtp.entity.EntityManager;
    import org.iplass.mtp.entity.LoadOption;
    import org.iplass.mtp.entity.SearchResult;
    import org.iplass.mtp.entity.query.Query;
    import org.iplass.mtp.entity.query.condition.predicate.Equals;
    
    def sheet = book.getSheet("order");
    String oid = context.getParam("oid");
    
    int rowNo = 1;
    def row = sheet.getRow(rowNo);
    row.getCell(4).setCellValue(oid);
    
    EntityManager em = manager(EntityManager.class);
    // Order検索(OrderItemは別で取得するのでReferenceは取得しない)
    Entity order = em.load(oid, "test.report.Order", new LoadOption(false, false));
    
    rowNo = 5;
    row = sheet.getRow(rowNo);
    row.getCell(0).setCellValue(order.orderNo);
    row.getCell(1).setCellValue(order.customer);
    row.getCell(2).setCellValue(order.address);
    row.getCell(3).setCellValue(order.mail);
    row.getCell(4).setCellValue(order.tel);
    
    // OrderItem検索
    Query query = new Query().select("price", "quantity", "product.name", "product.price")
            .from("test.report.OrderItem").where(new Equals("order.oid", oid));
    SearchResult<Entity> orderItems = em.searchEntity(query);
    
    rowNo = 9;
    for (Entity item : orderItems.getList()) {
        row = sheet.getRow(rowNo);
        row.getCell(0).setCellValue(item.product.name);
        row.getCell(2).setCellValue(item.quantity);
        row.getCell(3).setCellValue(item.product.price);
        row.getCell(4).setCellValue(item.price);
        rowNo++;
    }
  • Action

    Action Setting POI
    1. 今回はParameterMappingsを利用し、パスから oid を取得します。

    2. 作成した帳票出力Template定義。

管理画面にログインし、http://hostname:port/{コンテキストパス}/{テナント名}/test/report/orderPoi/xxx をアクセスすると、帳票出力処理が実行されます。

Report output POI
帳票出力(Jasper/POI)