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

1、 问题的提出

     最近用java开发一个科技项目信息管理系统,里面有一个根据项目申请书的模板填写项目申报信息的功能,有一个科技项目申请书word导出功能。html

      已有的实现方式:采用标准的jsp模板输出实现,简单地说,就是把数据渲染进jsp页面,而后将此页面另存为doc文档,从而达到word导出效果。可是存在如下几个问题:java

(1) 因为导出的html网页格式,打开word后,默认显示的视图模式为WEB版式视图;数据库

(2) 修改word文档后,会新增一个相关联的文件夹,word的html中会引用这个文件夹中的资源,好比样式、图片、主题等;这样若是只转移word文档自己,会形成找不到相关联的资源。服务器

(3) 因为咱们有些字段内容是采用富文本编辑器(百度的UEditor)填写的,里面有附件的上传(主要是图片)。针对图片,HTML的img标签有一个src的属性,这个src是服务器的图片资源路径。这个若是要显示这个图片的话,客户的机器必需要保证联网,这样形成word不能离线存档。jsp

(4) 这样导出的word打印出来的效果也是一塌糊涂,无法接受。编辑器

正由于有这些问题,急需寻找另一种解决方案。编码

2、 可用方案

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

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

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

这两种都是采用模板的思想,模板的制做比较加单,比用poi去组织word格式简单的不少不少。惟一的不一样点在于导出文件的格式不一样,一个是mht文件,一个是xml文件。考虑到本项目中的项目申报书个别字段采用了富文本编辑器实现,保存进数据库中是html格式的字符串,因此咱们采用第一种方案,即经过mht文件来实现。

 

3、 思路整理与分析

1. mht文件的文件存储结构分析

打开客户提供的项目申报书模板文件,如clip_image002,选择“另存为-》其余格式”菜单,选择“保存为mht文件(单网页文件)”,以下图所示:

clip_image004

保存后,用文本编辑器(UltraEdit或Sublime等)打开。打开后,有一些规律可循,具体关键的要点以下:

(1) mht文件的内容采用3Dus-ascii编码格式,里面的中文字符串都被编码成不可读的内容;

(2) mht是单网页文件,里面内嵌了不少资源内容,特别要注意的是图片资源。咱们查找“image”,会找到“image001””image002”。。。。等相关的匹配值。针对每一个图片(好比image002)有三个地方出现。

第一,在Html的<v:shape>标签中,以下

clip_image006

第二,在内嵌资源块中,对图片的内容采用base64编码。具体格式以下

clip_image008

第三,在文件的末尾部,有个<xml>标签,里面有个HRef属性标识,具体内容以下:

clip_image010

2. 具体的实现思路

(1) 制做word模板,用特定的模板引擎(咱们用的freeMarker)的语法去生成占位符,而后导出出mht文件;

(2) 组织、处理数据,而后利用模板引擎去渲染模板。

(3) 将渲染后的结果保存为doc文件。

最重要的是第2个步骤中的处理数据。根据mht文件的格式要求,主要须要处理如下几个地方。

(1) 将字符串类型的数据编码成3Dus-ascii格式;

(2) 对富文本数据进行处理。主要是上述三个地方的处理,其一,对富文本的html中的img进行处理,转换成<v:shape>标签格式;其二,取出img的实际存储位置,将图片的内容按照base64进行编码,并将编码后内容添加进对应的位置;其三,在mht文件的末尾的xml标签中加入相关资源引入字符串。

4、 实现步骤及注意事项

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

clip_image002[5]

另存为mht文件后,需用文本编辑器打开,主要绑定语句不能断,好比${projectSbInfo.xmnamecn}另存为mht文件后,可能成了${projectSbInfo.=

xmnamecn}这个格式,需手动再修改一下。

另外还需在mht文件中插入图片资源的base64及xml 的href引用的占位。以下图

clip_image004[5]

clip_image006[5]

2. 组织、处理数据

通常的属性数据组织起来简单,无非就是从数据库中获取,处理也简单。这里要特别注意如下数据的处理。

(1) html中image元素的处理。处理流程以下:

clip_image008

(2) 因为mht文件是采用的是“us-ascii”编码,属性后面都必须带有3D前缀。因此包含html内容的需进行一下替换操做。

clip_image010[5]

3.渲染模板,而后另存了word格式便可。

clip_image012

 

 

 

相关源代码:http://files.cnblogs.com/files/liaofeifight/word.rar

相关文章
相关标签/搜索