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,详细代码如下:

扫描二维码关注公众号,回复: 12526989 查看本文章
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报表工具中设置,可以百度搜帖子。

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

猜你喜欢

转载自blog.csdn.net/s_156/article/details/114120678