源码地址:

背景

最近用java开发一个中车项目管理系统,里面有一个维修单word导出功能。

可用方案

在网上查找资料,总结出两种比较可行的方案。

(1) 制作word模板,导出成mht文件(单页面网页格式),然后往模板里渲染数据,最终生成word文档。

(2) 制作word模板,导出成xml文件,然后往模板里渲染数据,最终生成word文档。

两种都是采用模板的思想,比用poi去组织word格式简单的很多很多。不同点在于导出文件的格式不同,一个是mht文件,一个是xml文件。考虑到本项目中的维修单个别字段采用了富文本编辑器实现,保存进数据库中是html格式的字符串,所以采用第一种方案,即通过mht文件来实现。

实现思路

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

实现步骤及注意事项

创建mht模板

根据模板引擎的语法规则填入占位符制作word模板,保存为mht文件。eg:

然后打开mht文件,在mht文件中插入图片资源的base64及xml 的href引用的占位。如下图:

${imagesBase64String} 和 ${imagesXmlHrefString}这两个是我们手动加进去的,这也是解析富文本的关键所在。

由于mht文件是采用的是“us-ascii”编码,属性后面都必须带有3D前缀。所以包含html内容的需进行一下替换操作。

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

Content-Type: text/html; charset=3D"utf-8"

处理数据

一般的属性数据组织起来简单,无非就是从数据库中获取,处理也简单。现在模拟一个富文本的数据

//用map存放数据

HashMap data = new HashMap();

//创建富文本

StringBuilder sb = new StringBuilder();

sb.append("

");

sb.append("");

sb.append("wesley 演示 导出富文本!@@#######¥¥%%%%………………&&&**~~~~~~&&&&&&&&、、、、、、、、");

sb.append("----多图分割线---");

sb.append("");

sb.append("中国梦,幸福梦!");

sb.append("

");

RichObject richObject = new RichObject();

richObject.setHtml(sb.toString());

//--------------------此处可以spring配置文件配置,也可以直接读取属性文件获取------------------

//从mht文件中找

richObject.setDocSrcLocationPrex("file:///C:/268D4AA4"); //这里是从mht中获取的资源文件所在的文件夹

richObject.setDocSrcParent("word.files"); //资源文件夹名字

richObject.setNextPartId("01D2C8DD.BC13AF60"); //下一部分的ID

//以下三个属性字段我也不是很懂 查询网上是这么用的 不过根据字段应该大致能猜到是做什么用的。

richObject.setShapeidPrex("_x56fe__x7247__x0020");

richObject.setTypeid("#_x0000_t75");

richObject.setSpidPrex("_x0000_i");

richObject.setWebAppliction(false);

//这里封装了一个Hnadler处理对象,来处理数据。

RichHtmlHandler richHtmlHandler = WordGeneratorWithFreemarker.createRichHtmlHandler(richObject);

List richHtmlHandlerList = new ArrayList();

richHtmlHandlerList.add(richHtmlHandler);

//这里就是我们刚才加的两个字段,也是我们富文本文件处理的关键两个字段

data.put("imagesXmlHrefString", WordGeneratorWithFreemarker.getXmlImgHref(richHtmlHandlerList));//

logger.debug("------imagesXmlHrefString-------"+WordGeneratorWithFreemarker.getXmlImgHref(richHtmlHandlerList));

data.put("imagesBase64String", WordGeneratorWithFreemarker.getImagesBase64String(richHtmlHandlerList));

logger.debug("------imagesBase64String-------"+WordGeneratorWithFreemarker.getImagesBase64String(richHtmlHandlerList));

data.put("name", "wesley");

data.put("datetime","2017-05-10");

data.put("title","演示demo");

data.put("context1", richHtmlHandler.getHandledDocBodyBlock());

data.put("context2", richHtmlHandler.getHandledDocBodyBlock());

data.put("context3", richHtmlHandler.getHandledDocBodyBlock());

data.put("context4", richHtmlHandler.getHandledDocBodyBlock());

data.put("context5", richHtmlHandler.getHandledDocBodyBlock());

data.put("context6", richHtmlHandler.getHandledDocBodyBlock());

渲染模板

String docFilePath = "w:\\temp_by_wesley.doc";//目标文件

String templatePath = Class.class.getResource("/ftl").getPath();

templatePath = java.net.URLDecoder.decode(templatePath,"utf-8");//这里我的路径有空格添加此处理

logger.debug("------templatePath-------"+templatePath);

WordGeneratorWithFreemarker.createDoc(templatePath,"word.ftl",data,docFilePath);

/**

* 创建doc文件

* [@param](https://my.oschina.net/u/2303379) templatePath 模板所在路径 xxx/xxx/template

* [@param](https://my.oschina.net/u/2303379) templateName 模板名字 xxx.ftl

* [@param](https://my.oschina.net/u/2303379) dataMap 数据集合

* [@param](https://my.oschina.net/u/2303379) outPath 输出文件路径 xxx/xxx/xxx.doc

*/

public static void createDoc(String templatePath, String templateName, Map dataMap, String outPath) throws Exception{

logger.debug("WordGeneratorWithFreemarker createDoc()");

Freemarker.fprint(templatePath,templateName,dataMap,outPath);

}

/**

* 基于文件的输出

*

* @param templatePath 模板所在路径 xxx/xxx/template

* @param templateName 模板名字 xxx.ftl

* @param dataMap 数据集合

* @param outPath 输出文件路径 xxx/xxx/xxx.doc

*/

public static void fprint(String templatePath, String templateName, Map root, String outPath) {

logger.debug("Freemarker fprint file");

try {

getInstance(templatePath);

Template template = getTemplate(templateName);

Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(outPath)), "UTF-8"));

template.process(root, out);

out.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

throw new RuntimeException(e);

} catch (TemplateException e) {

e.printStackTrace();

throw new RuntimeException(e);

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException(e);

}

}

