Java生成报表PDF实现教程

简介

在Java开发中,生成报表PDF是一个常见的需求。本教程将教会你如何使用Java生成报表PDF。首先,我们来看一下整个流程以及每个步骤需要做什么。

流程图

flowchart TD
    A[开始] --> B[准备数据]
    B --> C[生成报表模板]
    C --> D[填充数据到报表]
    D --> E[生成PDF]
    E --> F[保存PDF文件]
    F --> G[结束]

类图

classDiagram
    class 数据准备者{
        +准备数据()
    }
    class 报表模板生成者{
        +生成报表模板()
    }
    class 数据填充者{
        +填充数据()
    }
    class PDF生成者{
        +生成PDF()
    }
    class 文件保存者{
        +保存文件()
    }

    数据准备者 --|> 报表模板生成者
    报表模板生成者 --|> 数据填充者
    数据填充者 --|> PDF生成者
    PDF生成者 --|> 文件保存者

步骤及代码解释

第一步:准备数据

在生成报表之前,我们需要准备好数据。数据可以来自数据库、文件或者其他数据源。在这个例子中,我们假设数据已经准备好了。

// 准备数据
public List<ReportData> prepareData() {
    List<ReportData> data = new ArrayList<>();
    // 从数据库或文件读取数据,并将数据封装成ReportData对象
    // ...
    return data;
}

第二步:生成报表模板

报表模板是一个包含报表样式和布局的文件,通常使用HTML或者XML格式。在这个例子中,我们使用HTML模板。

// 生成报表模板
public String generateTemplate() {
    String template = "<html><head><title>报表模板</title></head><body><table><tr><th>姓名</th><th>年龄</th></tr>{data}</table></body></html>";
    return template;
}

第三步:填充数据到报表

将准备好的数据填充到报表模板中。在这个例子中,我们将每个ReportData对象的属性填充到HTML模板中。

// 填充数据到报表
public String fillDataToTemplate(List<ReportData> data, String template) {
    StringBuilder html = new StringBuilder();
    for (ReportData reportData : data) {
        String row = "<tr><td>{name}</td><td>{age}</td></tr>"
                .replace("{name}", reportData.getName())
                .replace("{age}", String.valueOf(reportData.getAge()));
        html.append(row);
    }
    return template.replace("{data}", html.toString());
}

第四步:生成PDF

使用第三步的结果生成PDF文件。这里我们使用开源库iText来生成PDF。

// 生成PDF
public byte[] generatePDF(String html) {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    PdfWriter writer = PdfWriter.getInstance(document, outputStream);
    document.open();
    InputStream inputStream = new ByteArrayInputStream(html.getBytes());
    XMLWorkerHelper.getInstance().parseXHtml(writer, document, inputStream);
    document.close();
    return outputStream.toByteArray();
}

第五步:保存PDF文件

将生成的PDF文件保存到指定的路径。在这个例子中,我们将PDF文件保存到本地。

// 保存PDF文件
public void savePDF(byte[] pdf, String path) {
    try (OutputStream outputStream = new FileOutputStream(path)) {
        outputStream.write(pdf);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

完整代码

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class ReportGenerator {
    private Document document;

    public ReportGenerator() {
        document = new Document();
    }

    // 准备数据
    public List<ReportData> prepareData() {
        List<ReportData> data = new ArrayList<>();
        // 从数据库或文件读取数据,并将数据封装成ReportData对象
        // ...
        return data;
    }

    // 生成报表模板
    public String generateTemplate() {
        String template = "<html><head><title>报表模板</title></