废话不多,直接上码

一、说明

1、jdk1.8
2、springboot项目
3、测试包下目录,如下图:

4、模板文件如下:
html2wordtemplate.docx --> https://download.csdn.net/download/wdy_2099/19686795
5、html如下:

2021年6月10日,重庆QGhappy和佛山GK展开败者组第二轮对决,最终重庆QG4:3佛山GK拿下胜利。
重庆QGhappy确认晋级2021年KPL春季赛季后赛败者组·第三轮,佛山GK遗憾告别2021年KPL春季赛舞台。
<br/><imgsrc="http://inews.gtimg.com/newsapp_bt/0/13638266215/641"style="max-width:100%;" width="50%"/><br/><b>图2&nbsp; 学校举办2020年全面从严治党工作会议暨中层干部培训会</b><br/>
二连击破,穿三无惧!
山城弟子无惧挑战,一穿五第二步完成!目标银龙还剩三步,败者组第三轮,我们一起期待重庆QG的精彩表现!
<br/><imgsrc="http://inews.gtimg.com/newsapp_bt/0/13638266213/641"style="max-width:100%;" width="50%"/><br/><b>图2&nbsp; 学校举办2020年全面从严治党工作会议暨中层干部培训会</b><br/>
春之GK暂别赛场,夏日定要打破魔咒突破自己!
不止要有巅峰手法,更要有重头再来的勇气!2021年王者荣耀世界冠军杯选拔赛,我们一起期待夏日的佛山GK秀翻全场!
集合!新十代!
2021年KPL王者荣耀职业联赛春季赛季后赛6月3日-6月20日每日19点准时开播,召唤师们可通过王者荣耀游戏内赛事专区、王者营地、王者荣耀官网观看直播;还可以登录官方播出平台哔哩哔哩、斗鱼直播、虎牙直播、快手、企鹅电竞、腾讯体育、腾讯视频、腾讯微视收看全程比赛直播和回放,电视大屏观赛用哒啵电竞、云视听极光!

二、核心pom引入

【注意:】依赖的版本,不能乱改,可能会有冲突。

     <properties><poi.version>4.1.2</poi.version><hutool.version>4.6.10</hutool.version><guava.version>20.0</guava.version><commons-lang3.version>3.9</commons-lang3.version>      </properties><dependencies><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>${guava.version}</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>${commons-lang3.version}</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version></dependency><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.12.1</version></dependency><!--poi 类 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>${poi.version}</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>${poi.version}</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>${poi.version}</version></dependency><!--word工具类--><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.9.1</version><exclusions><exclusion><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.4</version></dependency><!--html渲染插件--><dependency><groupId>io.github.draco1023</groupId><artifactId>poi-tl-ext</artifactId><version>0.3.3</version><exclusions><exclusion><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId></exclusion><exclusion><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId></exclusion></exclusions></dependency><!--样式依赖--><dependency><groupId>org.w3c.css</groupId><artifactId>sac</artifactId><version>1.3</version></dependency><dependency><groupId>net.sourceforge.cssparser</groupId><artifactId>cssparser</artifactId><version>0.9.29</version></dependency><!--合并word,free免费版可以用,否则收费--><dependency><groupId>e-iceblue</groupId><artifactId>spire.doc.free</artifactId><version>3.9.0</version></dependency></dependencies>

三、Java测试类


import cn.hutool.core.io.FileUtil;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.policy.PictureRenderPolicy;
import com.deepoove.poi.xwpf.NiceXWPFDocument;
import com.spire.doc.Document;
import com.spire.doc.DocumentObject;
import com.spire.doc.Section;
import com.spire.doc.FileFormat;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.ddr.poi.html.HtmlRenderPolicy;import java.io.*;
import java.util.*;/*** java生成word** @author wangdy* @date 2021-06-15 11:16*/
public class Java2Word {public static void main(String[] args) throws IOException {// html渲染插件HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();// 第一个案例 Configure configure = Configure.builder()// 注册html解析插件.bind("content", htmlRenderPolicy)// .bind("content2", htmlRenderPolicy).build();// 映射数据MapMap<String, Object> data = new HashMap<>();data.put("title", "我是一个案例名称1");data.put("keywords", "我是一个案例keywords");data.put("cty", "我是一个案例cty");data.put("content", readFile("/demo1.html"));// 读取模板文件,并渲染数据XWPFTemplate template = XWPFTemplate.compile(getResourceInputStream("/html2wordtemplate.docx"), configure).render(data);// 写入文件template.writeToFile("demo1.docx");template.close();// 第二个案例Configure configure1 = Configure.builder().bind("content", htmlRenderPolicy).build();Map<String, Object> data1 = new HashMap<>();data1.put("title", "我是一个案例名称2");data1.put("keywords", "我是一个案例keywords2");data1.put("cty", "我是一个案例分类2");data1.put("content", readFile("/demo2.html"));XWPFTemplate template1 = XWPFTemplate.compile(getResourceInputStream("/html2wordtemplate.docx"), configure1).render(data1);template1.writeToFile("demo2.docx");template1.close();// 合并word//加载需要合并的两个文档Document doc1 = new Document("demo1.docx");Document doc2 = new Document("demo2.docx");//获取文档1的最后一节Section lastsec = doc1.getLastSection();//遍历文档2的所有段落内容,添加到文档1for (Section section : (Iterable<Section>) doc2.getSections()) {for (DocumentObject obj : (Iterable<DocumentObject>) section.getBody().getChildObjects()) {lastsec.getBody().getChildObjects().add(obj.deepClone());}}//保存合并后的文档doc1.saveToFile("ALL-Word.docx", FileFormat.Docx);}/*** 读取文件内容** @param resourceFile 文件路径* @return 文件内容* @throws IOException IO异常 * import org.apache.commons.io.IOUtils;*/public static String readFile(String resourceFile) throws IOException {try (InputStream inputStream = FileReader.class.getResourceAsStream(resourceFile)) {return IOUtils.toString(inputStream, StandardCharsets.UTF_8);}}}

好了,运行看结果吧。

【补充1:】

如果html里有table,则原生table加边框样式不生效,需要添加td样式,如将<td>整体替换为<td style="border:1px solid #ccc;">才可以生效,如下效果:

【补充2】:

poi-tl-ext 0.3.3的版本,在实际用的过程中,对于如下html解析有误,升级到0.3.18解决问题。
原HTML如下:

 <p>&nbsp;</p>
<p class="MsoNormal" style="text-align: left; text-indent: 21.0pt; line-height: 20.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span style="font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">根据省人民政府xx政发<span lang="EN-US">(1992)18</span>号文附件六《xxx一九九二年基本建设计划》,现将一九九二年xx基本建设计划下达给你们<span lang="EN-US">(</span>见附表<span lang="EN-US">)</span>,请据此执行</span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 21.0pt; line-height: 20.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span style="font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">附<span lang="EN-US">:</span>xx省一九九二年xx基本建设计划表</span></p>
<p class="MsoNormal" style="text-align: right; line-height: 20.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="right"><span style="font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">单位:万元、平方米</span></p>
<table style="border-collapse: collapse; width: 100%; height: 66px;" border="1"><tbody><tr style="height: 22px;"><td style="width: 11.0637%; height: 44px;" rowspan="2"><span style="font-size: 9.0pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">单位名称</span></td><td style="width: 11.0637%; height: 44px; text-align: center;" rowspan="2"><span style="font-size: 9.0pt; mso-bidi-font-size: 11.0pt; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">项目</span></td><td style="width: 11.0637%; height: 44px; text-align: center;" rowspan="2"><span style="font-size: 9.0pt; mso-bidi-font-size: 11.0pt; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">建设性质</span></td><td style="width: 11.0637%; height: 44px; text-align: center;" rowspan="2"><span style="font-size: 9.0pt; mso-bidi-font-size: 11.0pt; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">建筑面积</span></td><td style="width: 11.0637%; height: 22px; text-align: center;" colspan="3"><span style="font-size: 9.0pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">一九九二年计划投资</span></td><td style="width: 11.0637%; height: 44px; text-align: center;" rowspan="2">备注</td></tr><tr style="height: 22px;"><td style="width: 11.0637%; height: 22px; text-align: center;"><span style="font-size: 9.0pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">合计</span></td><td style="width: 11.0637%; height: 22px; text-align: center;"><span style="font-size: 9.0pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">统筹投资</span></td><td style="width: 11.0637%; height: 22px; text-align: center;"><span style="font-size: 9.0pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">省财政自筹</span></td></tr><tr style="height: 22px;"><td style="width: 11.0637%; height: 22px; text-align: center;"><span style="font-size: 9.0pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">xx工学院</span></td><td style="width: 11.0637%; height: 22px; text-align: center;"><p class="MsoNormal" style="text-align: left; line-height: 12.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span style="font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">图书馆及电教中心</span></p><p class="MsoNormal" style="text-align: left; line-height: 12.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span style="font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">农工住房拆迁</span></p><span style="font-size: 9.0pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">待安排</span></td><td style="width: 11.0637%; height: 22px; text-align: center;"><p class="MsoNormal" style="text-align: left; line-height: 12.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span style="font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">图书馆及电教中心</span></p><p class="MsoNormal" style="text-align: left; line-height: 12.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span style="font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">农工住房拆迁</span></p><span style="font-size: 9.0pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">待安排</span></td><td style="width: 11.0637%; height: 22px; text-align: center;"><span lang="EN-US" style="font-size: 9.0pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">9800</span></td><td style="width: 11.0637%; height: 22px; text-align: center;"><p class="MsoNormal" style="text-align: left; line-height: 12.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span lang="EN-US" style="font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">520</span></p><p class="MsoNormal" style="text-align: left; line-height: 12.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span lang="EN-US" style="font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">200</span></p><p class="MsoNormal" style="text-align: left; line-height: 12.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span lang="EN-US" style="font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">100</span></p><span lang="EN-US" style="font-size: 9.0pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">220</span></td><td style="width: 11.0637%; height: 22px; text-align: center;"><p class="MsoNormal" style="text-align: left; line-height: 12.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span lang="EN-US" style="font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">210</span></p><p class="MsoNormal" style="text-align: left; line-height: 12.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span lang="EN-US" style="font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">200</span></p><p class="MsoNormal" style="text-align: left; line-height: 12.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span lang="EN-US" style="font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">&nbsp;</span></p><span lang="EN-US" style="font-size: 9.0pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">10</span></td><td style="width: 11.0637%; height: 22px; text-align: center;"><p class="MsoNormal" style="text-align: left; line-height: 12.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span lang="EN-US" style="font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">310</span></p><p class="MsoNormal" style="text-align: left; line-height: 12.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span lang="EN-US" style="font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">&nbsp;</span></p><p class="MsoNormal" style="text-align: left; line-height: 12.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span lang="EN-US" style="font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">100</span></p><span lang="EN-US" style="font-size: 9.0pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">210</span></td><td style="width: 11.0637%; height: 22px; text-align: center;"><p class="MsoNormal" style="text-align: left; line-height: 12.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span style="font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">含预拨投资<span lang="EN-US">100</span>万元</span></p><p class="MsoNormal" style="text-align: left; line-height: 12.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span lang="EN-US" style="font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">&nbsp;</span></p><p class="MsoNormal" style="text-align: left; line-height: 12.0pt; mso-line-height-rule: exactly; mso-pagination: widow-orphan;" align="left"><span lang="EN-US" style="font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">&nbsp;</span></p><span style="font-size: 9.0pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">还工程欠款</span></td></tr></tbody>
</table>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>

HTML浏览器解析原样:

升级版本前生成word结果:发现合计等表格没有了,而且备注下面的边框少了一个。

升级版本后生成word结果:

END

Java利用poi-tl实现富文本HTML转Word相关推荐

  1. poi下载,富文本html转word,及微软office打不开问题

    maven导入包: <dependency><groupId>org.apache.poi</groupId><artifactId>poi</a ...

  2. java freemarker 图片_java通过freemarker导出包含富文本图片的word文档

