2003年11月24日 星期一

?報表XML檔案
用iReport可以很容易幫你產生想要的報表格式XML檔案。
一個Report大致會分為background/title/pageHeader/columnHeader/detial/coulmnFooter/pageFooter/summary這幾個部分,分別把你的元件加到想要出現的部分即可。其中title就是第一頁才會出現,summary就是最後一頁才會出現的東西,pageHeader/pageFooter就是每一頁都會出現。
動態資料部分主要分為Fields/Variables/Parameters
表示方法就是$F{變數名稱}/$V{變數名稱}/$P{變數名稱}
  • Fields
  • 主要就是表示成堆資料的欄位,例如從資料庫當中取出的資料
  • Variables
  • 我還沒自訂過,大概是有提供動態運算的欄位吧,內定的$V{PAGE_NUMBER}就是表示頁數,裡頭的Evalution Time就是哪個時候要決定這個變數的值,當選擇Now的話就是會顯示目前的頁數,選擇Report的話就會顯示這份報表全部的頁數,所以可以在保表上弄兩個Variable,Evalution Time一個選Now,另一個選Report就可以做出 [目前頁數]/[總共頁數] 的功能。
  • Parameters
  • 程式執行可以動態傳入的變數,程式執行時丟入一個MAP(name/value)就可以把這些Parameters填上你想要的值。


?程式部分
程式當中會碰到的Class大概只需要下面幾個:
  • dori.jasper.engine.JasperCompileManager
  • 用來將你的XML Report檔案Compile成jasper檔案, jasper檔案就像是template一樣可以重複利用,所以你可以把Compile出來的東西寫成.jasper檔案,以後就不用重複Compile了,在FillManager的地方直接引入jasper檔案就可以了。
  • dori.jasper.engine.JasperFillManager
  • 要正式產生Report的時候就要利用FillManager把你的資料填入那個之前Compile出來的東西,需要填入資料的似乎只有Fields與Parameters,Fields的填入可以使用JRDataSource或是JDBC Connection,我的資料是已經取出來放在Collection當中了,所以我額外寫一個Class implement JRDataSource,來取Collection的資料,JRDataSource需要實作的method只有兩個:
    getFieldValue(JRField jrField) : 這個會在取得該筆資料的某個欄位時候被呼叫
    next() : 這個會在每次要取下一筆資料的時候被呼叫
  • dori.jasper.engine.JasperPrintManager
  • 我還沒用過,大概是寫Application的時候可以直接輸出到印表機,裡頭也有輸出成PDF的method,不過我都是用下面的ExportManager來輸出成不同的格式。
  • dori.jasper.engine.JasperExportManager
  • 從JasperFillManager得到的東西其實就是整個報表了,ExportManager可以協助你將這個報表用不同的格式來呈現,我想最方便呈現的格式就是PDF了,輸出成PDF檔案只要呼叫exportReportToPdfFile就可以了。

  • dori.jasper.view.JasperViewer
  • 一個GUI的介面,用來看你Compile完之後的Jasper檔案Template長啥樣子
  • dori.jasper.view.JasperDesignViewer
  • 一個GUI的介面,用來看你最後資料填入的Report長的什麼樣子


import dori.jasper.engine.JRDataSource;

import dori.jasper.engine.JRException;
import dori.jasper.engine.JRField;
import edocsys_lib.dataObject.edoc.receiveAllDocInfo;
import java.util.Collection;
import java.util.Iterator;
public class ReceiveAllReporField implements JRDataSource{
int index = 0;
Collection receiveAllDocs;
Iterator docIt;
receiveAllDocInfo doc;
public ReceiveAllReporField(Collection docs) {
receiveAllDocs = docs;
docIt = receiveAllDocs.iterator();
}
public boolean next() throws JRException {
if(docIt.hasNext()){
doc = (receiveAllDocInfo)docIt.next();
return true;
}else{
return false;
}
}
public Object getFieldValue(JRField jRField) throws JRException {
if(doc==null) return "";
if ("ReceiveDate".equals(jRField.getName())) { //收文日期
return edocsys_lib.util.DateFormat.dateFormat(doc.getD_receive(), 1);
}
else if ("ReceiveDocId".equals(jRField.getName())) { //總收文號
return doc.getReceive_doc_id();
}
else {
return "";
}
}
}

沒有留言: