当前位置: 首页 > backend >正文

使用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);}}}

http://www.xdnf.cn/news/13865.html

相关文章:

  • PMP证--开篇
  • AI的镜像:人工智能如何重塑人类认知边界
  • 路由交换技术-思科拓扑搭建
  • 深度解析SerpAPI:AI时代的智能搜索引擎集成方案
  • 农田实时监测与管理系统开发
  • byte数组变量转int变量
  • 一[2]、ubuntu18.04环境 yolov8 + realsenseD435i 实时效果测试
  • Docker 网络模式
  • Doris与DS结合实现MySQL侧的Upsert功能
  • SpringCloud + MybatisPlus:多租户模式与实现
  • Catch2 开源库介绍与使用指南
  • 【threejs】每天一个小案例讲解:常见材质
  • oracle 23ai json简单使用
  • reactive() 和 toRef()
  • 微服务架构中的 Kafka:异步通信与服务解耦(四)
  • 《哈希算法》题集
  • 最新Transformer模型及深度学习前沿技术应用
  • python学习---dayday2
  • 使用文件的基本操作和文件内容读写操作实现三个功能
  • 中间件是微服务架构的支撑工具,微服务是中间件的应用场景之一。
  • 基于PHP的图书商城(vue版)
  • 拨码开关(DIP Switch)原理、参数、选型与应用指南
  • Linux x86_64架构下的四级分页机制详解
  • Cordova移动应用对云端服务器数据库的跨域访问
  • 图像处理与机器学习项目:特征提取、PCA与分类器评估
  • AI基础知识(07):基于 PyTorch 的手写体识别案例手册
  • 一篇文章理解js闭包和作用于原理
  • 【消息队列】——如何使用Actor模型解决并发问题
  • 基于springboot视频及游戏管理系统+源码+文档
  • Python图像处理基础(六)