JasperReport子报表采用JavaBean做数据源的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JasperReport子报表采用JavaBean做数据源的问题相关的知识,希望对你有一定的参考价值。
用struts2和JasperReport和ireport做报表开发,其中用JavaBean做数据源,开发子报表时子报表的data source expression为:new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($Fmajors),但是运行后一直报错,错误为:net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression :
Source text : new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($Fmajors),希望大家能帮我解决!
<action name="pdf" class="com.xxxxx.action" >
<result name="Success" type="jasper">
<param name="location">/reports/main.jasper</param>
<param name="dataSource">list</param>
<param name="reportParameters">reportParameter</param>
<param name="format">PDF</param>
</result>
</action> 参考技术A 把majors这个属性当参数传进去
JasperReport使用
JasperReport介绍
JasperReport是一个非常强大,易用的开源报表引擎,用Java语言编写。可以导出各种格式的文档,如HTML,PDF,Execel,Word等)
一、安装Jaspersoft Sutdio
Jaspersoft Sutdio是一个设计报表的模板工具
下载Jaspersoft Sutdio CE 下载地址
二、使用Saspersoft Studio创建模板
1、创建工程New->Project
选择JasperReports Project
命名为ReportFirst
2、创建模板
New-> Jasper Report->
选择Blank A4,点击Next
命名为template1.jrxml
Data Adapter选择One Empty Record,即空数据源。
3、模板设计界面的区域说明
Title: 标题区,如果数据有多页只会在第一页打印
Page Header: 页头区,多页的情况下每页都会打印
Column Header:列头区,配合下面的Detail区打印列表数据,多页的情况下每页都会打印
Detail:可以新增多个Detail区,可以组合打印出多个列表数据,多页的情况下每页都会打印
Column Footer:列表底部区,多页的情况下每页都会打印
Page Footer:页底部区,多页的情况下每页都会打印
Summary:合计区,只会在最后一页打印
4、添加元素
1) 在右侧Basic Elements区域拖拽一个Static Text, 文字为: This is title head。
2) 在左侧Outline区域Parameters上右键-> Creat Parameter.
命名为name, Class为java.lang.String
3)拖拽那么属性到Page Header
4) 在左侧Outline区域Fields右键创建两个字段 name,age
然后将name和age拖拽到Detail区域。
选择预览,name输入zhangsan,效果如下图所示
5、编译模板
生成了template1.jasper文件
三、在Java中使用模板
1)引入依赖
<dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.12.1</version> </dependency>
2) 把template1.jasper放入资源文件夹中
3) 编写生成pdf代码
@GetMapping("/testJasper") public void createPdf(HttpServletRequest request, HttpServletResponse response) throws Exception { HashMap<String,Object> params = new HashMap<>(); params.put("name","title name"); List<HashMap> list = new ArrayList<>(); for(int i = 0; i < 20; i++){ HashMap<String,String> item = new HashMap<>(2); item.put("name","zhangsan-" + i); item.put("age",String.valueOf(i + 10)); list.add(item); } String templatePath = "templates/template1.jasper"; JasperReportUtil.exportToPdf(templatePath,params,list, response); }
exportToPdf方法:
public static void exportToPdf(String jasperPath, Map parameters, List<?> list, HttpServletResponse response) throws Exception { OutputStream outputStream = response.getOutputStream(); try { ClassPathResource resource = new ClassPathResource(jasperPath); response.setContentType(getContentType(ReportType.PDF)); InputStream jasperStream = resource.getInputStream(); JasperPrint jasperPrint = getJasperPrint(jasperStream, parameters, list); JasperExportManager.exportReportToPdfStream(jasperPrint, outputStream); } catch (Exception e) { //log.error("读取报表异常", e); outputStream.write("读取报表异常".getBytes()); } finally { outputStream.flush(); outputStream.close(); } }
http://127.0.0.1:8080/testJasper
效果如下图所示:
以上是关于JasperReport子报表采用JavaBean做数据源的问题的主要内容,如果未能解决你的问题,请参考以下文章