Springboot整合JasperReport报表以及报表打印功能

  本文章主要介绍如何将JasperReport做好的报表整合到springboot项目中。

关于如何下载和使用JasperReport工具做报表这里就不详细介绍了,可以查看该帖子进行下载,配置和操作:https://blog.csdn.net/dullchap/article/details/51799070

在做好报表以后,运行.jrxml文件,会生成一个pdf格式的.jasper文件,如图:

接下来可以把这两个文件拷贝到springboot项目的resource目录下,如图:

pom中引入maven依赖:

<dependency>   <groupId>net.sf.jasperreports</groupId>   <artifactId>jasperreports</artifactId>   <version>6.12.2</version>   <exclusions>      <exclusion>         <groupId>com.lowagie</groupId>         <artifactId>itext</artifactId>      </exclusion>      <exclusion>         <groupId>com.fasterxml.jackson.core</groupId>         <artifactId>jackson-databind</artifactId>      </exclusion>      <exclusion>         <groupId>com.fasterxml.jackson.core</groupId>         <artifactId>jackson-annotations</artifactId>      </exclusion>      <exclusion>         <artifactId>commons-beanutils</artifactId>         <groupId>commons-beanutils</groupId>      </exclusion>      <exclusion>         <artifactId>commons-collections</artifactId>         <groupId>commons-collections</groupId>      </exclusion>      <exclusion>         <artifactId>commons-logging</artifactId>         <groupId>commons-logging</groupId>      </exclusion>   </exclusions></dependency><dependency>   <groupId>com.lowagie</groupId>   <artifactId>itext</artifactId>   <version>2.1.7</version></dependency><dependency>   <groupId>org.codehaus.groovy</groupId>   <artifactId>groovy-all</artifactId>   <version>2.4.11</version></dependency><dependency>   <groupId>net.sf.jasperreports</groupId>   <artifactId>jasperreports-fonts</artifactId>   <version>6.0.0</version></dependency><dependency>   <groupId>com.itextpdf</groupId>   <artifactId>itext-pdfa</artifactId>   <version>5.5.0</version></dependency>

然后可以在controller层创建一个JasperReportController,详细代码如下:

import io.swagger.annotations.Api;import lombok.extern.slf4j.Slf4j;import net.sf.jasperreports.engine.*;import net.sf.jasperreports.engine.util.JRLoader;import org.springframework.core.io.ClassPathResource;import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.sql.DataSource;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.sql.Connection;import java.sql.SQLException;import java.util.HashMap;import java.util.Map;

