好久沒更新了,最近在研究java開源報表
JasperReports和 iReport
實際使用效果還不錯,美中不足的是沒有自帶補空行的功能(通過給報表數據增加null值可以實現)和文字旋轉(好像不支持帶@的旋轉字體)
不過應付日常簡單報表已經綽綽有余,還是值得記錄一下!!!
通過 iReport設計報表請自己學習,比較容易上手,我只貼出調用報表預覽打印的相關代碼
先上 pom.xml
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- jasperreports Start --> <!-- 該包的作用完成ireport中Preview按扭功能。通過該包可以通過java來ireport生成摸班(.jrxml或.jasper)填充數據源並導出pdf,excel,html等格式文件 --> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.10.0</version> </dependency> <dependency> <!-- 生成pdf所依賴的包 --> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.4.3</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-pdfa</artifactId> <version>5.4.3</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> <!--將.jrxml編譯成.jasper.如果你不使用java編譯,而使用ireport工具編譯則無須導入該 包 --> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.4.13</version> </dependency> <!-- jasperreports End --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <!-- 報表導出Excle所需的包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
使用jdbc數據源示例
不帶參數
1 @RequestMapping("/report2") 2 public void createtopdf(HttpServletRequest request, HttpServletResponse response) throws Exception { 3 Resource resource = new ClassPathResource("templates/report2.jasper"); 4 FileInputStream fis = new FileInputStream(resource.getFile()); 5 ServletOutputStream os = response.getOutputStream(); 6 try { 7 Map parameters = new HashMap<>(); 8 Connection conn = getConnection(); 9 JasperPrint print = JasperFillManager.fillReport(fis, parameters, conn); 10 JasperExportManager.exportReportToPdfStream(print, os); 11 } catch (JRException e) { 12 e.printStackTrace(); 13 } finally { 14 os.flush(); 15 } 16 } 17 /** 18 * 返回一個mysql的數據連接對象 19 * 20 * @return 21 * @throws Exception 22 */ 23 public Connection getConnection() { 24 String url = "jdbc:mysql://localhost:3306/xxxx?serverTimezone=UTC"; 25 try { 26 Class.forName("com.mysql.cj.jdbc.Driver"); 27 Connection conn = DriverManager.getConnection(url, "root", "root"); 28 return conn; 29 } catch (ClassNotFoundException e) { 30 e.printStackTrace(); 31 } catch (SQLException e) { 32 e.printStackTrace(); 33 } 34 return null; 35 }
帶有參數可以進行數據篩選的
設計報表時設置相應的參數如下
核心代碼如下:
/** * 可以帶有參數篩選的JDBC連接源填充 * * @param request * @param response * @param params * @throws Exception */ @RequestMapping("/params") public void createpdf33(HttpServletRequest request, HttpServletResponse response, String params) throws Exception { Resource resource = new ClassPathResource("templates/hasparams.jasper"); FileInputStream fis = new FileInputStream(resource.getFile()); ServletOutputStream os = response.getOutputStream(); try { Map<String, Object> parameters = new HashMap<>(); parameters.put("id", params); Connection conn = getConnection(); JasperPrint print = JasperFillManager.fillReport(fis, parameters, conn); JasperExportManager.exportReportToPdfStream(print, os); } catch (JRException e) { e.printStackTrace(); } finally { os.flush(); } }
使用javabean作為數據源填充數據調用示例:
/** * 使用javabean填充數據 * * @param request * @param response * @throws Exception */ @RequestMapping("/bean2") public void javabeantest222(HttpServletRequest request, HttpServletResponse response) throws Exception { Resource resource = new ClassPathResource("templates/bean2.jasper"); FileInputStream fis = new FileInputStream(resource.getFile()); ServletOutputStream os = response.getOutputStream(); try { Map<String, Object> parameters = new HashMap<>(); List<SysUser> list = getuser(); JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(list); // Connection conn = getConnection(); JasperPrint print = JasperFillManager.fillReport(fis, parameters, ds); JasperExportManager.exportReportToPdfStream(print, os); } catch (JRException e) { e.printStackTrace(); } finally { os.flush(); } }
使用LIst<Map<String,Object>>填充數據調用方式:
/** * 使用List<Map<String,Object>>集合填充數據 * * @param request * @param response * @throws Exception */ @RequestMapping("/testmap") public void testmapcollection(HttpServletRequest request, HttpServletResponse response) throws Exception { Resource resource = new ClassPathResource("templates/javabean.jasper"); FileInputStream fis = new FileInputStream(resource.getFile()); ServletOutputStream os = response.getOutputStream(); try { Map<String, Object> parameters = new HashMap<>(); List<Map<String, Object>> list = getMapmodel(); System.out.println(list.toString()); JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(list); // Connection conn = getConnection(); JasperPrint print = JasperFillManager.fillReport(fis, parameters, ds); String filename = "javabean"; response.setContentType("application/pdf"); // response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8") + ".pdf"); JasperExportManager.exportReportToPdfStream(print, os); } catch (JRException e) { e.printStackTrace(); } finally { os.flush(); } }
使用HTML方式預覽報表調用代碼:
/** * 預覽html格式 * * @param request * @param response * @throws Exception */ @RequestMapping("/html") public void testhtml(HttpServletRequest request, HttpServletResponse response) throws Exception { Resource resource = new ClassPathResource("templates/javabean.jasper"); FileInputStream fis = new FileInputStream(resource.getFile()); ServletOutputStream os = response.getOutputStream(); try { Map<String, Object> parameters = new HashMap<>(); List<Map<String, Object>> list = getMapmodel(); JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(list); // Connection conn = getConnection(); JasperPrint print = JasperFillManager.fillReport(fis, parameters, ds); // JasperExportManager.exportReportToPdfStream(print,os); JasperExportManager.exportReportToHtmlFile(print, request.getServletContext().getRealPath("/") + "test.html"); response.sendRedirect("test.html"); } catch (JRException e) { e.printStackTrace(); } finally { os.flush(); } }
在服務器端批量轉成word代碼示例:
/** * 在服務器端批量導出生成word文件,可以一次性導出多個JasperPrint * @param request * @param response * @throws Exception */ @RequestMapping("/report.doc") public void testword(HttpServletRequest request, HttpServletResponse response) throws Exception { Resource resource = new ClassPathResource("templates/javabean.jasper"); FileInputStream fis = new FileInputStream(resource.getFile()); ServletOutputStream os = response.getOutputStream(); try { Map<String, Object> parameters = new HashMap<>(); List<Map<String, Object>> list = getMapmodel(); JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(list); // Connection conn = getConnection(); JasperPrint print = JasperFillManager.fillReport(fis, parameters, ds); // JasperExportManager.exportReportToPdfStream(print,os); // JasperExportManager.exportReportToHtmlFile(print, request.getServletContext().getRealPath("/") + "test.html"); // response.sendRedirect("test.html"); JRDocxExporter exporter = new JRDocxExporter(); List<JasperPrint> plist = new ArrayList<>(); plist.add(print); exporter.setExporterInput(SimpleExporterInput.getInstance(plist)); exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(new File("D:/javabean.doc"))); exporter.exportReport(); System.out.println("批量導出word文件成功"); } catch (JRException e) { e.printStackTrace(); } finally { os.flush(); } }
直接使用 .jrxml模板先進行代碼編譯然后調用示例:
/** * 把jrxml文件編譯成 jrasper文件,之后填充數據 * @param request * @param response * @throws IOException * @throws SQLException */ @RequestMapping("/compile") public void Compilejrxml(HttpServletRequest request,HttpServletResponse response)throws IOException,SQLException { String path = "D:\\Idea Projects\\jasper\\src\\main\\resources\\templates\\report6.jrxml"; File file = new File(path); String parentPath = file.getParent(); String jrxmlDestSourcePath = parentPath+"/report9.jasper"; try { JasperCompileManager.compileReportToFile(path, jrxmlDestSourcePath); } catch (JRException e) { e.printStackTrace(); } File jfile = new File(parentPath+"\\report9.jasper"); FileInputStream fis = new FileInputStream(jfile); ServletOutputStream os = response.getOutputStream(); try { Map<String, Object> parameters = new HashMap<>(); List<Map<String, Object>> list = getMapmodel11(); System.out.println(list.toString()); JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(list); JasperPrint print = JasperFillManager.fillReport(fis, parameters, ds); JasperExportManager.exportReportToPdfStream(print, os); } catch (JRException e) { e.printStackTrace(); } finally { os.flush(); } }
報表生成pdf並在客戶端下載示例:
/** * 下載報表pdf格式 * @param request * @param response * @throws Exception */ @RequestMapping("/downloadpdf") public void testmapcollection1234(HttpServletRequest request, HttpServletResponse response) throws Exception { Resource resource = new ClassPathResource("templates/javabean.jasper"); FileInputStream fis = new FileInputStream(resource.getFile()); ServletOutputStream os = response.getOutputStream(); try { Map<String, Object> parameters = new HashMap<>(); List<Map<String, Object>> list = getMapmodel(); System.out.println(list.toString()); JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(list); JasperPrint print = JasperFillManager.fillReport(fis, parameters, ds); response.setContentType("application/pdf"); response.setCharacterEncoding("UTF-8"); String filename = "javabean"; response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8") + ".pdf"); JRPdfExporter exporter = new JRPdfExporter(); exporter.setExporterInput(new SimpleExporterInput(print)); exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(os)); SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration(); exporter.setConfiguration(configuration); exporter.exportReport(); } catch (JRException e) { e.printStackTrace(); } finally { os.flush(); } }
報表生成Excel並下載至客戶端代碼:
/** * 報表下載xls格式 * @param request * @param response * @throws Exception */ @RequestMapping("/downloadxls") public void testmapcollection12342(HttpServletRequest request, HttpServletResponse response) throws Exception { Resource resource = new ClassPathResource("templates/javabean.jasper"); FileInputStream fis = new FileInputStream(resource.getFile()); ServletOutputStream os = response.getOutputStream(); try { Map<String, Object> parameters = new HashMap<>(); List<Map<String, Object>> list = getMapmodel(); System.out.println(list.toString()); JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(list); JasperPrint print = JasperFillManager.fillReport(fis, parameters, ds); response.setContentType("application/xls"); response.setCharacterEncoding("UTF-8"); String filename = "javabean"; response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8") + ".xls"); JRXlsExporter exporter = new JRXlsExporter(); exporter.setExporterInput(new SimpleExporterInput(print)); exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(os)); SimpleXlsExporterConfiguration configuration = new SimpleXlsExporterConfiguration(); exporter.setConfiguration(configuration); exporter.exportReport(); } catch (JRException e) { e.printStackTrace(); } finally { os.flush(); } }
報表生成word格式並下載至客戶端代碼示例:
/** * 報表下載word(DOC)格式 * @param request * @param response * @throws Exception */ @RequestMapping("/downloadword") public void testmapcollection1232342(HttpServletRequest request, HttpServletResponse response) throws Exception { Resource resource = new ClassPathResource("templates/javabean.jasper"); FileInputStream fis = new FileInputStream(resource.getFile()); ServletOutputStream os = response.getOutputStream(); try { Map<String, Object> parameters = new HashMap<>(); List<Map<String, Object>> list = getMapmodel(); System.out.println(list.toString()); JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(list); JasperPrint print = JasperFillManager.fillReport(fis, parameters, ds); response.setContentType("application/ms-word"); response.setCharacterEncoding("UTF-8"); String filename = "javabean"; response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8") + ".doc"); JRDocxExporter exporter = new JRDocxExporter(); exporter.setExporterInput(new SimpleExporterInput(print)); exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(os)); SimpleDocxExporterConfiguration configuration = new SimpleDocxExporterConfiguration(); exporter.setConfiguration(configuration); exporter.exportReport(); } catch (JRException e) { e.printStackTrace(); } finally { os.flush(); } }
JasperReports生成的PDF報表會存在中文顯示的問題,需要自行設置字體
處理如下
在項目的 resources文件夾下新建文件:
fonts.xml
jasperreports_extension.properties
然后下載ttf的字體文件,放在同級目錄下,我下載的時 STSong.ttf 即為宋體
fonts.xml如下
<?xml version="1.0" encoding="UTF-8"?> <fontFamilies> <fontFamily name="仿宋"> <normal>STSONG.TTF</normal> <bold>STSONG.TTF</bold> <italic>STSONG.TTF</italic> <boldItalic>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>
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.xml
項目的層級如下:
至此,日常簡單報表應該已經能徹底滿足需求了,代碼也比較詳細,謝謝大家,有問題可以留言(反正我也不會給你答疑哈哈哈哈)!!!