使用freemarker模板 生成 word文档
1. 引入需要的jar包:
<!-- 导出word -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.docx4j/docx4j -->
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j</artifactId>
<version>6.1.2</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-ImportXHTML</artifactId>
<version>6.1.0</version>
</dependency>
2. 在src/main/resources 下面新建 templates问价夹,新建template.html文件:
并定义文件内容:
<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"></meta><meta name="viewport" content="width=device-width, initial-scale=1.0"></meta><title>${name}的简历</title><style>@page {size: A4;margin: 5mm 10mm; /* 上下和左右两个方向的边距分别为 10mm 和 20mm */}body {font-family: Arial, sans-serif;margin: 0;padding: 0;background-color: #f4f4f9;}.container {width: 80%;margin: 0 auto;padding: 20px;background-color: #ffffff;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);}h1 {text-align: center;color: #333;}.section-title {color: #4CAF50;margin-top: 20px;}.section-content {margin: 10px 0;}.contact-info, .skills, .experience, .education {margin-bottom: 20px;}.experience, .education {margin-top: 10px;}ul {list-style-type: none;padding-left: 0;}li {margin-bottom: 10px;}.job, .degree {font-weight: bold;}.image{height:200px;width:200px;}</style>
</head><body><div class="container"><h1>${name}的简历</h1><!-- 联系信息 --><div class="contact-info"><h2 class="section-title">联系信息</h2><p>邮箱: ${email}</p><p>电话: ${phone}</p></div><div class="contact-info"><h2 class="section-title">图片</h2><img class="image" src="${image}" alt="描述文本"></img></div><!-- 工作经历 --><div class="experience"><h2 class="section-title">工作经历</h2><#list experience as job><div class="job"><p><strong>${job.position}</strong> 在 ${job.company}(${job.startYear} - ${job.endYear})</p><p>${job.description}</p></div></#list></div></div></body>
</html>
3. 运行生成word文档
package auto;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.docx4j.Docx4J;
import org.docx4j.convert.in.xhtml.XHTMLImporterImpl;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.exceptions.InvalidFormatException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;import com.alibaba.fastjson.JSON;import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/***/
public class GenerateWordUtil {// 模板路径private static final String templatesPath = "/templates";// 模板文件private static final String templatesFile = "template.html";public static void main(String[] args) { Map<String, Object> data = new HashMap();data.put("name", "张三");data.put("email", "张三@email.com");data.put("phone", "62886969");List<Job> list = new ArrayList();Job job1 = new Job();job1.setCompany("汇川科技");job1.setDescription("descropytion aaaaaaaaaaaaaaaaaaaaaa");job1.setStartYear("2015");job1.setEndYear("2020");job1.setPosition("经理");list.add(job1);Job job2 = new Job();job2.setCompany("追光科技");job2.setDescription("descropytion aaaaaaaaaaaaaaaaaaaaaa");job2.setStartYear("2020");job2.setEndYear("2025");job2.setPosition("总");list.add(job2);data.put("experience", list);data.put("image", "data:image/png;base64,iVBORw0KGgoAA") //base64 也可以是urlgenerateWord(dto, "F:\\temp\\word33.docx");}public static void generateWord(Object data, String filePName) {// 配置 FreemarkerConfiguration cfg = new Configuration(Configuration.VERSION_2_3_30);// 获取 HTML 模板try {cfg.setClassForTemplateLoading(GenerateWordUtil.class, templatesPath);Template template = cfg.getTemplate(templatesFile);// step2 获取模版路径//cfg.setDirectoryForTemplateLoading(new File(BeanConfig.JPA_TEMPLATE_PATH));// step3 创建数据模型// step4 加载模版文件//Template template = cfg.getTemplate(templatesFile);// 使用 Freemarker 填充模板StringWriter writer = new StringWriter();template.process(data, writer);String htmlContent = writer.toString();// 创建 Word 文档包WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart();// 创建 XHTML 导入器实现类实例XHTMLImporterImpl xhtmlImporter = new XHTMLImporterImpl(wordMLPackage);// 将 HTML 内容导入到 Word 文档中java.util.List<Object> convertedXHTML = xhtmlImporter.convert(htmlContent, null);// 将转换后的内容添加到文档主体中mainDocumentPart.getContent().addAll(convertedXHTML);// 保存生成的 Word 文档File outputFile = new File(filePName);Docx4J.save(wordMLPackage, outputFile, Docx4J.FLAG_NONE);System.out.println("Word 文档生成成功:" + outputFile.getAbsolutePath());} catch (IOException e) {throw new RuntimeException(e);} catch (TemplateException e) {throw new RuntimeException(e);} catch (InvalidFormatException e) {throw new RuntimeException(e);} catch (Docx4JException e) {throw new RuntimeException(e);}}}