    废话不多说,进入正题! 本文重点在于:对富文本图片的导出(基础的freemarker+word模板导出这里不做详细解说哈) (ps:大神的东西太深奥~~懵逼了 一周才搞定,为了方便后来在更加简单,清晰 ...

  3. Java 富文本内容转化word导出

    一.需求: 当创建使用富文本编辑器,操作完的数据,传输到后台都是带有html标签的. 如:<h1>标题头</h1><h2>第二个标题</h2><a ...

  4. java利用POI替换word文档中的标签

    java利用POI替换word文档中的标签 <dependency><groupId>org.apache.poi</groupId><artifactId& ...

  5. Java利用poi生成word(包含插入图片,动态表格,行合并)

    Java利用poi生成word(包含插入图片,动态表格,行合并) 测试模板样式: 图表 1 Word生成结果: 图表 2 需要的jar包:(具体jar可自行去maven下载) Test测试类: imp ...

  6. java利用poi导出excel功能-附带图片导出

    java利用poi导出excel功能-附带图片导出 写在前面 最近刚离职,闲来无事,于是把上两家公司都有碰到过的需求但都没有去研究实现:即导出带图片的excel报表.于是就折腾了一下这个功能,研究出来 ...

  7. java利用poi实现Excel考勤报表的输出

    java利用poi实现Excel考勤报表的输出 实现效果 SXSSFWorkbook超大数据导出 标题.表头.内容有样式 可以多个sheet(满65535行数据换新的sheet) 一度为快 maven ...

  8. java利用poi读取excel_java利用POI读取excel文件的方法

    摘要:利用java读取excel文件,读取文件并获取文件中每一个sheet中的值. 一.需要提前导入的包: import java.io.File; import java.io.FileInputS ...

  9. JAVA 利用poi EXCLE模板文档导出数据

    JAVA 利用poi EXCLE模板文档导出数据 1.导入jar包 下载地址:添加链接描述 提取码:xqkg 2.EXCLE模板 3.代码示例 package utill;import java.io ...

  10. Java 实现HTML富文本导出至word完美解决方案

    Java 实现HTML富文本导出至word完美解决方案 **需求: 最近用java开发一个申报管理系统,里面有一个根据申请书的模板填写项目申报信息的功能,并将项目申请书word导出功能.** 1: 动 ...

最新文章

  1. 通过nodejs插入删除MongoDB数据
  2. ML之sklearn:sklearn.metrics中常用的函数参数(比如confusion_matrix等 )解释及其用法说明之详细攻略
  3. nodeMCU自动化控制实现空气质量管家
  4. Kafka 安装和搭建 (一)
  5. c 运算符##_C#程序演示关系运算符的示例
  6. Android—修改button属性
  7. 计算机大学一个专业几个班,2016年兰州大学计算机类(含基地班、计算机科学与技术等4个专业)专业最低分是多少?...
  8. 贫血模式or领域模式(转载)
  9. 还不知道如何使用 IDEA ?教你三招快速掌握 IDEA
  10. 戴尔t440服务器性能,戴尔_PowerEdge T440_塔式服务器_网络存储服务器_服务器 | Dell 中国大陆...
  11. jfinal中Interceptor拦截器的使用
  12. bcache -c删除后端设备_前、后端分离权限控制设计与实现
  13. 十三、结构类型(5)——联合
  14. 跟着杨中科学习asp.net之html
  15. NI 国家仪器 各版本软件下载链接
  16. mysql 主键B+Tree 3层存2000W行数据
  17. JS中根据入职时间计算工龄
  18. C++multimap 003:冷血格斗场
  19. shell 自动搜索历史记录
  20. HEVC学习-帧内预测-initAdiPattern函数

热门文章

  1. python高维数据可视化_【机器学习】(十六)主成分分析PCA:高维数据可视化、特征提取...
  2. 12款惊人的HTML5Flash视频播放器
  3. Flash视频播放器 JW PLAYER怎么在网页中运用?
  4. win11字体模糊不清怎么办 windows1字体模糊不清的解决方法
  5. Windows超级管理器绿色单文件版V9.41下载 | 电脑任务管理器损坏可予以替代 | Windows超级管理器下载
  6. echart 世界地图发光_echart世界地图(并且指定国家高亮显示)?
  7. VBA编程基础和编程环境(二)
  8. 通达信自编的选股公式如何使用?
  9. 华为路由器OSPF配置
  10. 【Python脚本进阶】1.2、python脚本基础知识(下)