程序
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发生了好多变化,驱动也要换成新的版本,这篇中讲了不少尝鲜时遇到的问题。注意这篇里的&
是多此一举,不需要用字符实体,在连接字符串中直接用&
就可以了。
iReport中文不显示
详见这篇。如果电脑中只有.ttc
字体,可以在这里下载微软雅黑的.ttf
字体。本例中直接使用宋体,就不导入字体了,不过全部组件的编码和字体属性还是要改一下。
JVM无法解析用到的字体
报错:
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进行调整。