Java实现HTML富⽂本导出⾄word完美解决⽅案
⼀、问题的提出
最近⽤java开发⼀个科技项⽬信息管理系统,⾥⾯有⼀个根据项⽬申请书的模板填写项⽬申报信息的功能,有⼀个科技项⽬申请书word 导出功能。
已有的实现⽅式:采⽤标准的jsp模板输出实现,简单地说,就是把数据渲染进jsp页⾯,然后将此页⾯另存为doc⽂档,从⽽达到word 导出效果。但是存在以下⼏个问题:
(1) 由于导出的html⽹页格式,打开word后,默认显⽰的视图模式为WEB版式视图;
(2) 修改word⽂档后,会新增⼀个相关联的⽂件夹,word的html中会引⽤这个⽂件夹中的资源,⽐如样式、图⽚、主题等;这样如果只转移word⽂档本⾝,会造成不到相关联的资源。
(3) 由于我们有些字段内容是采⽤富⽂本编辑器(百度的UEditor)填写的,⾥⾯有附件的上传(主要是图⽚)。针对图⽚,HTML的img标签有⼀个src的属性,这个src是服务器的图⽚资源路径。这个如果要显⽰这个图⽚的话,客户的机器必须要保证联⽹,这样造成word不能离线存档。
(4) 这样导出的word打印出来的效果也是⼀塌糊涂,没法接受。
正因为有这些问题,急需寻另外⼀种解决⽅案。
⼆、可⽤⽅案
在⽹上查资料,总结出两种⽐较可⾏的⽅案。
(1) 制作word模板,导出成mht⽂件(单页⾯⽹页格式),然后往模板⾥渲染数据,最终⽣成word⽂档。
(2) 制作word模板,导出成xml⽂件,然后往模板⾥渲染数据,最终⽣成word⽂档。
这两种都是采⽤模板的思想,模板的制作⽐较加单,⽐⽤poi去组织word格式简单的很多很多。唯⼀的不同点在于导出⽂件的格式不同,⼀个是mht⽂件,⼀个是xml⽂件。考虑到本项⽬中的项⽬申报书个别字段采⽤了富⽂本编辑器实现,保存进数据库中是html格式的字符串,所以我们采⽤第⼀种⽅案,即通过mht⽂件来实现。
三、思路整理与分析
1. mht⽂件的⽂件存储结构分析
打开客户提供的项⽬申报书模板⽂件,如,选择“另存为-》其他格式”菜单,选择“保存为mht⽂件(单⽹页⽂件)”,如下图所⽰:
保存后,⽤⽂本编辑器(UltraEdit或Sublime等)打开。打开后,有⼀些规律可循,具体关键的要点如下:
(1) mht⽂件的内容采⽤3Dus-ascii编码格式,⾥⾯的中⽂字符串都被编码成不可读的内容;
(2) mht是单⽹页⽂件,⾥⾯内嵌了很多资源内容,特别要注意的是图⽚资源。我们查“image”,会
到“image001””image002”。。。。等相关的匹配值。针对每个图⽚(⽐如image002)有三个地⽅出现。
第⼀,在Html的<v:shape>标签中,如下
第⼆,在内嵌资源块中,对图⽚的内容采⽤base64编码。具体格式如下
第三,在⽂件的末尾部,有个<xml>标签,⾥⾯有个HRef属性标识,具体内容如下:
2. 具体的实现思路
(1) 制作word模板,⽤特定的模板引擎(我们⽤的freeMarker)的语法去⽣成占位符,然后导出出mht⽂件;
(2) 组织、处理数据,然后利⽤模板引擎去渲染模板。
(3) 将渲染后的结果保存为doc⽂件。
最重要的是第2个步骤中的处理数据。根据mht⽂件的格式要求,主要需要处理以下⼏个地⽅。
(1) 将字符串类型的数据编码成3Dus-ascii格式;
(2) 对富⽂本数据进⾏处理。主要是上述三个地⽅的处理,其⼀,对富⽂本的html中的img进⾏处理,转换成<v:shape>标签格式;其⼆,取出img的实际存储位置,将图⽚的内容按照base64进⾏编码,并将编码后内容添加进对应的位置;其三,在mht⽂件的末尾的xml标签中加⼊相关资源引⼊字符串。
java修改html文件四、实现步骤及注意事项
1. 根据模板引擎的语法规则填⼊占位符制作word模板,保存为mht⽂件。
另存为mht⽂件后,需⽤⽂本编辑器打开,主要绑定语句不能断,⽐如${amecn}另存为mht⽂件后,可能成了${projectSbInfo.=
xmnamecn}这个格式,需⼿动再修改⼀下。
另外还需在mht⽂件中插⼊图⽚资源的base64及xml 的href引⽤的占位。如下图
2. 组织、处理数据
⼀般的属性数据组织起来简单,⽆⾮就是从数据库中获取,处理也简单。这⾥要特别注意以下数据的处理。
(1) html中image元素的处理。处理流程如下:
(2) 由于mht⽂件是采⽤的是“us-ascii”编码,属性后⾯都必须带有3D前缀。所以包含html内容的需进⾏⼀下替换操作。
3.渲染模板,然后另存了word格式即可。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。