トップ 一覧 置換 検索 ヘルプ RSS ログイン

iReportの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
http://www.ponpo.com/jrs/jpn/intoro.html
http://jasperforge.org/jaspersoft/opensource/business_intelligence/ireport/index.php
http://itextpdf.sourceforge.net/
!!!iReportの起動オプション
 -cp:p D:\data\Development_tools\java\JDBC\oracle\ojdbc6.jar
でクラスパスを指定して起動できる。

!!!iReport & JasperReports で日本語を表示する方法
!!フォントをPDFに埋め込まない方法
!iTextAsian.jarを取得
http://itextpdf.sourceforge.net/
から iTextAsian.jar をダウンロード
※必要に応じて iTextAsianCmaps.jar もダウンロードする
{{ref iTextAsian.jar}}
{{ref iTextAsianCmaps.jar}}
{{word コンパイルの時にクラスパスに追加するく,red}}

!iReport で Pdf Font name を設定する
,,
,HeiseiKakuGo-W5,ゴシック
,HeiseiMin-W3,明朝
のいずれか

!iReport で Pdf Encoding の設定する
,,
,UniJIS-UCS2-H,Adobe-Japan1のUnicodeエンコーディング
,UniJIS-UCS2-V,UniJIS-UCS2-Hの縦書きエンコーディング
,UniJIS-UCS2-HW-H,UniJIS-UCS2-Hと同じ、ただし英文字を半角に置き換える
,UniJIS-UCS2-HW-V,UniJIS-UCS2-HW-Hの縦書きエンコーディング 

のいずれか

!!PDF にフォントを埋め込む方法
!iReport で Pdf font name を設定する
フォントを埋め込む場合は、 Pdf font name に 埋め込むフォントのファイル名を書く

 ipag.ttf
{{word フルパスではなく、ファイル名のみを書く,#FF0000}}
{{word フォントファイルがある場所はクラスパスに追加する,#FF0000}}

!iReport で Pdf embedded を設定する
Pdf embeddedを
 true
に設定する

!iReport で Pdf encoding  を設定する
Pdf encoding を
,,
,Identity-H,横書き
,Identity-V,縦書き
に設定する

!!!使い方
{{ref jasper_test.zip}} サンプル
!基本
+ソースからもらうパラメータ、フィールドを必要に応じて追加する
+追加したパラメータ、フィールドを使ってTextFieldやサブフォーム、グラフを追加
※ソースコンパイル時にクラスが無いって表示されたときは、iReportのディレクトリ以下からjarファイルを探して、それっぽいjarファイルをクラスパスに追加。

!ソースからデータを渡す1
2次元配列からデータを出力するデータソースを作る
{{code Java,
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRField;
import net.sf.jasperreports.engine.JRRewindableDataSource;
import net.sf.jasperreports.engine.JRRuntimeException;

public class ArrayDataSource implements JRRewindableDataSource {
  private int currentRow;
  private Object[][] records;
  private Object[] currentRecord;
  private Map columnNamesMap = new HashMap();
  
  
  public ArrayDataSource(Object[][] records, String[] columnNames) {
    this.records = records;
    if (columnNames != null) {
      for (int i = 0; i < columnNames.length; i++) {
        columnNamesMap.put(columnNames[i], Integer.valueOf(i));
      }
    }
    currentRow = -1;
  }
  
  
  public boolean next() {
    currentRow++;
    
    return currentRow < records.length;
  }
  
  
  public Object getFieldValue(JRField jrField) {
    Integer fieldIndex = (Integer)columnNamesMap.get(jrField.getName());
    
    if (fieldIndex == null) {
      throw new JRRuntimeException("Field \"" + jrField.getName() + "\" not found in data source.");
    }
    
    return records[currentRow][fieldIndex.intValue()];
  }
  
  public void moveFirst() {
    currentRow = -1;
  }
 
  
}
}}

出力する
{{code Java,
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.design.*;
import net.sf.jasperreports.view.JasperViewer;
import net.sf.jasperreports.engine.data.*;

import net.sf.jasperreports.engine.util.*; 
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import java.util.*;
import java.io.*;

public class test2 {
  
  public static void main(String args[]){
    try{
      // JasperDesign jasperDesign = JRXmlLoader.load("report/report.jrxml");
      // JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
      JasperReport jasperReport = (JasperReport)JRLoader.loadObject("report/report.jasper");
      
      Map parameters = new HashMap();
      parameters.put("Title", "Basic JasperReport");
      parameters.put("MaxSalary", new Double(25000.00));
      
      
      String[] header = new String[] {"name","cost"};
      Object[][] data = new Object[3][2];
      data[0][0] = "test1";
      data[0][1] = "1000";
      data[1][0] = "test2";
      data[1][1] = "3000";
      data[2][0] = "てすと";
      data[2][1] = "4000";
      
      ArrayDataSource ds = new ArrayDataSource(data,header );
      JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
        parameters, ds);
      
      // You can use JasperPrint to create PDF
      JasperExportManager.exportReportToPdfFile(jasperPrint, "BasicReport.pdf");
      
    } catch (Exception e){
      e.printStackTrace();
    }
  }
}
}}
!ソースからデータを渡す2
3.7.6には ListOfArrayDataSource が追加された。
      String[] header = new String[] {"name","cost"};
      Vector vec = new Vector();
      vec.add(new Object[]{"test", "100"});
      vec.add(new Object[]{"test1","200"});
      vec.add(new Object[]{"あいうえお","200"});
      
      ListOfArrayDataSource ds = new ListOfArrayDataSource(vec,header );
      JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
        parameters, ds);
と言う風に使えるはず・・・。

!ソースからデータを渡す3
 Vector vec = new Vector();
 HashMap map = new HashMap();
 map.put("BU","001");
 map.put("KA","A");
 map.put("NAME","hoge");
 map.put("COST",new Double(2));
 vec.add(map);
      
 map = new HashMap();
 map.put("BU","001");
 map.put("KA","A");
 map.put("NAME","hoge2");
 map.put("COST",new Double(2));
 vec.add(map);
 
 JRMapCollectionDataSource ds = new JRMapCollectionDataSource(vec);
 JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
      parameters, ds);

※$F{BU} や $F{KA}などを使えるように、iReportでフィールドを追加する
!サブレポート用のデータをソースから渡す
パラメータ用のMapに含めて渡してしまえばいい。
 parameters.put("subdata",new JRMapCollectionDataSource(vec))

$P{subdata} を使えるように、iReportでパラメータを追加する
!グラフの使い方
円グラフの場合はこんな感じ。
  vec = new Vector();
  map = new HashMap();
  map.put("項目","項目1");
  map.put("value",1);
  vec.add(map);
     
  map = new HashMap();
  map.put("項目","項目2");
  map.put("value",2);
  vec.add(map);

折れ線グラフの場合は
  vec = new Vector();
  map = new HashMap();
  map.put("項目","項目1");
  map.put("カテゴリ","カテゴリ1");
  map.put("value",1);
  vec.add(map);
  
  map = new HashMap();
  map.put("項目","項目1");
  map.put("カテゴリ","カテゴリ2");
  map.put("value",2);
  vec.add(map);
  
  map = new HashMap();
  map.put("項目","項目2");
  map.put("カテゴリ","カテゴリ1");
  map.put("value",1);
  vec.add(map);
  
  map = new HashMap();
  map.put("項目","項目2");
  map.put("カテゴリ","カテゴリ2");
  map.put("value",4);
  vec.add(map);
な感じでデータを送る。Series に項目nを設定すると、項目毎にグループ化を行って出力される。

!プリンタ直印刷
      PrintRequestAttributeSet atts = new HashPrintRequestAttributeSet();
      atts.add(new NumberUp(2)); // Nアップの指定
      atts.add(new Copies(5)); // 部数の指定
      atts.add(MediaSizeName.ISO_A4); // サイズの指定
      atts.add(OrientationRequested.PORTRAIT); // 縦方向
      atts.add(SheetCollate.COLLATED); // ドキュメントを部単位で印刷コピー機でいうところのソート機能でしょうか?
      atts.add(Sides.DUPLEX); // 両面印刷
      
      PrintServiceAttributeSet atts2 = new HashPrintServiceAttributeSet();
      atts2.add(new PrinterName("PDF Printer",Locale.getDefault()));
      
      JRExporter exporter = new JRPrintServiceExporter();
      exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
      exporter.setParameter(JRPrintServiceExporterParameter.PRINT_REQUEST_ATTRIBUTE_SET, atts);
      exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PAGE_DIALOG, Boolean.FALSE);
      exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PRINT_DIALOG, Boolean.TRUE);
      exporter.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE_ATTRIBUTE_SET, atts2);
      exporter.exportReport();

