Jaspersoft Studioを使用して帳票作成してみた

こんにちは。ソフトウェア開発をしていると領収証や請求書などの帳票を作成する機会があると思います。
最近、初めて帳票を改修する機会がありました。実装を見れば、ある程度何となくでも行けそうな箇所もありましたが、今回主に以下3点について改修したく、その際に知ったことを中心に改修箇所のポイントとして記事にすることにしました。
① 帳票に新たな項目と値を表示させたい
② 画像の変更をしたい
③ 明細部分の表示の実装を変更したい
※本記事は、帳票作成したことはないが、 既存プロジェクトに帳票がすでに作成されており、その改修作業をする人向けに記載をしております。そのため、実際のソースコードを追えば、 ある程度はできるであろうということを前提としております。

目次

● 環境
● はじめに
● 帳票作成ツール
● ポイント①:データソースの作成・紐づけ
● ポイント②:イメージの追加
● ポイント③:メインレポート内にサブレポートの埋め込み
● javaを使用したコンパイル・レポート出力方法
● Jaspersoft studio を使用したレポート出力方法
● まとめ

環境

本記事では、下記環境を前提に検証を行っております。
・プログラミング言語:Java (jdk1.8.0_77)
・帳票ライブラリ:JasperReports (v6.4.0)
・帳票作成ツール:Jaspersoft Studio (v6.16.0)

はじめに

帳票を作成するためには、「JasperReports」と呼ばれるJavaで動作するオープンソースの帳票出力ライブラリを使用します。
JasperReportsでは、帳票のレイアウト等が記述されたXMLファイルを読み込んで帳票を出力します。

また、作成されたレポートは、PDF、RTF、HTML/XHTML、MS Word(Docx)、MS Excel(XLS)、Open Officeなど様々な形式で出力することができます。出力方法は、Javaを使用した出力方法 または Jaspersoft Studioを使用した出力方法 を参照ください。

※ 拡張子は「.jrxml」です。
※ 「.jrxml」をコンパイルすると、「.jasper」という拡張子ファイルになります。

JasperReportsについて詳しく知りたい方は、こちら を参照ください。

帳票作成ツール

まずは、帳票作成ツールをご紹介します。
帳票を作成する際によく使用されるツールが、「Jaspersoft Studio」です。これは、レポートのレイアウトをマウス操作で設計できるツールです。
テンプレートファイルはXMLファイルの為、手書きすることも可能ですが、こういったデザインツールを使用した方が作業が捗ります。
ダウンロードは、こちら から

※本ページでは、プロジェクトの作成方法および基本的な使用方法の説明は割愛いたします。詳しく知りたい方は、こちら を参照ください。

ポイント①:データソースの作成・紐づけ

データベースからの取得結果やJava側で処理した値などを帳票に出力するには、帳票の項目へのマッピングが必要になります。マッピングさせるうえでの注意点は、以下2点です。

<1点目>
 Javaファイルとjrxmlファイルで項目名を完全一致させること

<2点目>
 Javaファイルとjrxmlファイルで項目の型が同じであること

以下は、JavaファイルJaspersoft studioを使用したデザインイメージそれをjrxmlファイルで見た場合の3つを表しております。
見ていただけると、同じ項目名・型になっていることがお分かりいただけると思います。

Javaソース

        // フィールドの設定値
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
        
        // パラメーターの設定値
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("tel", "090-9999-9999");

Jaspersoft studioを使用したデザインイメージ

jrxmlファイル

