废话不多说,进入正题!

本文重点在于:对富文本图片的导出(基础的freemarker+word模板导出这里不做详细解说哈)

参考文章:Java 实现HTML富文本导出至word完美解决方案 - 廖飞 - 博客园

(ps:大神的东西太深奥~~懵逼了

一周才搞定,为了方便后来在更加简单,清晰的学习,楼主写下这篇博客,感谢大神给了我个完善和进步的机会,也希望后来在继续完善)

先说一下思路:由于我们是要用word来解析带图片的富文本(说白了就是解析一段html,当然这段html代码是包含img标签:图片),so...传统的word模板导出(word另存为xml,在修改后缀为ftl)是行不通的,因为他解析不了html代码(至少我目前没有找到这方便的解决方案,大神勿喷~),这样的话我就要换用一种模板来处理这个模板:word模板另存为mht格式,再修改后缀为ftl。剩下的就是后台操作了,找到你存富文本的字段(html代码)获取里面的img标签,找到图片,并把图片解析为base64字符串,填充到我们只做的模板上就ok了,大体思路就这样了

一、模板制作(这个很重要)

提示:这里模板用office word来做,不要用wps

  创建word文件:

,我这里用第二个content来显示我们要的富文本,然后将我们的word文件另存为mht文件,

最后我们就拿到我们要的mht模板了,这仅仅是个开始...各位看官往下看

打开我们的mht文件并处理:在我们的文件里面找到下面这些东西,如果没有找到呢?....这个问题,我就只有呵呵了

${imagesBase64String} 和 ${imagesXmlHrefString}这两个是我们手动加进去的,简析富文本图片的核心就在这里(反正我也是蒙的~)

全文检索gb2312把他改成utf-8,同时需要加上3D前缀,对应着格式来改 一般就这两种:

<meta http-equiv=3DContent-Type content=3D"text/html; charset=3Dutf-8">和Content-Type: text/html; charset=3D"utf-8"

提示:所有的都要改成utf-8(你不改也是可以的)

然后保存一下,再把文件的后缀名改成ftl格式的就ok了(模板处理到此结束)

二、解析html

  

这个大家不陌生吧?陌生的自己打脸去,下面的那三个我依然懵逼

handler.handledHtml(false);

String bodyBlock = handler.getHandledDocBodyBlock();

data.put("content", bodyBlock);   处理后的html代码块

data.put("imagesXmlHrefString", xmlimaHref);

data.put("imagesBase64String", handledBase64Block);  这两个大家还有印象吧?没错就是我们之前手动在mht模板里加的那两货!

三、填充模板

String docFilePath = "d:\\temp.doc";
System.out.println(docFilePath);
File f = new File(docFilePath);
OutputStream out;
try {out = new FileOutputStream(f);WordGeneratorWithFreemarker.createDoc(data, "temp.ftl", out);} catch (FileNotFoundException e) {} catch (MalformedTemplateNameException e) {e.printStackTrace();
} catch (ParseException e) {e.printStackTrace();
} catch (IOException e) {e.printStackTrace();
}        

 

四、导出word(带富文本图的哟)

public static void createDoc(Map<String, Object> dataMap,String templateName, OutputStream out)throws Exception {Template t = configuration.getTemplate(templateName);t.setEncoding("utf-8");WordHtmlGeneratorHelper.handleAllObject(dataMap);try {Writer w = new OutputStreamWriter(out,Charset.forName("utf-8"));t.process(dataMap, w);w.close();} catch (Exception ex) {ex.printStackTrace();throw new RuntimeException(ex);}}

五、测试(main)

