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

【已解决】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();
   }
}

http://www.kler.cn/news/355750.html

相关文章:

  • 【Spring声明式事务失效的12种场景测试】
  • Redis 数据类型Bitmaps(位图)
  • ES-入门-javaApi-文档-新增-删除
  • 【芙丽芳丝净润洗面霜和雅漾舒护活泉喷雾
  • AnaTraf | TCP重传的工作原理与优化方法
  • 【数据分享】1901-2023年我国省市县三级逐月最低气温(免费获取/Shp/Excel格式)
  • 详解tcpdump
  • (4) cuda cudnn TensorRT安装及配置
  • Qt(信号槽)
  • 等保测评与网络安全应急响应
  • uni-app 实现好看易用的抽屉效果
  • 实时计算Flink应用场景
  • PMP--必刷题–解题–161-172
  • python编程:常用模块分类整理
  • 打包使用pythn编写的maya插件,使用pyeal打包
  • Karmada核心概念
  • beyond compare 这个授权密钥已被吊销
  • Lucene 倒排索引
  • 5.深度学习计算
  • 【MR开发】在Pico设备上接入MRTK3(二)——在Unity中配置Pico SDK