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,