項目中碰到報表的問題,把主要的過程和問題記錄下,備忘。
1、環境
JDK1.5,jasperreports-1.1.1,iReport-1.1.0
2、中文問題
a、記得把itext-1.3.1.jar,iTextAsian.jar這兩個包放在iReport-1.1.0/lib目錄下,這兩個包裡面看下,大概就可以看出是用於定義字型的樣式等功能的;
b、iReport中,下面的參數要設定正確,如
我就因為最下面的一欄忘設,報下面的異常資訊,以為是包的問題,搞了很久。
net.sf.jasperreports.engine.JRException: Could not load the following font :
pdfFontName : STSong-Light
pdfEncoding : Cp1250
isPdfEmbedded : true
3、報表的製做
a、先用iReport設計好報表的樣式、變數的,編譯成.jasper檔案,存在目錄下:F:/jasperreports-1.1.1-project/iReport-1.1.0/result。
b、在程式裡載入該檔案,填充資料後,輸出.pfd檔案,到上面的目錄中。代碼如下:
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
....................
try...{
Connection conn = dao.getConnection();
File jasperFile = new File("F:/jasperreports-1.1.1-project/iReport-1.1.0/result/lbssReport1.jasper");
HashMap param = new HashMap();
param.put("id","reportId");//傳遞參數;
param.put("STRHQL","select loginname,lastname from t_user t");
//直接將裝填過程產生的文檔匯出到pdf格式
//JasperRunManager.runReportToPdfFile("F:/jasperreports-1.1.1-project/iReport-1.1.0/result/lbssReport1.jasper",param,conn);
//標準流程:產生中間的print對象,然後再匯出成其他格式。
//裝載對象
JasperReport report = (JasperReport)JRLoader.loadObjectFromLocation("F:/jasperreports-1.1.1-project/iReport-1.1.0/result/lbssReport1.jasper");
//填充資料
JasperPrint print = JasperFillManager.fillReport(report,param,conn);
//匯出成pdf(需要包含iTextAsian.jar包);
JasperExportManager.exportReportToPdfFile(print,"F:/jasperreports-1.1.1-project/iReport-1.1.0/result/lbssReport1.pdf");
}catch(Exception e)...{
logger.error("產生報表出錯:"+e.getMessage());
throw new Exception("產生報表出錯:"+e.getMessage());
}
要把jasperreports-1.1.1.jar,itext-1.3.1.jar,iTextAsian.jar這三個包放在項目的lib下,jasperreports包裡包含了所有相關類,在程式了就可以直接調用了。
代碼裡面param.put("id","reportId");//傳遞參數; param.put("STRHQL","select loginname,lastname from t_user t");這兩行中"id","STRHQL"是報表中的外部變數。與iReport中的相對應,如下:
好了,差不多了,看下運行出來的pdf檔案吧