【报表开发学习笔记】2:使用iReport在Java中从MySQL数据库生成PDF/Excel文件报表

程序

pom.xml

需要添加MySQL8的驱动:

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>

生成Excel需要导入POI:

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>

POI提供API给Java对Microsoft Office格式档案读和写的功能。

主类

这是生成PDF的代码,生成Excel见文末。

package org.lzh;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRPdfExporter;

import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        //连接对象放外面,可以在finally块中关闭
        Connection conn=null;
        try {
            //导入MySQL驱动(新版MySQL用com.mysql.cj.jdbc.Driver)
            Class.forName("com.mysql.cj.jdbc.Driver");
            //连接到数据库(useSSL=false,高版本默认是true)
            //serverTimezone=GMT%2B8可以解决MySQL8的时区问题
            conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=GMT%2B8","lzh","3838438");
            //编译后的jasper文件位置
            String jasperFilePath = "D:/WorkSpace/iReport/fromMySQL.jasper";

            //将jasper资源、参数Map、数据源对象整合到一起,形成JasperPrint总资源对象
            //这里因为没有需要提供的参数,参数Map为null;因为从数据库中获取,所以数据源对象就是Connection对象
            //和上篇从POJO中获取的主要区别就是这里用的数据源变成了Connection对象而非POJO列表
            JasperPrint jasperPrint=JasperFillManager.fillReport(jasperFilePath,null,conn);

            //字节数组输出流,用于输出成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/fromMySQL.pdf");
            FileOutputStream fileOutputStream=new FileOutputStream(file);
            fileOutputStream.write(bytes);
            System.out.println("写入完毕");
            fileOutputStream.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (JRException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(null!=conn) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果

错误解决

数据库客户端版本太老

在连接时出现:

是因为客户端的版本太老了,新旧版本MySQL对密码的加密方式不同,网上的方式都是像这样去直接修改MySQL的root用户的加密方式。但是因为我还要用新的Navicat和新的IDEA等去连接MySQL,还是不要这样修改了,可以在Navicat中直接添加一个MySQL账户:

只有密码加密方式和root不同,权限全部提供:

保存即可,然后用这个账户连接iReport的数据库客户端。

连接时编码问题

出现:

在连接字符串后添加?useUnicode=true&characterEncoding=utf8,成功连接:

使用iReport

参考这篇进行.jrxml面板的设计,设计完是这样:

可以点preview预览一下。编译后成功生成.jasper文件。

连接MySQL8时的错误

MySQL8发生了好多变化,驱动也要换成新的版本,这篇中讲了不少尝鲜时遇到的问题。注意这篇里的&amp;是多此一举,不需要用字符实体,在连接字符串中直接用&就可以了。

iReport中文不显示

详见这篇。如果电脑中只有.ttc字体,可以在这里下载微软雅黑的.ttf字体。本例中直接使用宋体,就不导入字体了,不过全部组件的编码和字体属性还是要改一下。

JVM无法解析用到的字体

报错:

扫描二维码关注公众号,回复: 2650243 查看本文章
Exception in thread "main" net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font : 
pdfFontName   : STSong-Light
pdfEncoding   : UniGB-UCS2-H
isPdfEmbedded : true

试了一下这篇还是不行,查了一下,我的iTextAsian包和网上的完全不一样,根本没有这个字体。在这里可以下载,导入到IDEA项目中即可。

生成Excel

如要生成.xls文件,主要是在代码中修改PDF输出工具为XLS输出工具:

//-------------------------------------------------------------------------------------

            //Xls输出工具
            JRXlsExporter jrXlsExporter=new JRXlsExporter();
            //为输出工具组合插件,不再使用被@deprecated的setParameter方法
            jrXlsExporter.setExporterInput(new SimpleExporterInput(jasperPrint));//总资源对象
            jrXlsExporter.setExporterOutput(new SimpleOutputStreamExporterOutput(byteArrayOutputStream));//输出字节流数组
            //XLS配置对象
            SimpleXlsReportConfiguration configuration=new SimpleXlsReportConfiguration();
            configuration.setOnePagePerSheet(true);//每个工作表仅一页
            configuration.setDetectCellType(true);
            configuration.setCollapseRowSpan(false);
            //把配好的配置对象装载到输出工具上
            jrXlsExporter.setConfiguration(configuration);
            //导出,导出结束后会按照参数将结果放在输出字节数组流中
            jrXlsExporter.exportReport();

//-------------------------------------------------------------------------------------

在输出文件中把后缀名改成.xls。如果需要带有边框,可以在面板上选中相应的组件,然后右键选择Padding And Borders进行调整。

猜你喜欢

转载自blog.csdn.net/SHU15121856/article/details/81456487
今日推荐