iReport報表實戰-圖文詳解
陳科肇
1.設計報表
在開始之前設計報表之前,我們總得有工具來設計報表吧,這時我們就可以在官網地址裡查詢並下載
安裝完報表設計工具後,啟動工具
資料來源:資料來源有兩種,JDBC資料來源和List資料來源。
首先,我們使用的是List資料來源,也就是說是通過後臺SQL語句查詢到值後,封裝到List集中,再將List集的資料傳給報表充當資料來源。
使用List集做為資料來源的好處:報表設計的資料和SQL語句沒有直接的關聯,也可以說,這樣比較安全。
a.配置要顯示的欄位
Fields->右鍵->...,可參照下圖
b.接收傳遞過來的引數
Parameters->右鍵->新增,配置相關屬性,即可!
c.新增子報表
注:
1.可以右鍵設定子報表的相關引數(屬性);
2.如果要為子報表傳入List集做為資料來源,選中子報表->展開屬性視窗->
設定connection type:Use a datasource expression,
設定Data Source Expression:newnet.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{sub1Ds})。
其中sub1Ds是接收傳遞過來的List集。
d.新增圖片顯示
元件面板->Image,再配置圖片相關屬性
比如:要顯示圖片的路徑的屬性Image Expression設定為$P{imageUrl}
2.整合到WEB專案並載入顯示
@Controller層-EntryBillController.java
@Service層-EntryBillService.java/** * 列印pdf報表 * ckz * @param modelandview * @return * @throws Exception */ @RequestMapping("/doPdf") public void doReportPdf(String billcode,String where, HttpServletRequest req,HttpServletResponse resp) throws Exception{ entrybillService.doReport(billcode,where,req,resp); }
/**
* 列印報表
* ckz
*
* @param billcode
* @param req
* @param resp
* @throws Exception
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
@Transactional(readOnly=true)
public void doReport(String billcode,String where, HttpServletRequest req,
HttpServletResponse resp){
try{
List data = null;// = entrybillDao.getPrintEntryBillDs(billcode);
List list_sub1 = null;//entrybillDao.getPrintSub1Ds(billcode);
List list_sub2 = null;//entrybillDao.getPrintSub2Ds(billcode);
//獲取工程路徑
String root_path=req.getSession().getServletContext().getRealPath("");
//獲取.jasper檔案路徑
String reportFilePath = root_path;//+"\\webresource\\reports\\report_entrybill_print_look_all_cn.jasper";
//報表logo圖片路徑
String imageUrl=root_path+"\\webresource\\reports\\xxx.png";
//設定report引數
Map params = new HashMap();
String username = (String) req.getSession().getAttribute("employeename");
params.put("username", username);
//++++++++++
data = entrybillDao.getPrintEntryBillDs(billcode);
list_sub1 = entrybillDao.getPrintSub1Ds(billcode);
list_sub2 = entryBillBinDao.getPrintSub2Ds(billcode);
reportFilePath+="\\webresource\\reports\\entrybill\\report_entrybill_print_look_all_cn.jasper";
params.put("sub1Ds", list_sub1);
params.put("sub2Ds", list_sub2);
params.put("entrybillmasTitle", "入庫單詳細表");
params.put("SUBREPORT_DIR", root_path+"\\webresource\\reports\\entrybill\\");
//++++++++++
//獲取資料來源
JRDataSource dataSource = new JRBeanCollectionDataSource(data);
params.put("imageUrl", imageUrl);
Map<String,Object> map = (Map) data.get(0);
if("1".equals(map.get("BILLSTATE").toString())){
params.put("billStateImage", root_path+"\\webresource\\reports\\audit-yes.png");
}
if("1".equals(map.get("DISUSESTATE").toString())){
params.put("billStateImage", root_path+"\\webresource\\reports\\disuse-yes.png");
}
//獲取jasperPrint物件
JasperPrint jasperPrint = ReportUitl.getJasperPrint(reportFilePath, params, dataSource);
ReportUitl.exportPdf(req, resp, jasperPrint);
}catch(Exception ex){
PrintWriter out = null;
try {
resp.setCharacterEncoding("UTF-8");
out = resp.getWriter();
out.write("<h1 style='position: absolute;left: 50%;top: 50%;margin-left: -180px;margin-top: -10px;'>列印報表出錯,請重試!</h1>");
} catch (IOException e) {
e.printStackTrace();
}finally{
out.close();
}
ex.printStackTrace();
}
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
}
其中,exportPdf(req, resp, jasperPrint)及getJasperPrint(reportFilePath, params, dataSource)方法的類,ReportUitl.java
package com.wms.common;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;
/**
* 實現列印報表的常用方法
* @author ckz
*
*/
@SuppressWarnings("deprecation")
public class ReportUitl {
/**
* 獲取 JasperPrint 物件
* ckz
*
* @return
* @throws Exception
*/
public static JasperPrint getJasperPrint(String reportFileName,Map<String, Object> params,JRDataSource dataSource) throws Exception{
File file = new File(reportFileName);
if(!file.exists())
throw new Exception("系統找不檔案 " + reportFileName);
JasperReport report = (JasperReport) JRLoader.loadObjectFromFile(file.getPath());
JasperPrint print = JasperFillManager.fillReport(report, params, dataSource);
return print;
}
/**
* 列印pdf檔案
* ckz
*
* @param req
* @param resp
* @param jasperPrint
* @throws IOException
* @throws JRException
*/
public static void exportPdf(HttpServletRequest req,HttpServletResponse resp,JasperPrint jasperPrint) throws Exception{
//獲取JasperPrint流 物件
JasperPrint print = jasperPrint;
//使用pdf匯出器
JRPdfExporter exporter =new JRPdfExporter();
//設定exporter的引數
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, resp.getOutputStream());
exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
//執行exporter
exporter.exportReport();
}
}
@Repository層-xxx.java
在這裡,你向資料庫檢索的是你在報表中設定Fields的欄位的資料List集
前臺呼叫:
你只須訪問@Controller層-EntryBillController.java類的方法
doReportPdf(String billcode,String where,HttpServletRequest req,HttpServletResponse resp)即可顯示你設計的報表內容!
注:其中的*.jasper檔案,是通過報表器工具生成的,點選Preview選項即可生成位於同目錄(相對於當前編譯的*.jrxml檔案)下的*.jasper檔案