!ページ数表示
http://74.125.153.132/search?q=cache:OrH57gRZFk4J:d.hatena.ne.jp/w650/20051101+jasperreports+%E3%83%9A%E3%83%BC%E3%82%B8%E6%95%B0&cd=1&hl=ja&ct=clnk&gl=jp
JasperReportにて各ページに“Page X of Y”(ex.1/2)みたいな記述を入れたい場合には、textField要素を二つ用意してそれぞれにPAGE_NUMBER変数を設定する。

そして現在ページ数のtextFieldには、evaluationTime="Now"とし、全体ページ数のtextFieldにはevaluationTime="Report"を指定する。

!複数のレポ−トを1つレポ−トに結合する
{{code Java,
  public static JasperPrint connectJasperPrint(List<JasperPrint> printList){
    JasperPrint basePrint = null;
    JasperPrint currentPrint = null;
    Iterator<JasperPrint> printIterator = printList.iterator();
    Iterator<JRPrintPage> pageIterator = null;
    
    while(printIterator.hasNext()){
      currentPrint = printIterator.next();
      if (basePrint == null){
        basePrint = currentPrint;
        continue;
      }
      
      pageIterator = currentPrint.getPages().iterator();
      while(pageIterator.hasNext()){
        basePrint.addPage(pageIterator.next());
      }
    }
    
    return basePrint;
  }
}}
こんな感じで、ページを追加をする。
ただし、1ページ目のサイズに固定されるので注意。

!サイズの違うレポートを1つのPDFに結合する
{{code Java,
  public static byte[] connectJasperPrintToPDF(List<JasperPrint> printList) throws Exception {
    ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    
    JRPdfExporter jrPdfExporter = new JRPdfExporter();
    jrPdfExporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outStream);
    jrPdfExporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, printList);
    jrPdfExporter.exportReport();
    
    return outStream.toByteArray();
  }
}}
http://gendosu.jp/redmine/projects/25/wiki/JasperReports-%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AE%E9%81%95%E3%81%86%E7%94%A8%E7%B4%99%E3%82%84%E3%80%81%E7%94%A8%E7%B4%99%E6%96%B9%E5%90%91%E3%81%AE%E9%81%95%E3%81%86%E7%89%A9%E3%82%92%E5%8D%98%E4%B8%80%E3%81%AEPDF%E3%81%A8%E3%81%97%E3%81%A6%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF?version=2
{{category2 プログラミング言語,Java}}
[[JasperReports と iReport]] へ移動しました。