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報表工具中設置,可以百度搜帖子。
該帖子可能寫的有些簡陋,也是因為本人技術有限,有什么問題可以下方留言。