@Slf4j@Api(tags="报表url管理")
@RestController@RequestMapping("/jasperReport")public class JasperReportController {    @Resource    private DataSource dataSource;

    /**     * 转换为pdf展示,也就是在线预览     *     * @param reportName     * @param parameters     * @param response     * @throws SQLException     * @throws ClassNotFoundException     * @throws JRException     * @throws IOException     */    @GetMapping("/{reportName}")    public void getReportByParam(            @PathVariable("reportName") final String reportName,            @RequestParam(required = false) Map<String, Object> parameters, HttpServletRequest request,            HttpServletResponse response) throws SQLException, ClassNotFoundException, JRException, IOException {        parameters = parameters == null ? new HashMap<>() : parameters;        if (reportName.equals("query2")){            parameters.put("wave_code",parameters.get("waveCode"));        }else if (reportName.equals("queryByWaveCode")){            parameters.put("wave_code",parameters.get("waveCode"));        }        Connection connection = dataSource.getConnection();        //获取文件流        ClassPathResource resource = new ClassPathResource(reportName + ".jasper");        InputStream in = resource.getInputStream();        JasperReport jasperReport = (JasperReport) JRLoader.loadObject(in);        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters,connection );        // JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, new JREmptyDataSource());        response.setContentType("application/pdf");        /*response.setContentType("text/html;charset=utf-8");*/        response.setHeader("Content-Disposition", "inline;");        final OutputStream outputStream = response.getOutputStream();        JasperExportManager.exportReportToPdfStream(jasperPrint, outputStream);        try {            connection.close();            in.close();            outputStream.close();        } catch (IOException e) {            e.printStackTrace();        }    }

  //打印功能    @GetMapping("/printReport/{reportName}")    public void printReport(            @PathVariable("reportName") final String reportName,            @RequestParam(required = false) Map<String, Object> parameters, HttpServletRequest request,            HttpServletResponse response) throws SQLException, ClassNotFoundException, JRException, IOException {        parameters = parameters == null ? new HashMap<>() : parameters;        if (reportName.equals("query2")){            parameters.put("wave_code",parameters.get("waveCode"));        }else if (reportName.equals("queryByWaveCode")){            parameters.put("wave_code",parameters.get("waveCode"));        }        //获取文件流        ClassPathResource resource = new ClassPathResource(reportName + ".jasper");        InputStream in = resource.getInputStream();        JasperReport jasperReport = (JasperReport) JRLoader.loadObject(in);        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource.getConnection());        //打印        JasperPrintManager.printReport(jasperPrint,true);    }}这里面可以看到有两个方法,第一个方法是在线查看报表,也就是在线预览,第二个方法就是打印报表,接下来我大致解释一下:  首先,接收参数就不用多说了,这里采用了变量名作为路径,也就是jasper文件名字,请求后台路径也就是这样子的/jasperReport/printReport/query2。当然,这里我自己使用的jasper文件名字是query2。参数中reportName也就是文件名字,parameters中可以放需要传递的参数,比如说所要查的报表要有参数传递,参数就可以放到parameters中,在这里我是传递了一个参数,就是waveCode,接下来我又判断了一下,重新又赋了一下值wave_code,直接传递waveCode是有问题的,具体原理我认为可能是报表的sql语句的我用的参数就是wave_code,页面上传过来的是waveCode。

  接下来的代码就是利用输入输出流以及JasperReport对象提供的方法来返回一个pdf文件,放到response中,因为是把文件放到连接池中的,所以最后要关闭,不然在线预览点几下连接池就崩溃了,很麻烦的。

  第二个方法是打印报表,因为请求路径用了变量来传,所以又多加了一层,不然他没办法请求到的。然后利用JasperReport对象内置的打印方法,然后调出打印机进行打印。

 要注意一点就是,idea中要设置VMoptions,如同所示:但是在服务器上只运行jar包的话就会有一个问题,也就是linux系统上,这个VMoptions没办法设置的,但是可以通过启动传参运行,nohup java -Djava.awt.headless=false -jar jeecg-boot-module-system-2.1.1.jar >catalina.out 2>&1 &       (jar包名字自己做对应修改)
  还有一个就是字体问题,不处理好会导致中文不显示,必须要做报表的字体对应,本人使用的是仿宋字体,在JasperReport报表工具中设置,可以百度搜帖子。

  该帖子可能写的有些简陋,也是因为本人技术有限,有什么问题可以下方留言。

Springboot整合JasperReport报表以及报表打印功能相关推荐

  1. springboot 整合jasperReport 6.6.0 记录

    经过2天对于jasper的研究,终于做出了第一个简单的报表打印现在记录一下整个过程 1. pom.xml修改增加 <dependency><groupId>net.sf.jas ...

  2. springboot整合vosk实现简单的语音识别功能

    vosk开源语音识别 Vosk是开源的语音识别工具包.Vosk支持的事情包括: 支持十九种语言 - 中文,英语,印度英语,德语,法语,西班牙语,葡萄牙语,俄语,土耳其语,越南语,意大利语,荷兰人,加泰 ...

  3. 水晶报表2008 条码打印 扫描

    前几天项目上用到了水晶报表的条码打印功能 最开始用的字体,code39 code128都试了,可以正常打印,但是扫描枪不识别, 据说code39值两边加*可以扫描到,我没能成功 又在网上找到以下方法, ...

  4. SpringBoot 整合Activiti(二)——流程审批完整示例

    前两天做了一个SpringBoot整合Activiti的完整示例,功能包括:退回/通过(节点条件).指定办理人.生成流程图.高亮显示已办节点.查询任务列表(办理人)等,下面先简单记录(含完整代码),十 ...

  5. SpringBoot 整合 Spring Security 实现安全认证【SpringBoot系列9】

    SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见. 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCl ...

  6. java实现续打功能_浅谈报表工具的打印方案

    报表工具除了基本的绘制报表,完成数据呈现(也就是让终端用户能看到报表),打印也是报表的基本功能之一. 当前报表工具很多,可以按地域.开闭源等划分,包括有杰表.水晶.Style Report.birt. ...

  7. 能实现报表打印功能的报表软件有哪些?

    ​虽然表格制作软件可以在电脑显示屏上展示,但许多时候更需要纸张的直观展示分析,这就考验了报表工具的表格制作软件打印功能,表格制作软件离不开打印,打印就少不了要批量.因此本文旨在从多参打印,分页打印,缩 ...

  8. 【转】VS2013自带报表+打印功能

    VS自带报表控件和打印功能,这样就给我们这些编程者带来了很大的方便.下面就将我做程序的一些小经历来跟大家一起分享一下. 1,我们右击U层所在文件夹添加"新建项". 2,在弹出的的添 ...

  9. 使用FastReport.net 报表在网页上实现打印功能

    这些年的工作当中,最早是在8年前接触到FastReport这个报表工具,从名字上来看,直译过来就是快速报表,正所谓天下武功,唯快不破,FastReport报表早些年确实是制作报表的不二之选,8年前的工 ...

  10. php报表数据打印机,通过打印机打印带打印功能的php表

    我有以下php表,我如何只在php表中添加打印功能?点击一个按钮,下面的表格通过打印机打印,我试过'CTRL P',我只得到页面的html部分示例页眉,页脚,导航栏,而不是结果php结果 echo & ...

最新文章

  1. Git011--分支管理策略
  2. 『Python』VS2015编译源码注意事项
  3. go python php_php 、go 、python http请求(get和post)
  4. linux nc命令用法举例
  5. HttpClient的超时用法小记
  6. HDU-4793 Collision 计算几何 解方程
  7. hdu4751Divide Groups(dfs枚举完全图集合或者bfs染色)
  8. 后疫情时代,那些迎来爆发机会的产业
  9. 添加lua_C++/Lua高级交互
  10. Python int() 函数
  11. 一张小柴胡汤打天下- 四川名医马有度
  12. java源码-AtomicInteger
  13. 超强功能WebSSH安装,解决Web远程SSH终端
  14. 前端登陆界面 html+js
  15. S一文读懂应力集中与应力奇异
  16. 邓俊辉数据结构学习笔记3-二叉树
  17. 什么是P=NP问题?
  18. PCB layout常用走线线宽选择参考
  19. 3D打印无人机等无人设备2——Ultimaker Cura 3.2.1设置中文
  20. 技术漫谈之——Jectpack Compose

热门文章

  1. process.cwd()与__dirname的区别
  2. nginx 为什么要反向代理 影藏后端 高效连接(给nginx,他自己返回) 端口冲突解决 多个服务...
  3. 户如何获得渗透服务---步骤与效果
  4. 《精通Matlab数字图像处理与识别》一第6章 频率域图像增强
  5. Cesium教程系列汇总
  6. php函数copy和rename的区别
  7. 多区域OSPF基本配置
  8. 2.Prometheus 监控技术与实践 --- Prometheus基本概念及部署
  9. 34.MySQL的高级安装和升级
  10. 24. yii2 表单赋值 model-load(), model-attributes 方法