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 模板需要的数据模型:

java
import 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:

java
import 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 文档:

java
import 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 文档:

java
public 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, 数据模型