JasperReport和iReport的java集成大全


好久沒更新了,最近在研究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

項目的層級如下:

至此,日常簡單報表應該已經能徹底滿足需求了,代碼也比較詳細,謝謝大家,有問題可以留言(反正我也不會給你答疑哈哈哈哈)!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM