JasperReport + iReport 實作報表套打
最近有個朋友問我在 Java 的 JasperReport 中怎麼實作報表的套打,其實之前我也沒有想過這個問題,他這麼一問讓我想到了一個解決方案。這個解決方案應該是可以的。呵呵。。
我這裡沒有給出列印的代碼。因為這樣的代碼網上到處都有的,所有我就沒有放上來了。
package com.vincent.report.demo;
import net.sf.jasperreports.engine. * ;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;
public class Demo extends HttpServlet {
@SuppressWarnings( " deprecation " )
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String doType = request.getParameter( " doType " );
try {
// Jasper 檔案
File reportFile = new File(request.getRealPath( " /jasperreport/liuxiaohua_report.jasper " ));
Map paramter = new TreeMap();
// 背景圖檔做為參數傳遞,不用寫絕對路徑
paramter.put( " image " , request.getRealPath( " /jasperreport/report.gif " ));
// 根據 doType 的不同,傳遞不同的參數(是否傳遞背景圖檔)
// 這裡需要注意的是:這報表的設計的時候 image 這個參數的 Use as a Prompt 複選框不要選
// 如果你選了那你一定要傳遞這個參數過去
// 這樣你就在顯示報表的時候傳遞一個背景圖,列印時不傳遞背景圖,列印出來的報表就沒有背景了
// 這樣就可以實作套打,具體列印代碼我就不寫了。
byte [] bytes = JasperRunManager.runReportToPdf(
reportFile.getPath(), doType.equalsIgnoreCase( " print " ) ? null : paramter, new JREmptyDataSource());
// 生成PDF檔案
response.setContentType( " application/pdf " );
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0 , bytes.length);
ouputStream.flush();
ouputStream.close();
} catch (Exception e) {
System.out.println( " error " );
e.printStackTrace();
}
}
}