1、我用到的jar包为jasperreports-3.5.3jar包。制作报表模板用到的工具为:iReport-nb-3.5.0
2、首先将从数据库中获取到的数据转成list.
3、public static <T extends com.pwyec.utils.report.javabean.BasePrintEntity> JasperPrint getPrintDataSource(String path,List<T> dataSource) throws ClientProtocolException, IOException, JRException{
/*通过文件名,获得模板文件*/
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpgets = new HttpGet(path);
/*将模板文件转成流*/
HttpResponse response = httpclient.execute(httpgets);
HttpEntity entity = response.getEntity();
InputStream instreams = null;
if (entity != null) {
instreams = entity.getContent();
}
JasperReport jasperReport = JasperCompileManager.compileReport(instreams);
JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(dataSource);
Map parameters = new HashMap();
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, beanColDataSource);
return jasperPrint;
}
其中 path为模板配置文件的路径。dataSource为数据源。
用该方法将之转成JasperPrint
4、在控制器 我们拿到JasperPrint
@Token(save = true)
@RequestMapping(value = "printPdf", method = RequestMethod.GET)
public void printPdf(String id,
HttpServletRequest request, HttpServletResponse response) {
JasperPrint jasperPrint = null;
StoreJumpSession jump = (StoreJumpSession) WebUtil.getPrincipal();
IStoreSessionUser user = jump.getStoreUser();
try {
jasperPrint =getPrintDataSource(String path,List<T> dataSource);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JRPdfExporter pdfExporter = new JRPdfExporter();
pdfExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
OutputStream stream = null;
ByteArrayOutputStream exportStream = new ByteArrayOutputStream();
try {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/pdf");
pdfExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
exportStream);
pdfExporter.setParameter(JRExporterParameter.CHARACTER_ENCODING,
"UTF-8");
try {
pdfExporter.exportReport();
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PdfReader reader = new PdfReader(new ByteArrayInputStream(
exportStream.toByteArray()));
stream = response.getOutputStream();
PdfStamper pdfStamper = new PdfStamper(reader, stream);
pdfStamper.setViewerPreferences(PdfWriter.HideMenubar
| PdfWriter.HideToolbar | PdfWriter.HideWindowUI);
pdfStamper.addJavaScript(PrintHelper.getPrintScript());
pdfStamper.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (exportStream != null) {
try {
exportStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static String getPrintScript(){
StringBuffer script = new StringBuffer();
script.append("this.print({bUI: false,bSilent: true,bShrinkToFit: false});")
.append("\r\nthis.closeDoc();");
return script.toString();
}
然后在js写一个调用该控制器的方法就可以了