天天看點

Jasper(2)——簡單使用導出PDF報表

接着上一次所說的,沒看過的可跳轉

Jasper(1)——入門

第一階段:初步導出PDF

Jasper報表設計

點選 Static Text,并拖動到 title 位置

Jasper(2)——簡單使用導出PDF報表

然後輕按兩下此框,根據需要修改,可看下圖

Jasper(2)——簡單使用導出PDF報表

修改好後可以調一下藍線(各個band的高度)或者如圖所示

Jasper(2)——簡單使用導出PDF報表

或者如下圖修改

Jasper(2)——簡單使用導出PDF報表

接着Page Header我随便弄了點中文,跟title差不多

在弄Column Header和Detail部分之前,先做點東西~

outline視圖,右鍵field -> Create Field

你會看到如下圖的亞子

Jasper(2)——簡單使用導出PDF報表

比如我這個field是id,類型為Integer,看String是不符的,是以如下圖操作

Jasper(2)——簡單使用導出PDF報表

這樣,id列名就創好啦~接下來如法炮制,建立name和school列名,兩者都是String類型

Jasper(2)——簡單使用導出PDF報表

接下來,我們把它們拖動到Detail部分,然後慢慢調整弄整齊

PS:拖到Detail的時候,Column Header也對應有一個框(Static Text)!

Jasper(2)——簡單使用導出PDF報表

其實,看到圖中,是否會有問“$F{id}”是啥意思?

其實Detail的框是Text Field,輕按兩下一看,如圖

Jasper(2)——簡單使用導出PDF報表

Column Footer我就随便寫了哈,不展示了

Page Footer一般是寫頁碼之類的,我就用個函數,如下圖所示

Jasper(2)——簡單使用導出PDF報表

Summary部分我這邊加一個入參,這個入參建立參考上面的field即可

Jasper(2)——簡單使用導出PDF報表

這樣一個報表就完成啦~可以預先浏覽

Jasper(2)——簡單使用導出PDF報表
Jasper(2)——簡單使用導出PDF報表

這裡就是對應該xml的源碼

Jasper(2)——簡單使用導出PDF報表

編譯該檔案

Jasper(2)——簡單使用導出PDF報表

這樣設計報表部分完成!

Java代碼導出部分

本次我用Springboot來進行pdf導出

檔案目錄大概是這樣

Jasper(2)——簡單使用導出PDF報表

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>jasperdemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>5.6.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.olap4j</groupId>
                    <artifactId>olap4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.olap4j</groupId>
            <artifactId>olap4j</artifactId>
            <version>0.9.7.309-JS-3</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.11</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/jfree/jcommon -->
        <dependency>
            <groupId>jfree</groupId>
            <artifactId>jcommon</artifactId>
            <version>1.0.15</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/jfree/jfreechart -->
        <dependency>
            <groupId>jfree</groupId>
            <artifactId>jfreechart</artifactId>
            <version>1.0.12</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-all -->
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
           

本次我将用模拟資料來示範,建立一個Student類

package com.copa.domain;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * @author copa
 * @createDate 2021-07-25 21:51
 * @function
 */
@Data
@AllArgsConstructor
public class Student {

    private Integer id;

    private String name;

    private String school;
}

           

controller

package com.copa.controller;

import com.copa.domain.Student;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * @author copa
 * @createDate 2021-07-25 21:02
 * @function 導出pdf
 */
@RestController
public class TestController {

    @RequestMapping(value = "/pdf1")
    public void pdf1(Map<String, Object> parameters,
                                        HttpServletResponse response) throws IOException {
        ServletOutputStream os = response.getOutputStream();
        try {
            ArrayList<Student> list = new ArrayList<>();
            for (int i = 1; i <= 40; i++) {
                list.add(new Student(i, "copa" + i, i <= 20 ? "一中" : "二中"));
            }
            JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
            parameters = parameters == null ? new HashMap<>() : parameters;
            parameters.put("summary", "我是summary~");
            ClassPathResource resource = new ClassPathResource("jasper/demo1.jasper");
            response.setContentType("application/pdf");
            InputStream jasperStream = resource.getInputStream();
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperStream, parameters, dataSource);
            JasperExportManager.exportReportToPdfStream(jasperPrint, os);
        } catch (JRException e) {
            e.printStackTrace();
        } finally {
            os.flush();
        }
    }
}

           

那麼,啟動項目,檢視效果

http://localhost:8080/pdf1

Jasper(2)——簡單使用導出PDF報表

看起來…好像沒邊框很别扭,那麼我們傳回去加邊框

Jasper(2)——簡單使用導出PDF報表

重新編譯,覆寫檔案,再次嘗試~

Jasper(2)——簡單使用導出PDF報表

這樣,邊框就出來了~但是,有沒有看到有些内容沒顯示的o(╥﹏╥)o

這是…中文的問題…因為Jasper它沒考慮到中文,檢視它的源碼可知

Jasper(2)——簡單使用導出PDF報表

第二階段:解決中文問題

首先,從網上找字型,比如下圖

Jasper(2)——簡單使用導出PDF報表

然後這裡添加字型

Jasper(2)——簡單使用導出PDF報表
Jasper(2)——簡單使用導出PDF報表

這樣就添加好字型了,然後給顯示中文的都換上這個字型

Jasper(2)——簡單使用導出PDF報表

然後編譯并覆寫

在java代碼這一塊,建立下圖幾個檔案

Jasper(2)——簡單使用導出PDF報表

ttf檔案是你在報表設計時用到的字型檔案

font.xml

<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
    <fontFamily name="是微軟雅黑吖">
        <normal>jasper/fonts/msyh.ttf</normal>
        <bold>jasper/fonts/msyh.ttf</bold>
        <italic>jasper/fonts/msyh.ttf</italic>
        <boldItalic>jasper/fonts/msyh.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.dejavu=jasper/fonts/fonts.xml
           

添加完成後,再次運作

http://localhost:8080/pdf1

這樣就成功啦~

Jasper(2)——簡單使用導出PDF報表

底部也對應顯示~

Jasper(2)——簡單使用導出PDF報表

這樣導出PDF報表就完成啦~

O(∩_∩)O~

項目位址:https://gitee.com/copaa/jasperdemo

導航欄:

Jasper(3)——制作圖表報表

Jasper(4)——制作分組報表

Jasper(5)——制作父子報表

Jasper(6)——小技巧& 各種bug(有緣再補充)