zoukankan      html  css  js  c++  java
  • Springboot整合JasperReport报表以及报表打印功能

    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报表工具中设置,可以百度搜帖子。

    该帖子可能写的有些简陋,也是因为本人技术有限,有什么问题可以下方留言。
  • 相关阅读:
    解决Redis Cluster模式下的排序问题
    zookeeper实现商品秒杀抢购
    zookeeper实现互斥锁
    用dubbo+zookeeper+spring搭建一个简单的http接口程序
    [置顶] 一个优秀的程序员怎样做好时间管理
    [置顶] BOF或EOF中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录。
    [置顶] 学生管理系统验收出现的问题及解决方法
    [置顶] 学生管理系统的常见问题
    如何让你成为一个专业的程序员(一)
    关于英语学习法
  • 原文地址:https://www.cnblogs.com/hegeainiyo/p/13050722.html
Copyright © 2011-2022 走看看