Java中使用freemarker导出word文档 循环生成表格并且表格每行中都自动插入图片
在 Java 中使用 FreeMarker 模板引擎导出 Word 文档,并在 Word 文档中循环生成表格且每行中自动插入图片,涉及以下几个主要步骤:
1. 设置 FreeMarker 和依赖
首先,你需要在项目中添加 FreeMarker 和 Apache POI 依赖,以便处理模板和 Word 文档。以下是 Maven 配置示例:
xml<dependencies>
<!-- FreeMarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
<!-- Apache POI -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
</dependencies>
2. 创建 FreeMarker 模板
你需要创建一个 FreeMarker 模板文件(例如 template.ftl
),用来定义 Word 文档的结构。以下是一个示例模板,其中包含一个表格,每行插入图片:
html<#-- template.ftl -->
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<table border="1">
<tr>
<th>序号</th>
<th>图片</th>
</tr>
<#list rows as row>
<tr>
<td>${row.index}</td>
<td>
<img src="${row.imageUrl}" width="100" height="100"/>
</td>
</tr>
</#list>
</table>
</body>
</html>
3. Java 代码生成 Word 文档
接下来,使用 Java 代码加载 FreeMarker 模板,将其渲染为 HTML,然后使用 Apache POI 将 HTML 转换为 Word 文档。
3.1 准备数据模型
准备 FreeMarker 模板需要的数据模型:
javaimport java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DataModel {
public static Map<String, Object> getDataModel() {
List<Map<String, String>> rows = new ArrayList<>();
// 示例数据
for (int i = 1; i <= 5; i++) {
Map<String, String> row = new HashMap<>();
row.put("index", String.valueOf(i));
row.put("imageUrl", "http://example.com/image" + i + ".jpg");
rows.add(row);
}
Map<String, Object> dataModel = new HashMap<>();
dataModel.put("rows", rows);
return dataModel;
}
}
3.2 生成 HTML
使用 FreeMarker 渲染模板为 HTML:
javaimport freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Map;
public class HtmlGenerator {
public static String generateHtml(Map<String, Object> dataModel) throws Exception {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setClassForTemplateLoading(HtmlGenerator.class, "/templates");
Template template = cfg.getTemplate("template.ftl");
try (Writer out = new StringWriter()) {
template.process(dataModel, out);
return out.toString();
} catch (TemplateException e) {
throw new RuntimeException("Error processing FreeMarker template", e);
}
}
}
3.3 将 HTML 转换为 Word 文档
使用 Apache POI 将生成的 HTML 内容写入 Word 文档:
javaimport org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFPictureData;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;
public class WordGenerator {
public static void createWordDocument(String htmlContent, String outputPath) throws Exception {
XWPFDocument document = new XWPFDocument();
// Add HTML content to Word document
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText(htmlContent);
try (FileOutputStream out = new FileOutputStream(outputPath)) {
document.write(out);
}
}
}
4. 整合所有部分
整合以上部分,生成最终的 Word 文档:
javapublic class Main {
public static void main(String[] args) {
try {
// 生成数据模型
Map<String, Object> dataModel = DataModel.getDataModel();
// 渲染为 HTML
String htmlContent = HtmlGenerator.generateHtml(dataModel);
// 生成 Word 文档
WordGenerator.createWordDocument(htmlContent, "output.docx");
System.out.println("Word document created successfully.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
总结
在 Java 中使用 FreeMarker 导出 Word 文档并在表格中插入图片,需先创建 FreeMarker 模板定义表格结构,然后使用 FreeMarker 渲染模板为 HTML,再利用 Apache POI 将 HTML 内容转换为 Word 文档。确保模板和数据模型准确配合,图像 URL 在 HTML 中正确插入。
关键字
Java, FreeMarker, Word 文档, Apache POI, 模板渲染, 表格生成, 图片插入, HTML 转 Word, 数据模型