【报表开发学习笔记】1:使用iReport在Java中从POJO生成PDF文件报表

安装和启动

iReport安装过程

注意ireport.conf是在etc目录下,启动不起来把JDK换成1.6版本可用(1.8不行)。

绘制jrxml

iReport 使用JavaBean作为数据源开发报表(SSM)

对于左侧Report Inspector栏中的Parameters和Fields,右键就可以添加和重命名,拖拽可以加入图形化面板的指定位置,双击可以修改外显名称。

面板上的new java.util.Date()可以通过拖拽右侧组件面板-Tools下的Current date来创建。

面板上Summary区的$V{PAGE_NUMBER}等变量可以在左侧Variables下找到,直接拖拽使用。

编译成jasper文件

编译,在之前保存的工作目录下可以看到生成了.jasper文件供Java程序使用。
这里写图片描述

程序

参考了iReport生成pdf文件,不过我已经手动编译好,不需要像这篇中这样在Java程序中编译。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.lzh</groupId>
    <artifactId>iReportTest</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-all -->
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.7</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.lowagie/itext -->
        <dependency>
            <groupId>com.lowagie</groupId>
            <artifactId>itext</artifactId>
            <version>2.1.7</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports -->
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>5.6.0</version>
        </dependency>
    </dependencies>

</project>

主类

package org.lzh;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        //这个Map用来为报表中的Parameter参数设置值
        Map<String, Object> parameters = new HashMap<String, Object>();
        //用来存一堆POJO对象的列表
        List<Student> students = new ArrayList<Student>();
        //添加一些用来生成报表的POJO对象
        for (int i = 0; i < 5; i++) {
            students.add(new Student(i, "name" + i, "school" + i));
        }
        System.out.println("---[开始]---");
        //开始计时
        long startTime = System.currentTimeMillis();

        //[1]编译后的jasper文件位置
        String jasperFilePath = "D:/WorkSpace/iReport/test.jasper";
        //[2]在Map中添加KV对,以用来设置参数
        parameters.put("author", "LiuZhiHao");
        //[3]传入放置了POJO对象的集合类列表,以建立数据源对象
        JRDataSource jrDataSource = new JRBeanCollectionDataSource(students);

        try {
            //将jasper资源、参数Map、数据源对象整合到一起,形成JasperPrint总资源对象
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperFilePath, parameters, jrDataSource);
            //字节数组输出流,用于输出成PDF
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            //PDF输出工具
            JRPdfExporter jrPdfExporter = new JRPdfExporter();
            //为输出工具组合插件
            jrPdfExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);//总资源对象
            jrPdfExporter.setParameter(JRExporterParameter.OUTPUT_STREAM, byteArrayOutputStream);//输出字节数组流
            jrPdfExporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");//编码
            //导出,导出结束后会按照参数将结果放在输出字节数组流中
            jrPdfExporter.exportReport();

            //将其变成字节数组
            byte[] bytes=byteArrayOutputStream.toByteArray();
            //写出到文件
            File file=new File("D:/WorkSpace/iReport/test.pdf");
            FileOutputStream fileOutputStream=new FileOutputStream(file);
            fileOutputStream.write(bytes);
            System.out.println("写入完毕");
            fileOutputStream.close();
        } catch (JRException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //结束计时
            long endTime=System.currentTimeMillis();
            System.out.println("---[结束]共用时"+(endTime-startTime)+"---");
        }
    }
}

Student类

package org.lzh;

public class Student {
    private Integer id;
    private String name;
    private String school;

    //getter,setter,全参和无参构造
}

运行结果

这里写图片描述

报错解决

[1]GroovyEvaluator找不到

报错信息:

java.lang.ClassNotFoundException: net.sf.jasperreports.compilers.GroovyEvaluator

参考这里,可以将jasperreports版本改成5.6.0

[2]BytecodeInterface8找不到

报错信息:

net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression : 
    Source text : new java.lang.Integer(1)
...
Caused by: java.lang.ClassNotFoundException: org.codehaus.groovy.runtime.BytecodeInterface8

可以将groovy-all版本改成2.4.7

[3]无法解析的Fields

报错信息:

net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression : 
    Source text : name

捣鼓了半天,找到了解决办法。首先在iReport工具中选中左上角文件根:
这里写图片描述
在右侧属性中,将语言改为Java:
这里写图片描述
为表头表达式打上双引号,才是正确的表达式。注意表头在Page Header区,表的内容行才是在Detail 1区。
这里写图片描述
重新保存、编译即可。

猜你喜欢

转载自blog.csdn.net/SHU15121856/article/details/81452007