1.jaspersoft studio工具下載地址
2.工具使用方法查看以下鏈接
3.將工具編譯后的.jasper文件放到SpringBoot項目的resources/templates下
4.引入需要的jar
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.18.1</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.18.1</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-pdfa</artifactId>
<version>5.5.0</version>
</dependency>
ps:jasperreports 、jasperreports-fonts這兩jar的版本取決於使用的jaspersoft studio工具的版本(一定要一致,否則可能出現類型轉換異常)
5.pom文件配置
<resource>
<targetPath>${project.build.directory}/classes</targetPath>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/*.jasper</exclude>
<exclude>**/*.jrxml</exclude>
</excludes>
</resource>
<resource>
<targetPath>${project.build.directory}/classes</targetPath>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.jasper</include>
<include>**/*.jrxml</include>
</includes>
</resource>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
<delimiters>
<delimiter>$</delimiter>
<delimiter>@</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
<outputDirectory>${basedir}/target/classes/</outputDirectory>
<nonFilteredFileExtensions>
<!-- 需要過濾掉不需要編碼的文件,不對其進行統一編碼 -->
<nonFilteredFileExtension>woff</nonFilteredFileExtension>
<nonFilteredFileExtension>woff2</nonFilteredFileExtension>
<nonFilteredFileExtension>eot</nonFilteredFileExtension>
<nonFilteredFileExtension>ttf</nonFilteredFileExtension>
<nonFilteredFileExtension>svg</nonFilteredFileExtension>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
<nonFilteredFileExtension>docx</nonFilteredFileExtension>
<nonFilteredFileExtension>doc</nonFilteredFileExtension>
<nonFilteredFileExtension>pdf</nonFilteredFileExtension>
<nonFilteredFileExtension>jasper</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
ps:配置要有,否則可能會出現io異常
6.服務代碼,我這里使用的是map傳參的方式
//引入jasper文件
ClassPathResource resource = new ClassPathResource("templates/collate.jasper");
try {
//文件輸入流的兩種獲取方式
// FileInputStream fis = new FileInputStream(resource.getFile());
InputStream inputStream = resource.getInputStream();
Map<String, Object> map = new HashMap<>();
map.put("userName","zhangsan");
map.put("pass","123456")
/**查看底層代碼發現JasperFillManager.fillReport(inputStream, map,new JREmptyDataSource())
*中有調用(JasperReport) JRLoader.loadObject(inputStream)所以在這里我注掉了
*如果要使用(JasperReport) JRLoader.loadObject(inputStream)該方法
*fillReport方法的參數改為JasperFillManager.fillReport(jasperReport, map,new JREmptyDataSource())
*/
// JasperReport jasperReport = (JasperReport) JRLoader.loadObject(inputStream);
//將數據源傳遞collate.jasper進行數據拼裝
//fillReport接口就是處理數據和.jasper文件交互的方法
JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream, map,new JREmptyDataSource());
/**
*JasperCompileManager: 用於編譯JRXML報表模板。
*JasperFillManager: 用於填充一個報表,從數據源的數據
*JasperPrintManager: 用於打印的JasperReports類庫生成的文件
*JasperExportManager: 用於獲取PDF,HTML或XML內容以供報表填充過程中產生的 *文件
*JasperViewer: 它代表了一個簡單的Java Swing應用程序,可以加載和顯示報表。
*JasperDesignViewer: 用於在設計時預覽報表模板。
*/
//調用打印方法
JasperPrintManager.printReport(jasperPrint,true);
} catch (Exception e) {
e.printStackTrace();
}
參數解釋:
JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream, map,new JREmptyDataSource());
//參數1輸入流,即讀取的文件
//參數2數據map集合
//參數3數據源,我這里使用的是map傳參所有數據源給的空數據源對象,必須要有數據源對象
//也可以使用數據源的方式調用,map給個空的hasmap即可,數據源即jdbc連接
7.項目設置
8.部署項目到linux時的字體問題解決
找到jasper文件中使用的字體,復制到項目resources/fonts下,並且在該目錄下創建fonts.xml文件,fonts.xml文件內容為
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="華文宋體">
<normal>fonts/STSONG.TTF</normal>
<bold>fonts/STSONG.TTF</bold>
<italic>fonts/STSONG.TTF</italic>
<boldItalic>fonts/STSONG.TTF</boldItalic>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
<exportFonts>
<export key="net.sf.jasperreports.html">'華文宋體', Arial, Helvetica, sans-serif</export>
<export key="net.sf.jasperreports.xhtml">'華文宋體', Arial, Helvetica, sans-serif</export>
</exportFonts>
</fontFamily>
</fontFamilies>
在resources下創建配置文件jasperreports.properties忽略字體檢測,內容為:
net.sf.jasperreports.awt.ignore.missing.font=true
在resources下創建配置文件jasperreports_extension.properties指定使用的字體配置,內容為:
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.lobstertwo=fonts/fonts.xml
9.以下在正常部署項目到linux中啟動報錯headlessException時使用
如果是在linux系統運行可以使用 nohup java -Djava.awt.headless=false -jar xxx.jar >catalina.out 2>&1 &