效果展示

到此富文本导出就完成了。

java 富文本 word_Java导出富文本到word相关推荐

  1. html中文本信息导出表格中,大量word填写的表格资料,如何批量提取数据到Excel表里?...

    大量word填写的表格资料,要批量提取数据到Excel表里,一页对应一行,首先看一下这个word本身是什么来源的,大致可以分以下2种情况来处理. 一.网上直接生成的带html标记的word文件 如一些 ...

  2. java freemarker 导出富文本到Word文档

    最近一直在加班 导致看到代码就想吐 今天抽出时间来记录一下 用freemaker导出富文本信息 之前使用freemaker导出图片等信息时 使用的是xml方式,不明白的 可以看 freemaker生成 ...

  3. 【操作word】Java + POI导出富文本的内容到word文档

    这周工作中,遇到一个需求是需要将数据库中富文本内容导出到word文档里面,于是就采用POI技术实现了一下导出word文档的功能.(word文档是识别html内容的,所以富文本内容也自然能够识别.) 一 ...

  4. java实现word导入导出富文本(含图片)-附完整测试用例

    主要有以下几点: 1.解决富文本导入导出依赖兼容问题 2.处理富文本和非富文本内容 3.解决webp格式通过java下载不了问题,如果要用到富文本导出,将来势必是会碰到的bug,这里提前给提出来并解决 ...

  5. 富文本编辑器导出html静态页面和pdf格式文件

    在这里记录的都是在项目开发中遇到的问题,都是自己查找网上资料,经过测试总结出来的,就是希望有同样需求的人可以少走弯路. 本人当前使用的是若依框架自带的富文本编辑器,附上相关图片,具体的代码可以查看若依 ...

  6. 导出富文本格式word

    /*try {*//*** 关键地方* 生成word格式*//*POIFSFileSystem poifs = new POIFSFileSystem();DirectoryEntry directo ...

  7. springboot导出富文本框数据到word

    这里需要注意的是:依赖的版本号都是一一对应的,如果使用不兼容的版本号,可能会报编译异常和缺少类的错误,这里已提供对应的所需依赖和版本号,大家可以参考一下. 具体的api文档可以参考官网api,很好理解 ...

  8. 从html富文本中提取纯文本

    其实从html富文本中提取纯文本很简单,富文本基本上是使用html标签给文本加上丰富多彩的样式. 所以只需要将富文本字符串中的"<.....>"标签剔除,即可得到纯文本 ...

  9. PMEdit一个富文本框可以编辑文本、并可以显示GIF动画

    PMEdit一个富文本框可以编辑文本.并可以显示GIF动画 发布时间:2013-04-14 发布来源: 护士必必要有同情心和一双愿意工作的手. 一.在开端之前起首吐槽一下,本人是一个自力开辟者,在中国 ...

最新文章

  1. 亿级京东应用架构设计与治理
  2. sql join on 多表连接_SQL 多表查询-交叉连接(笛卡尔积)
  3. 解决html5 audio iphone,ipd,safari不能自动播放问题
  4. 新写的c++日志库:log4K
  5. UEditor使用报错Cannot set property 'innerHTML' of undefined
  6. android webviwe 头布局,Android布局问题,带有WebView下方的按钮
  7. 为什么要返回softmax_为什么softmax搭配cross entropy是解决分类问题的通用方案?
  8. 浅谈RSTP的快速收敛机制 P/A机制
  9. 2017.7.31.生活记录
  10. 电池SOH仿真系列-基于LSTM神经网络的电池SOH估算方法
  11. LBP特征原理及代码实现
  12. bzoj 1036: [ZJOI2008]树的统计Count(树链剖分 点权)
  13. 【阅读笔记】量子信息
  14. 在搜索框里添加放大镜的图标,且显示提示信息
  15. hdu 1907 & hdu 2509(Nim博弈)
  16. 计算机网络之什么是 DoS、DDoS、DRDoS 攻击
  17. Hessian矩阵\海塞矩阵\海森矩阵
  18. 数字信号处理(3)- z变换
  19. 自适应波束形成(二)——时域窄带LCMV波束形成器
  20. MSP430 UART(一)

热门文章

  1. 使用机器学习数据集构建销售预测Web应用程序
  2. 【总结】浏览器 User-Agent 大全
  3. 【配电网重构】基于粒子群算法实现最小化功率损耗的配电网重构附matlab代码
  4. mtk使用android开关机动画,android MTK修改开关机动画
  5. C# 加减乘除计算器
  6. JS正则验证输入框姓名只能输入中文和英文
  7. 电子爱好者必备,强烈推荐这些常用工具
  8. 一篇文章带你全面了解“电脑”内外组成
  9. 如何在wince下添加和删除驱动(作者:wogoyixikexie@gliet)
  10. Springboot整合liqubase