ireport后台传参打印pdf
Posted ccnewsky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ireport后台传参打印pdf相关的知识,希望对你有一定的参考价值。
第一;先说传参方式,一共有两种
JasperRunManager.runReportToPdfStream(is, servletOutputStream, map, data2); //1; 上面参数中的map,对应pdf中的Parmeter参数 //2; datasouce,参数中的第四位,对应pdf中的参数2,fields //map在官方解释中类似于sql的查询条件,DataSource就是具体的查询结果数据
第二;具体的数据参数形式
map,就是普通的hashmap就可以
//1;map,就是普通的hashmap就可以 HashMap map = new HashMap(); //传参对应方式 map(“”,XXX) //XXX可以是数据库,也可以是list,也可以是单个数据 //数据库 //要传入datasouce类型,获取的时候可以使用 使用方式 在ireport 组件list中使用 $PREPORT_PARAMETERS_MAP.get("XXX")直接获取 //表达式填入,图四 list //传入list,便利循环的时候要使用datasouce对应的格式转换 //要创建一个list field,然后更改这个field属性,图三我选择的是第一个 使用方式一 在ireport 组件list中使用,由于创建list时,就会自动附带subDataSource 所以在subDataSource其中的fields中加入传入的相应字段 //下面就是传入的是list<map>类型 new net.sf.jasperreports.engine.data.JRMapCollectionDataSource($Plist) //表达式填入,图四 使用方式二 自行遍历使用 //单个数据 //直接在parameter加入相应元素,在页面使用$P使用
datasouce
//2; DataSource,数据库类型 //根据不同的传参数据类型主要是用的有几种形式 //a; 这个是list<bean>可以使用的 List<Bean> list = null; JRDataSource data = new JRBeanCollectionDataSource(list); //b; 这个是map[]可以使用的,这个map[0]中的数据主要用来对应图中的2的fields HashMap[] reportRows = new HashMap[1]; HashMap map = new HashMap(); reportRows[0] = map; //这个是map[]可以使用的 JRDataSource data2 = new JRMapArrayDataSource(reportRows); //c; 这个是list[Map]可以使用的 List<Map<>> list = null; JRDataSource data2 = new JRMapCollectionDataSource(reportRows);
第三,业务代码
try //获取输出流 ServletOutputStream servletOutputStream = response.getOutputStream(); //文件名称位置 String pathName = "/report/reportallotment.jasper"; //获取资源 Resource resource = new ClassPathResource(pathName); //获取文件的输入流 InputStream is = resource.getInputStream(); //放入参数 JasperRunManager.runReportToPdfStream(is, servletOutputStream, map, data2); response.setContentType("application/pdf"); response.setHeader("content-disposition", "attachment;filename=report.pdf"); servletOutputStream.flush(); servletOutputStream.close(); return null; catch (Exception e) StringWriter stringWriter = new StringWriter(); PrintWriter printWriter = new PrintWriter(stringWriter); e.printStackTrace(printWriter); response.setContentType("text/plain"); try response.getOutputStream().print(stringWriter.toString()); catch (IOException e1) e1.printStackTrace(); return null;
图一
图二
dataset2在打印过程中没有实际意义,它所具有的fields可以直接都写入2中的fields,
如果是子报表则需要
图三
我这里图中list的表达式
图四
注意,get()方法并不是获取了dataset2数据库的结果,而是我在后台传入的map中添加了这个参数
JRDataSource data = new JRBeanCollectionDataSource(list);map.put("dataset2", data);
list中的bean要与dataset2中的fields对应
以上是关于ireport后台传参打印pdf的主要内容,如果未能解决你的问题,请参考以下文章