Java中使用Freemarker转换Workbook

在Java开发中,我们经常需要将数据转换成Excel文件进行导出或者处理。Apache POI是一个非常流行的Java库,用于操作Microsoft Office格式的文件,包括Excel文件。而Freemarker是一个模板引擎,可以将数据和模板结合生成文本输出。本文将介绍如何使用Java中的Freemarker库将数据转换成Excel文件。

准备工作

在开始之前,需要确保已经安装好了Java开发环境,并在项目中添加了以下依赖:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.31</version>
</dependency>

创建Excel模板

首先,我们需要创建一个Excel模板,用于定义导出文件的格式和样式。可以使用Microsoft Excel或者其他Excel编辑器创建一个Excel文件,然后将其另存为Excel模板(.xlsx或者.xls格式)。

在模板中,可以定义表格的标题、列名以及数据的位置。同时,可以设置单元格的样式,如字体、背景颜色、边框等。在需要展示动态数据的地方,可以使用Freemarker语法插入占位符,后续会使用Java代码填充这些占位符。

以下是一个简单的Excel模板示例:

表格模板

名称 价格
${name} ${price}

代码实现

1. 加载Excel模板

在Java代码中,首先需要加载Excel模板文件,并创建一个Workbook对象,通过该对象可以操作Excel文件的各种元素。

import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import java.io.FileInputStream;

public class ExcelGenerator {
    private static final String TEMPLATE_PATH = "template.xlsx";

    public Workbook generate() throws Exception {
        FileInputStream templateFile = new FileInputStream(TEMPLATE_PATH);
        Workbook workbook = WorkbookFactory.create(templateFile);
        templateFile.close();
        return workbook;
    }
}

2. 准备数据

接下来,我们需要准备要填充到Excel模板中的数据。数据可以来自数据库、文件或者其他数据源,这里为了简单起见,我们使用一个包含商品名称和价格的列表。

import java.util.ArrayList;
import java.util.List;

public class DataProvider {
    public List<Product> getProducts() {
        List<Product> products = new ArrayList<>();
        products.add(new Product("Product 1", 10.0));
        products.add(new Product("Product 2", 20.0));
        products.add(new Product("Product 3", 30.0));
        return products;
    }
}

public class Product {
    private String name;
    private double price;

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }
}

3. 使用Freemarker填充数据

现在,我们可以使用Freemarker来填充数据到Excel模板中。首先需要创建一个Configuration对象,用于指定Freemarker的一些配置项。

import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.poi.ss.usermodel.*;
import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class ExcelGenerator {
    // ...

    public void generateExcel() throws Exception {
        // ...
        
        Configuration freemarkerConfig = new Configuration(Configuration.VERSION_2_3_31);
        freemarkerConfig.setClassForTemplateLoading(getClass(), "/");
        Template template = freemarkerConfig.getTemplate("template.ftl");

        // ...
    }
}

然后,我们需要创建一个数据模型,将数据填充到模板中。

public class ExcelGenerator {
    // ...

    public void generateExcel() throws Exception {
        // ...
        
        // Create data model
        Map<String, Object> data = new HashMap<>();
        data.put("products", new DataProvider().getProducts());

        // ...

        // Generate output file
        Writer out = new OutputStreamWriter(new FileOutputStream("output.xlsx"));
        template.process(data,