【已解决】docx4j 结合Thymeleaf 的各种依赖问题(坑)
这里写目录标题
- 版本依赖找不到
- 解决方法
- XHTMLImporterImpl 缺少,这边已经引用了 docx4j或者docx4j-cored的最新版本依旧缺少
- 解决方法
- 如果发生类文件错误,请降低版本
- 解决方案
- xhtmlrender相关环境缺失
- Can't instantiate JAXB Reference Implementation
- 解决方法
- org/docx4j/jaxb/ri/NamespacePrefixMapper has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
- 解决方法
- 最终引用到的所有依赖
- 案例
最近来个需求,复杂的word样式。这边采用的是docx4j 结合Thymeleaf。寻求chatGPT快速使用引发了一些问题。
版本缺少,XHTMLImporterImpl缺失
版本依赖找不到
org.docx4j:docx4j:jar:8.1.5 was not found in http://mirrors.cloud.tencent.com/nexus/repository/maven-public/ during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of tencent-cloud has elapsed or updates are forced
解决方法
在mvnrepository 中搜索版本信息,一般各大源的版本都同步的,发现最高只到6.1x
还在仓库中发现,库迁移,那这边直接引入
Relocated → org.docx4j » docx4j-core
XHTMLImporterImpl 缺少,这边已经引用了 docx4j或者docx4j-cored的最新版本依旧缺少
依旧搜索GPT,答案一致,依旧网上冲浪
解决方法
偶然才中央仓库中看到这个依赖
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-ImportXHTML</artifactId>
<version>11.4.8</version>
</dependency>
成功导入
如果发生类文件错误,请降低版本
docx4j-ImportXHTML 11.4.8采用jdk11的,引用的是jd8的
解决方案
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-ImportXHTML</artifactId>
<version>8.3.11</version>
</dependency>
xhtmlrender相关环境缺失
导出的时候如果发生xhtmlrender缺失,请加入以下依赖
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>xhtmlrenderer</artifactId>
<version>3.0.0</version>
</dependency>
Can’t instantiate JAXB Reference Implementation
解决方法
请加入docx4j-JAXB-ReferenceImpl
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
<version>8.3.11</version>
</dependency>
org/docx4j/jaxb/ri/NamespacePrefixMapper has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
解决方法
降低docx4j版本,保持
docx4j-core和 docx4j-JAXB-ReferenceImpl 和 docx4j-ImportXHTML一致
最终引用到的所有依赖
<!-- 整合Thymeleaf的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-core</artifactId>
<version>8.3.11</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-ImportXHTML</artifactId>
<version>8.3.11</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>xhtmlrenderer</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
<version>8.3.11</version>
</dependency>
案例
@GetMapping("/exportWord")
public void thymeleafExport(Long id, HttpServletResponse response) {
String fileName = "计划模板";
// 创建模板中的参数集合
Map<String, Object> map = new HashMap<>();
// 富文本的内容
GdsPlanWordExportDTO entity = gdsPlanGeneratorService.queryGdsPlanWordDto(id);
map.put("title", entity.getTitle());
map.put("planSchoolSchedules", entity.getPlanSchoolSchedules());
map.put("questionsReminders", entity.getQuestionsReminders());
// map.put("testResultList", entity.getTestResultList());
map.put("planRunList", entity.getResultList());
map.put("planDayList", entity.getPlanDayList());
// 4设置数据
Context context = new Context();
context.setVariables(map);
// 写入输入(模板名称,数据)
String process = springTemplateEngine.process("计划模板", context);
// 下载word
try {
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
// 获取主文档部分
MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart();
// // 导入HTML内容到Word文档
XHTMLImporterImpl xhtmlImporter = new XHTMLImporterImpl(wordMLPackage);
mainDocumentPart.getContent().addAll(xhtmlImporter.convert(process, null));
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword;charset=utf-8");
response.setHeader("Access-Control-Expose-Headers", "Content-disposition");
response.setHeader("Content-disposition",
"attachment; filename=" + URLEncoder.encode(fileName.concat(".docx"), "UTF-8"));
ServletOutputStream out = response.getOutputStream();
wordMLPackage.save(out);
out.flush();
out.close();
}
catch (Exception e) {
e.printStackTrace();
}
}