Jasperreports.jar 在java程序中输出报表的api
ireport-3.7.0 制作报表模板的软件
1 准备JavaBean 表示需要展示的字段,假设bean中的字段为name和age,将bean填值装入一个list1中
Test test1 = new Test();
Test test2 = new Test();
Test test3 = new Test();
list1.add(test1);
list1.add(test2);
list1.add(test3);
再准备若干map 装入若干字段 one two three 再装入list2中
map1.put("one","I'm");
map2.put("two","so");
map3.put("three","pretty");
list2.add(map1);
list2.add(map2);
list2.add(map3);
list1和list2都将作为数据源输出到html报表中
2 新建一个空白的report文件 hello.jrxml,并创建与map相应的参数Parameters和与javabean相应的字段Field
3 创建与Parameters和Field对应的组件
注意:Parameters的组件P{"one"},P{"two"},P{"three"}放在title brand中,Field的组件F{"name"},F{"age"}作为table内容,放在Detail brand中,table的列头放在column brand中(用static text组件输入文字)。Field与Parameters的区别本人还没研究过,目前知道的用法区别在于:Parameters用于唯一的参数展示,也就是map中的键值对;Field用于表格内容的展示,即用于展示多列数据,也就是list中的一个个javabean。
4 hello.jrxml编译成hello.jasper,即得到我们程序中需要的文件。
5 简而言之,我们需要一个list1
6 调用
List jaspers = new ArrayList<>();
for (int i = 0; i < list2.size(); ++i) {//每个map都要调一次
JasperPrint jasperPrint = JasperFillManager.fillReport(new File(hello.jasper), list2.get(i), new JRBeanCollectionDataSource(list1));
jaspers.add(jasperPrint);
}
JRHtmlExporter exporter = new JRHtmlExporter();
//一堆可选参数待你探索
exporter.setParameter(JRHtmlExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.TRUE);
exporter.setParameter(JRHtmlExporterParameter.JASPER_PRINT_LIST, jaspers);
exporter.setParameter(JRHtmlExporterParameter.OUTPUT_WRITER, out);
exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, characterEncoding);
exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "
");
exporter.setParameter(JRHtmlExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
exporter.setParameter(JRHtmlExporterParameter.SIZE_UNIT, "pt");
exporter.exportReport();//输出HTML
1 低版本的ireport无法转换jasper文件成jrxml文件
2 低版本的ireport可以打开高版本的jrxml文件,但是可能会有uuid报错,因为高版本(4.6之后)的ireport创建jrxml文件时会加入uuid属性(可查看),需要去掉所有的uuid属性,低版本ireport才能兼容高版本jrxml文件。
3 ClassDefFound/ClassNotFound....groove....CompilerException报错,在jrxml文件中(其实就是xml)的第一行,会有一个属性:language=“groove”,这是默认行为,在java程序中调用时需要改成language=“java”或者直接去掉该属性,这个报错可以联系java的编译与运行想想看,大致思路就是jrxml文件的编译环境(ireport)与运行环境(java程序)不符,java程序在运行时无法找到jrxml文件编译时的类。总之language属性是关键。
4 有时候改了language属性重新编译之后依然报错,可以回到界面稍微移动一下组件...然后再编译即可,可以理解为反应慢半拍...
可能要待续...