A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 大山哥哥 于 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如下:




附件.zip

320.67 KB, 下载次数: 92

3 个回复

正序浏览
原来JasperReport的插件这么用啊。总结的挺详细 收藏了 下次使用这个插件的时候直接拿出来看就行了不必摸索了
回复 使用道具 举报
我来给你占层楼啊   
回复 使用道具 举报
老铁666
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马