public static void main(String[] args) throws Exception {HashMap<String, Object> data = new HashMap<String, Object>();StringBuilder sb = new StringBuilder();sb.append("<div>");sb.append("<img style='height:100px;width:200px;display:block;' src='F:\\aaa.png' />");sb.append("<img style='height:100px;width:200px;display:block;' src='F:\\bbb.png' />");sb.append("</br><span>中国梦,幸福梦!</span>");sb.append("</div>");RichHtmlHandler handler = new RichHtmlHandler(sb.toString());handler.setDocSrcLocationPrex("file:///C:/8595226D");handler.setDocSrcParent("file3405.files");handler.setNextPartId("01D214BC.6A592540");handler.setShapeidPrex("_x56fe__x7247__x0020");handler.setSpidPrex("_x0000_i");handler.setTypeid("#_x0000_t75");handler.handledHtml(false);String bodyBlock = handler.getHandledDocBodyBlock();System.out.println("bodyBlock:\n"+bodyBlock);String handledBase64Block = "";if (handler.getDocBase64BlockResults() != null&& handler.getDocBase64BlockResults().size() > 0) {for (String item : handler.getDocBase64BlockResults()) {handledBase64Block += item + "\n";}}data.put("imagesBase64String", handledBase64Block);String xmlimaHref = "";if (handler.getXmlImgRefs() != null&& handler.getXmlImgRefs().size() > 0) {for (String item : handler.getXmlImgRefs()) {xmlimaHref += item + "\n";}}data.put("imagesXmlHrefString", xmlimaHref);data.put("name", "张三");data.put("content", bodyBlock);String docFilePath = "d:\\temp.doc";System.out.println(docFilePath);File f = new File(docFilePath);OutputStream out;try {out = new FileOutputStream(f);WordGeneratorWithFreemarker.createDoc(data, "temp.ftl", out);} catch (FileNotFoundException e) {} catch (MalformedTemplateNameException e) {e.printStackTrace();} catch (ParseException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

查看结果:

到此~导出word带富文本图片的功能就借宿了,详细代码我放在附件里面(这里着重讲mht模板的一些改动,处理富文本的java代码我就没有单独贴出来了哈,demo里面有哦)

有完整的demo,大家放心不会像我一样懵逼一周了 哈哈

开玩笑的~!话说我从开始到完整的做出来 还是花了5天左右的时间,

再次感谢参考的文章:Java 实现HTML富文本导出至word完美解决方案 - 廖飞 - 博客园

最后在再给大家扩展一下:一个word 出现多个富文本,并且每个富文本有多个图片的思路:

String old_handledBase64Block = "";if(data.containsKey("imagesBase64String")){old_handledBase64Block = (String) data.get("imagesBase64String");handledBase64Block = old_handledBase64Block + handledBase64Block;}data.put("imagesBase64String", handledBase64Block);

简单说一下 ,其实就是在处理下一个富文本的时候 要拿到上一个富文本里面处理中的"imagesBase64String" 再把它累加起来,

不然后面的会给前面的覆盖掉~"imagesXmlHrefString"这个也是一样的

各位看官!搞懂这个是不是觉得单纯的图片导出太简单了哇 哈哈(话说我还没用过单纯的图片导出)

demo源码: https://pan.baidu.com/s/1U5-_9NaR80Q3bstL5i1atw

提取码: 838a

或者

链接:https://pan.baidu.com/s/1U_uFZpcrGlCsRxPjbHyeDg 
提取码:etuo

java通过freemarker导出包含富文本图片的word文档相关推荐

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

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

  2. 富文本转换字符串 php,php 如何将一个富文本字符串生成word文档?

    问题描述 我现在有一个富文本字符串, 比如$str=" qqq啊啊啊啊啊百度网址 ": 中间我省去了大量的图片base64的编码. 问题出现的环境背景及自己尝试过哪些方法 相关代码 ...

  3. java利用freemarker导出含有list的数据到word,有demo可供下载

    java利用freemarker导出含有list的数据到word,有demo可供下载 前言 FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子 ...

  4. Java 批量导出包含图片的Word文档

    业务需求:客户需要在资产管理系统中批量导出包含资产二维码等信息的Word文档,如下图 导出Word文档效果如下图 需求就摆在面前,接下来就是技术选型问题了.由于一开始做编程是从OC入门的,但是由于OC ...

  5. java xml转换word_java如何将xml类型的word文档转换为word类型的文档

    大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc.经测试这样方式 ...

  6. office服务器草稿位置,精确定位图片在Word文档中的位置的操作方法

    除了嵌入型图片外,图片在Word文档中的位置可以通过鼠标拖动来调整.如果需要对图片位置进行精确定位,可以使用相关的命令来进行操作,下面介绍精确定位图片在Word文档中的位置的具体操作方法. 1.在文档 ...

  7. Word电子扫描仪 word文档转换为图片Pdf,Word文档扫描成Pdf,word文档加密 word转图片 word转pdf

    Word文档转换为图片Pdf,Word文档扫描成Pdf Word转换为图片Pdf 1.        Word转换为Pdf,程序很多,但转换后的Pdf,还可以复制,虽可以加密禁止复制,但市场上太多的P ...

  8. 黏贴图片到word文档图片显示不全,只显示一行(保姆级图文)

    步骤 系列文章 前言 异常情况 解决方法 总结 系列文章 提示:转到日常小技巧专栏,观看更多内容! 点我直达–>日常小技巧专栏 前言 黏贴图片到word文档图片显示不全(保姆级图文) 发现图片占 ...

  9. java毕业论文_【毕业论文】基于java的博客网站设计与开发毕业论文(word文档)

    <[毕业论文]基于java的博客网站设计与开发毕业论文.doc>由会员分享,可免费在线阅读全文,更多与<[毕业论文]基于java的博客网站设计与开发毕业论文(word文档)>相 ...

  10. PNG图片转换word文档,不用下载软件,免费完成

    PNG格式也是我们工作中常见的图片格式,工作中难免会整理一些PNG图片资料,大家都是怎么做的呢?小编给大家分享一个方法,就是把PNG图片转换word文档,这样就方便我们去整理了,并且无需下载软件就可以 ...

最新文章

  1. Dubbo使用Zooker注册服务
  2. offset系列,client系列,scroll系列回顾
  3. mysql 查询时间转换_数据库查询时日期的转换
  4. 《学习R》笔记:科学计算器、检查变量和工作区、向量、矩阵和数组、列表和数据框...
  5. VMware-vRealize-Log-Insight-8.2.0.0安装部署指南
  6. 在Visual Studio Code运行单个js文件需要用到插件
  7. 使用批处理文件来操作注册表
  8. c语言野王验证,王者荣耀:“野王是如何炼成的?”,方法很简单,6个字而已...
  9. java定义数字类型的代码_数字类型内置方法(示例代码)
  10. Data Binding 指南
  11. Linux常用命令大全——赶紧收藏
  12. 移除文件资源管理器侧边栏中的Creative Cloud Files
  13. 你有被银行套路过吗?| 一文教你计算真实的年化利率
  14. 使用数字全通滤波器对IIR滤波器进行相位补偿
  15. android 游戏 柄,Android手柄游戏中心-葡萄游戏厅
  16. MFC隐藏任务栏图标
  17. 关于学习的过程:痛并快乐着是一种收获
  18. 从.weights中提取权重数据
  19. 【List】个人 常用学习工作软件清单
  20. Linux locale命令

热门文章

  1. 通过网易财经爬取股票数据
  2. 如何下载央视网视频,下载视频播放花屏怎么办
  3. MongoDB实战(MongoDB开发者现身说法)
  4. 最新kali之bulk_extractor
  5. win10安装navisworks失败,怎么强力卸载删除注册表并重新安装
  6. 53.String的intern()方法、new String()到底创建了几个对象、intern()面试难题
  7. Express的使用
  8. bluetooth Specification
  9. Open-DrainPush-Pull
  10. as_completed和wait源码分析