第1回:電子帳票システムの種類と適用範囲

はじめに
   皆さんはじめまして。本連載を担当します、ビーブレイクシステムズの横井です。私の会社はオープンソースソフトウェア(以下OSSとする)を使用しての業務システムの構築を得意としている会社で、今回のテーマである「帳票」についてもOSSを使用し、トータルコストの面でユーザから高い評価を得ています。本連載では実際の適用事例を交えながら、OSS電子帳票という選択肢を皆さんにご提供できればと思っています。

   第1回の今回は電子帳票の全体像に触れ、第2回以降では実際に使用している技術要素について説明します。なお、本連載ではOSS電子帳票の実現手段として、表1のツールを取り上げていく予定です。

iReport
JasperReports用帳票デザイン・実行環境。PDF、Excel、HTML等での帳票が作成可能。
JFreeChart
Javaからグラフを生成するためのライブラリ。
POI
JavaからExcelやWordを操作するためのライブラリ。

表1:OSS電子帳票ツール


   本連載が、ユーザにとって高付加価値、低価格のシステムを実現する一助となれば幸いです。


帳票とは

   帳票といった場合に、あなたは何をイメージするでしょうか。一般的には、発注書や請求書などのように最終的には紙媒体として出力するようなデータをイメージする人が多いと思いますが、最近では紙媒体に限らず「流通している様々な情報を整理してまとめたもの」といった意味で使われることが多く、HTMLやPDF、Excel、メール、FAXなども含みます。つまり、出力された物を人間が確認するようなシステムには必ず帳票が存在するというわけです。

   また帳票は、請求書、発注書、受注書などの定型のものと、分析系の非定型なものとに2分でき、それぞれの目的によって適した表示形式も変わってきます。




定型帳票

   請求書、発注書、受注書など決まったフォーマットで出力される帳票は、用途も明確なためイメージしやすいかと思います。定型帳票ではあらかじめ罫線や静的な文言などの定型部分をテンプレートとして用意しておき、中身のデータをデータベースなどの外部リソースから取得するといった方法で出力します。

   後ほど紹介する、「不動産物件管理システム」も定型帳票の例になります。


非定型帳票

   主に分析に使われる非定型の帳票は、分析の目的やどのような切り口で分析するかによって形式も千差万別で、データ量や教育にかけられる時間も加味して実現方法を検討する必要があります。データ量が多く、様々な分析を行うのであればOLAPツールを使用した方が良いでしょうし、データ量がそれほど多くなければExcelで出力してピボットテーブル、ある程度決まったパターンのみであればテンプレートとグラフを使用する等の方法が考えられます。同一のシステムでも、管理者や担当者、ユーザによっては上記パターンを組み合わせた方が良いこともあるかと思います。

   後ほど紹介する、「コンサルタント会社請求管理システム」は非定型帳票の例になります。

 
(1)テンプレートXMLのコンパイル

   テンプレートXMLを読み込んでJasperReportオブジェクトを生成しています。結果を.jasperファイルへ出力する場合は、"JasperCompileManager.compileReportToFile()"を使用します。


(2)パラメータの生成

   (4)データの動的バインドで使用するパラメータを生成しています。今回のプログラムでは、見積書の宛て名部分で使用する"CLIENT_NAME"というパラメータを設定しています。


(3)データソースの生成

   (4)データの動的バインドで使用するデータソースを生成しています。今回はJDBCをデータソースとして使用するので、JDBCのコネクションを生成しています。


(4)データの動的バインド

   JasperReportオブジェクトに(2)、(3)で作成したデータをバインドして帳票のイメージを作成しています。コンパイル済みの.jasperファイルを読み込んでデータをバインドする場合は、"JasperFillManager.fillReport()"の第1引数に.jasperファイルのパスを指定します。

   また、バインドした結果を.jrprintファイルに出力する場合は、"JasperFillManager.fillReportToFile()"を使用します。


(5)PDFへ出力

   バインドした結果のJasperPrintオブジェクトと出力先のパスからPDFを出力しています。なお、.jasperファイルを読み込んで出力する場合は、以下のようにシンプルに記述できます。

JasperPrintからPDFを出力
import java.sql.*;
import java.util.*;
import net.sf.jasperreports.engine.*;

/**
* JasperReportのサンプル
*
* .jasperファイルを読み込んでPDFに出力する
*/
public class JasperSample2 {

public static void main(String[] args) {
// コンパイル済みファイルのパス
String jasperPath = "./template/estimate.jasper";
// 出力するPDFファイルのパス
String destPath = "./output/JasperSample2.pdf";

Connection con = null;
try {
// パラメータの作成
Map paramMap = new HashMap();
paramMap.put("CLIENT_NAME", "ビーブレイクシステムズ");

// データソースの生成
Class.forName("org.postgresql.Driver");
con = DriverManager.getConnection(
"jdbc:postgresql://hostname:port/instance", "user","pass");

// PDFへ出力(内部的にデータのバインドと出力を行っている)
JasperRunManager.runReportToPdfFile( jasperPath, destPath, paramMap, con);
} catch (Exception ex) {
ex.printStackTrace();
}
finally{
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

 
その他の出力形式

   PDFへの出力については分かっていただけたと思いますので、その他の出力方法について説明します。JasperReportsでは出力形式ごとに出力処理クラス(Exporter)と、出力時のオプションを指定するための出力パラメータクラス(ExporterParameter)が用意されています。PDF出力の例では出力処理クラスは出てきませんでしたが、出力処理で内部的に利用されています。以下の表に出力処理クラスと出力パラメータクラスの一覧をしめします。

出力処理クラス出力パラメータクラス対応出力形式
JRCsvExpoterJRCsvExporterParameterCSV出力用Exporter
JRGraphics2DExporterJRGraphics2DExporterParameterGraphics2D出力用Exporter
JRHtmlExporterJRHtmlExporterParameterHTML出力用Exporter
JRPdfExporterJRPdfExporterParameterPDF出力用Exporter
JRPrintServiceExporterJRPrintServiceExporterParameterプリンタ出力用Exporter
JRXlsExporterJRXlsExporterParameterExcel出力用Exporter
JRXmlExporterJRXmlExporterParameterXML用Exporter

表:出力パラメータクラス一覧


   出力処理クラスの基本的な使い方は、どの出力処理クラスでもそれほど変わりませんので、プリンタ出力の場合を例にとって説明します。

プリンタ出力
// データの動的バインド
JasperPrint print = JasperFillManager.fillReport(jasperPath, paramMap, con);

// (1)プリンタ用出力クラスの生成
JRPrintServiceExporter exporter = new JRPrintServiceExporter();

// (2)出力対象のJasperPrintの設定
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);

// (3)印刷プリンタをプリンタ名で指定
HashPrintServiceAttributeSet printAttribute = new HashPrintServiceAttributeSet();
printAttribute.add( new PrinterName("FinePrint 2000", Locale.getDefault()));
exporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE_ATTRIBUTE_SET, printAttribute);

// (4)出力の実行
exporter.exportReport();
(1)プリンタ用出力クラスの生成

