本帖最后由 大山哥哥 于 2018-2-26 21:35 编辑
今天我们来使用JasperReport生成PDF报表文件。
要完成该功能,需要如下几步:
【1】使用ireport绘制报表模板
在ireport中绘制报表模板有几个内容:
设置报表的标题、基本的作者信息、数据列表的表头、数据列表
数据库的查询SQL如下:
版本的内容设计如下图
详细的jrxml文件参见附件中的[dbReport.jrxml]
【2】在项目中引用JasperReport相关jar包,处理jasperReport和itext的jar包版本(这里使用maven管理jar包坐标)
JasperReport在它pom文件中默认依赖2.1.7版本的itext,所以在项目中,直接引入itext的2.1.7版本,然后需要引入中文支持itextAsian的jar包。
这个中文支持的jar包目前在maven提供的坐标只有itext-asian的5.x版本,并且groupId是com.itextpdf(新版本),而itext所需要的一些FontMapper类路径是com.lowagie(老版本),所以需要对中文支持jar包专门进行处理。我在附件中提供了处理之后的中文支持jar包(附件中的[com.zip])。并放置到com/lowagie/1.0目录下,大家可以直接将该目录和jar包放置到本地maven仓库即可。
下面是依赖的jar坐标
[XML] 纯文本查看 复制代码 <dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itextasian</artifactId>
<version>1.0</version>
</dependency>
<!-- groovy -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>1.7.5</version>
</dependency>
<!-- jasperreport -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>5.1.0</version>
<exclusions>
<exclusion>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
</exclusion>
<!-- <exclusion>
<artifactId>jackson-databind</artifactId>
<groupId>com.fasterxml.jackson.core</groupId>
</exclusion>
<exclusion>
<artifactId>jackson-annotations</artifactId>
<groupId>com.fasterxml.jackson.core</groupId>
</exclusion>
<exclusion>
<artifactId>jackson-core</artifactId>
<groupId>com.fasterxml.jackson.core</groupId>
</exclusion> -->
</exclusions>
</dependency>
需要注意的是,jackson的这些jar包此处不排除。
【3】使用JasperReport的API开发导出PDF文件代码(直接贴出代码)
代码中,使用的是struts2做访问的响应,使用spring管理连接池,这里简化struts2和spring的配置内容
[Java] 纯文本查看 复制代码 @ParentPackage("json-default")
@Namespace("/")
@Controller
@Scope("prototype")
public class DBReportAction extends BaseAction<Object> {
@Autowired
private DataSource dataSource;
@Action("db_exportJasperPdf")
public String exportJasperPdf() throws IOException,JRException, SQLException {
// 下载导出
// 设置头信息
ServletActionContext.getResponse().setContentType("application/pdf");
String filename = "运单数据[来源数据库].pdf";
String agent = ServletActionContext.getRequest().getHeader("user-agent");
filename = FileUtils.encodeDownloadFilename(filename, agent);
ServletActionContext.getResponse().setHeader("Content-Disposition","attachment;filename=" + filename);
// 根据 jasperReport模板 生成pdf
// 1.读取模板文件
String jrxml = ServletActionContext.getServletContext().getRealPath("/WEB-INF/jasper/dbReport.jrxml");//改动1:模板文件的放置路径
JasperReport report = JasperCompileManager.compileReport(jrxml);
// 2.设置模板数据
// 2.1 Parameter变量的数据设置
Map<String, Object> paramerters = new HashMap<String, Object>();
paramerters.put("author", "黑马程序员");//改动2:设置parameter(author)数据
// 2.2 Field变量的数据设置
JasperPrint jasperPrint = JasperFillManager.fillReport(report, paramerters, dataSource.getConnection());
// 3.生成PDF客户端
JRPdfExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,ServletActionContext.getResponse().getOutputStream());
exporter.exportReport();// 导出 流对接
ServletActionContext.getResponse().getOutputStream().close();
return NONE;
}
}
其中,处理中文附件文件名的工具类FileUtils如下参见附件中的[FileUtil.java]。
最后,在浏览器中输入请求路径,即可看到提示打开或下载的提示信息。
打开PDF如下:
|