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),希望大家能帮我解决!

主报表添加参数majors,如果是list,参数类型选为java.util.List,将子报表的data source expression改为:new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($Pmajors),在action中添加public Map<String,Object> reportParameter = new HashMap<String,Object>();及对应的set,get方法,将查询出的majors的值放入reportParameter,在struts.xml中配置如下:
<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

效果如下图所示:

 

 参考: JasperReports入门教程

以上是关于JasperReport子报表采用JavaBean做数据源的问题的主要内容,如果未能解决你的问题,请参考以下文章

JasperReport子报表参数传递

jasperreport怎么调用子报表,在页面上显示

jsp调用jasperreport生成报表问题

JasperReport报表导出踩坑实录

如何获取jasperReport报表总页数

报表引擎(JasperReport)对比图表工具(Echarts)