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

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

相关文章:

  • 【论文阅读笔记】高光反射实时渲染新突破:3D Gaussian Splatting with Deferred Reflection 技术解析
  • Spring MVC 常用请求处理注解总结
  • 三轴云台之运动控制系统篇
  • uniapp——input 禁止输入 ,但是可以点击(禁用、可点击)
  • php列表头部增加批量操作按钮,多选订单数据批量微信退款(含微信支付SDK)
  • Kafka入门:解锁核心组件,开启消息队列之旅
  • 如何“下载安转Allure”?
  • UML和模式应用(软件分析设计与建模期末复习)
  • leetcode 从中序与后序序列 or 从前序与中序序列 构造二叉树 java
  • 【大模型应用开发】基于langchain的大模型调用及简单RAG应用构建
  • MATLAB griddatan 函数支持的插值方法MATLAB 的 griddatan 函数主要支持以下几种插值方法
  • 【系统时间不同步】
  • P10987 [蓝桥杯 2023 国 Python A] 火车运输
  • 芯片制程变化
  • 主流邻近标记技术解析与应用
  • ARM 和 x86_64是什么关系
  • Oracle Form判断表单数据重复方法
  • 用idea进行数据同步
  • 大中台应用的层次抽象
  • cf1742D
  • 深圳响应式网站建设公司/最新军事新闻今日最新消息
  • 中医风格网站模板/如何制作网址链接
  • 如何查询注册过的网站/免费发布软文广告推广平台
  • 做网站平面模板是啥意思/seo这个职位是干什么的
  • h5响应式集团网站推荐/百度官方电话人工服务电话
  • 浙江网站建设制作流程/自己做网站的流程