jrxmlファイルでは、項目名と型を以下のように<field>または<parameter>を使用して宣言します。
<field name="項目名" class="型"/>
<parameter name="項目名" class="型"/>
このように宣言してあげることで、それ以降、<textField>内などで使用が可能となります。

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.16.0.final using JasperReports Library version 6.16.0-48579d909b7943b64690c65c71e07e0b80981928  -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="MyProj" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" whenResourceMissingType="Error" uuid="3ea3dc26-1bc4-4f32-b3d4-e877955c227d">
	<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
	<property name="net.sf.jasperreports.print.create.bookmarks" value="false"/>
	<import value="java.io.ByteArrayInputStream"/>
	<parameter name="tel" class="java.lang.String"/>
	<field name="name" class="java.lang.String"/>
	<pageHeader>
		<band height="252">
			<textField isBlankWhenNull="true">
				<reportElement key="" x="20" y="10" width="300" height="30" uuid="856ed887-d16d-462c-b786-9d1d44619953">
					<property name="com.jaspersoft.studio.unit.x" value="pixel"/>
					<property name="com.jaspersoft.studio.unit.height" value="pixel"/>
				</reportElement>
				<textElement verticalAlignment="Middle">
					<font fontName="IPA ゴシック" size="24" pdfFontName="HeiseiKakuGo-W5" pdfEncoding="UniJIS-UCS2-HW-H" isPdfEmbedded="false"/>
				</textElement>
				<textFieldExpression><![CDATA["My name is " + $F{name}]]></textFieldExpression>
			</textField>
			<textField isBlankWhenNull="true">
				<reportElement key="" x="20" y="48" width="230" height="32" uuid="1dc9d4a3-e551-4433-b948-544f90d6dbf8">
					<property name="com.jaspersoft.studio.unit.x" value="pixel"/>
					<property name="com.jaspersoft.studio.unit.height" value="pixel"/>
				</reportElement>
				<textElement verticalAlignment="Middle">
					<font fontName="IPA ゴシック" size="24" pdfFontName="HeiseiKakuGo-W5" pdfEncoding="UniJIS-UCS2-HW-H" isPdfEmbedded="false"/>
				</textElement>
				<textFieldExpression><![CDATA["TEL : " + $P{tel}]]></textFieldExpression>
			</textField>
		</band>
	</pageHeader>
</jasperReport>

ポイント②:イメージの追加

イメージの追加方法には、主に以下の2点があります。

【方法①:画像が格納されているパスを記載する方法】
 こちらは一般的に使用されている方法で、プロジェクトにイメージを保存し、そのファイルパスを指定します。

<image>
  <reportElement x="200" y="10" width="210" height="80"/>
  <imageExpression class="Java.lang.String"><![CDATA["./sample.jpg"]]></imageExpression>
</image>

【方法②:Base64を使用する方法】
  Base64とは、64進数を意味する言葉で、すべてのデータをアルファベット(a~zA~z)と数字(0~9)、一部の記号(+,/)の64文字で表すエンコード方式です 。
そのため、方法①:ファイルパスの指定のようにプロジェクトに画像を保存する必要がありません。Base64について詳しく知りたい方は、こちら を参照ください。
手順は以下の通りです。

<手順①:Base64エンコーダーでBase64形式に変換>
  Base64エンコーダーと呼ばれるBase64形式にデータを変換してくれるソフトを使用します。ネットで検索するといくつも出てきますので、それを使用し、Base64形式に変換します。今回は、こちら を使用しました。

<手順②:コードの貼り付け>
 Base64形式のコードを、<parameter> に設定します。

<parameter name="image" class="java.lang.String">
 <defaultValueExpression><![CDATA["iVBORw0KGgoAAAANSUhEUgAABkA(長すぎるため、省略)AAD2EAAA8jWdB7OD"]]></defaultValueExpression>
</parameter>
<image hAlign="Left" vAlign="Bottom">
	<reportElement x="403" y="168" width="125" height="41" uuid="3261ff18-10ac-443e-8ee6-1ec3d3e8a3d9">
		<property name="com.jaspersoft.studio.unit.x" value="pixel"/>
		<property name="com.jaspersoft.studio.unit.y" value="pixel"/>
		<property name="com.jaspersoft.studio.unit.height" value="pixel"/>
		<property name="com.jaspersoft.studio.unit.width" value="pixel"/>
	</reportElement>
	<imageExpression><![CDATA[new java.io.ByteArrayInputStream(javax.xml.bind.DatatypeConverter.parseBase64Binary($P{image}))]]></imageExpression>