   出力形式に応じて、対応する出力処理クラスを生成します。


(2)出力対象のJasperPrintの設定

   出力処理クラスを使用して出力するJasperPrintオブジェクトを設定します。


(3)印刷プリンタをプリンタ名で指定

   ここが出力処理クラスを使用するときのポイントとなる部分です。今回はプリンタから印刷するため、JRPrintServiceExporterParameterのパラメータを指定しています。このように出力処理クラスにどのようなパラメータを渡すかで、出力処理クラスの振る舞いを変更することができます。これだけだとイメージが掴みづらいかもしれませんので、以下にもうひとつパラメータ設定の例をしめします。

パスワード付きPDFの出力
// Exporterの生成
JRPdfExporter exporter = new JRPdfExporter();

// 出力オブジェクトの設定
exporter.setParameter( JRPdfExporterParameter.JASPER_PRINT, print);
// 出力先の設定
exporter.setParameter( JRPdfExporterParameter.OUTPUT_FILE_NAME, destPath);
// パスワード保護を有効にする
exporter.setParameter(JRPdfExporterParameter.IS_ENCRYPTED, Boolean.TRUE);
// パスワードの設定
exporter.setParameter(JRPdfExporterParameter.USER_PASSWORD, "jasper");
exporter.setParameter(JRPdfExporterParameter.OWNER_PASSWORD, "reports");

// 出力の実行
exporter.exportReport();

   なお、プリンタの指定で悩む場合が多いようですので、現在設定されているプリントサービス情報を表示するプログラムを以下にしめします。悩んだときはこちらの出力結果を参考にしてください。

プリントサービス情報の出力
import javax.print.*;
import javax.print.attribute.*;

/**
* 現在設定されているプリントサービスの情報を出力する
*/
public class PrintServiceWriter {

public static void main(String[] args) {

// プリントサービス一覧の取得
PrintService[] myPrintServices = PrintServiceLookup.lookupPrintServices(null, null);

for( int cnt = 0; cnt < myPrintServices.length; cnt++){
System.out.println("=====Print Service [" + cnt + "]=====");
PrintService myPrintService = myPrintServices[ cnt];
PrintServiceAttributeSet attributeSet = myPrintService.getAttributes();

// プリントサービスの属性を出力
Attribute[] attr = attributeSet.toArray();

System.out.println("    ------Print Service Attirbute-----");
for (int i = 0; i < attr.length; i++) {
System.out.println( "    " + attr[i].getClass().toString() + "='" + attr[i] + "'");
}

// そのプリントサービスがサポートするフレバーを出力
DocFlavor[] glavors = myPrintService.getSupportedDocFlavors();

DocFlavor flavor;
System.out.println("    ------Print Service Flavor-----");
for (int i = 0; i < glavors.length; i++) {
flavor = glavors[i];
System.out.println("    " + flavor.toString());
}
}
}
}
(4)出力の実行

   設定したJasperPrintやパラメータの内容に従い出力を実行します。

 
Webアプリケーションへの組み込み
   最後にWebアプリケーションへの組み込み方法について説明します。設定に関してはJasperReportsのデモにwebappというWebアプリケーション用のデモが含まれていますので、そちらを参考にして行ってください。

   基本的な流れは今まで説明してきた内容と変わりませんので、ポイントとなる部分についてのみ説明します。

Webアプリケーションへの組み込み方法
// (1)byte[]としてPDFを生成
byte[] bytes = JasperRunManager.runReportToPdf( jasperPath, paramMap, con);

// (2)出力設定
response.setContentType("application/pdf");
response.setContentLength(bytes.length);

// (3)生成したbyte[]をストリームに出力
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
(1)byte[]としてPDFを生成

   ストリームに対して書き込むために、byte[]としてPDFを生成します。


(2)出力設定

   この部分は通常のサーブレットと同様にコンテンツのタイプとデータ長を設定しています。


(3)生成したbyte[]を出力

   生成した"ServletOutputStrem"に対して作成したbyte[]を書き込みます。


まとめ

   今回でiReportの説明は終了ですが、いかがでしたでしょうか。定型の帳票であれば、かなりの範囲がiReportでカバーできる事がお分かりいただけたのではないかと思います。次回からは、iReportのグラフ出力にも使われているJFreeChartというJavaからグラフを生成するためのライブラリについて説明します。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值