</image>

ポイント③:メインレポート内にサブレポートの埋め込み

請求書などを作成していると、商品の明細を出力することがあり、出力するレコードは可変になるパターンがほとんどです。その際に使用するのが、サブレポート機能です。
サブレポート機能とは、メイン帳票の中に複数の別の帳票(サブレポート)を配置することができる機能です。

ポイントとなるのは、以下2点です。

1:サブレポートとなるjrxmlファイルのパスの設定
  <subreportExpression>タグ内に、サブレポートとなるjrxmlファイルのパスを記載します。

2:サブレポートに渡す値の引数の設定
  <dataSourceExpression>タブ内に、「
net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(引数) 」を記載し、サブレポートに渡す値を設定します。

<subreport overflowType="Stretch">
 <reportElement key="" stretchType="RelativeToTallestObject" mode="Transparent" x="-20" y="6" width="595" height="165" isRemoveLineWhenBlank="true" printWhenGroupChanges="Group1" uuid="12fdf542-a1d5-4e85-9ee7-c955f413a668">
  <property name="com.jaspersoft.studio.unit.height" value="pixel"/>
  <property name="com.jaspersoft.studio.unit.y" value="pixel"/>				  
 </reportElement>				 
 <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{lineDataList})]]></dataSourceExpression>				 
 <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "subreport.jasper"]]></subreportExpression>
</subreport>

Javaを使用したコンパイル・レポート出力方法

実際に java から帳票を生成してみます。今回は、PDFを出力します。
流れは以下の通りです。

① パラメータ・データソースの生成

 帳票に出力したいデータを生成します。

② jrxmlファイルのコンパイル

対象の jrxmlファイルを読み込んで、「JasperCompileManager.compileReportToFile(対象のファイルパス)」を使用し、 jasperファイルへコンパイルします。

③ データバインド

 「 JasperFillManager.fillReport(JasperReport, パラメータ, データソース)」を使用し、対象のjasperファイルへデータをバインドします。

④ PDF出力

exportReportToPdfFile(生成されたレポートオブジェクト, 生成ファイル名)」に生成したいファイル名を引数に指定し、PDFを出力します。なお、
exportReportToPdfFile()」 を変更することで、HTMLやXML等で出力することが可能です。こちら が参考になります。

以下は、実際に作成してみたソースコード例です。

    public static void main(String[] args) throws Exception {

        // フィールド(データソース)の設定
        TestDetailDto testDetailDto = new TestDetailDto();
        testDetailDto.setName("tanaka taro");
        List<?> dataSourceList = Arrays.asList(testDetailDto);
        JRDataSource res = new JRBeanCollectionDataSource(dataSourceList);

        // パラメーターの設定
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("tel", "090-9999-9999");

        try {
            // jrxmlファイルをjasperファイルへコンパイル
            File jrxmlFile = new File("sample.jrxml");
            JasperReport report = JasperCompileManager.compileReport(jrxmlFile.getAbsolutePath());
            // パラメータとデータソースを埋め込む
            JasperPrint jasperPrint = JasperFillManager.fillReport(report, parameters, res);
            // PDF出力
            JasperExportManager.exportReportToPdfFile(jasperPrint, "sample.pdf");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Jaspersoft studio を使用したレポート出力方法

Jaspersoft studioでは、作成したレポートを様々な形式で出力することができます。これは、作成後に[Preview]画面から出力したい形式を選択することで出力することが可能です。

まとめ

今回は、帳票出力する際に使用されるツールとjrxmlファイルのソースコードの書き方をいくつかポイントを絞ってご紹介しました。Jaspersoft studio は、帳票作成にはかかせないツールであり、柔軟な帳票を作成することができます。また、jrxmlファイル内で、コードがどう記載されているかを知るということが重要です。コードがわかるようになると、ある程度のことは Jaspersoft studio を使用せずとも、改修できるようになると思います。 ぜひみなさんもいろいろな帳票を作成してみてください。