使用java将html导出word(带图片,带富文本编辑器CKEditor)

人生是段过程_新浪博客

最近遇到html页面导出word的问题,网上查了很多资料,大抵都是选用的第三方控件来做的,比如poi什么的。自己也试了下,感觉对图片的支持总有问题,然而自己的html还带有富文本编辑器(CKEditor)。所以索性放弃了第三方控件,自己写了一个帮助类,支持在指定位置插入图片,支持CKEditor,经测试可用,本文为博主原创,转载请说明出处。

简单说下思路,一般使用第三方控件转word,都是先写一个html的模版,或者用字符串拼出一个html来进行转换,但是我这里没用第三方的控件,故是反其道而行。先用word写一个样式模版来,需要插入数据的地方用特定的占位符表示如${name},然后将word的模版另存为单个网页(.mht)格式,查出数据后,替换掉其中的占位符,至于图片则取到后转成base64字符串替换进去,最后利用io流写成.doc文件。

事实上,细心的人可能已经领会到了,这并非是真正的word,只是一个后缀为.doc的伪word罢了,其真正的编码格式事实是.mht文件的3Dus-ascii编码。但是其最后的成果和word相差不大,也就是说可以达到预期的效果,不多说了,还是来说步骤,及代码。

一、制作一个mht格式模版

首先,需要新建一个word文档,在里面编好你想要的样式,需要加入数据的地方用占位符表示,如${name},需要加入图片的地方随便插一张图片就行了,富文本编辑器的地方也用占位符表示,如${content}然后另存为单个网页(.mht)格式,这个时候别心急,再用word将.mht文件打开,你会发现刚刚调好的样式变了,主要是整个文档变宽了,再进行一遍微调,

注意这次调好的样式将会是最终显示的样子!
    

然后用编辑器打开这个.mht文件,博主这里用的EditPlus,你会看到这样的东西:

使用java将html导出word(带图片,带富文本编辑器CKEditor)

这个就是.mht文件的编码了,在这里面我们需要改几个地方,一个是图片,还有一个是富文本编辑器。

先说图片,将这个文件往下拖你会发现,刚刚显示的图片其实编码的时候是将资源解析成了base64字符串,

这里要简单说明一下mht文件在编码的时候大概的规律,在整个文档的最末尾有一个xml,里面规定了各种资源的引用位置,在这个xml上面就是各种资源的base64编码,而实际显示的body部分只是做了一个引用而已

。图片相对简单,只需要将base64部分替换成占位符就行了,而富文本编辑器的时候则是3个地方都要修改。

为了找到我们添加图片的对应资源,首先你需要在body部分找到添加图片的引用代码,虽然代码看起来和java或者html的代码有差别,但是我们可以根据相对其他占位符的位置,还是很容易找到的。一般是在标签中会有一个标签,例如我这里:

使用java将html导出word(带图片,带富文本编辑器CKEditor)

拿到图片的名称,一般会是image00*,例如我这里是image002,然后find,刚刚已经说了编码规律,所以这个名称只会出现在,xml,base64字符串和当前位置,这三个地方,所以很容易就会找到图片的base64字符串,将其整个改成占位符,例如${image}(下图),这时如果你用word打开,你会发现插进去的图片已经无法显示了,因为我们已经将它的资源改成了占位符,java操作的时候只需要替换占位符,最终word就会显示你想要的图片。

使用java将html导出word(带图片,带富文本编辑器CKEditor)

好了,图片已经改好,下面是富文本编辑器,由于我们一开始就是在对应位置添加的占位符,所以引用位置的占位符我们就不用改了,但是,我们需要在文档最末的xml里面添加占位符,以及base64的位置添加占位符(毕竟编码不熟悉,保险起见建议将base64的占位符添加在刚刚image占位符的下方空两行的位置)。这三个位置因为要替换不同的内容,所以占位符也不一样,如图:

使用java将html导出word(带图片,带富文本编辑器CKEditor)

使用java将html导出word(带图片,带富文本编辑器CKEditor)

至此,mht文件的模版已经制作好了,我们将其放到项目中(我一般会新建一个export文件夹存放)。

二、编写HtmlToWord工具类

首先分析一下该工具类需要哪些方法,因为.mht的编码格式特殊,在处理中文的时候,我们需要一个转码的方法,除此之外,我们还需要一个读取.mht文件的方法,一个图片转base64字符串的方法,处理富文本编辑器的方法,以及一个转存为.doc文件的方法,我们一个个的来看。

首先是转码,

因为.mht采用3Dus-ascii编码,该编码格式为10进制的ascii码(比较特殊,非16进制的)如果不进行处理的话,最终导出的doc文件会有中文乱码

。代码如下:

使用java将html导出word(带图片,带富文本编辑器CKEditor)

读取mht文件的方法:

使用java将html导出word(带图片,带富文本编辑器CKEditor)

将图片转存为base64字符串的方法:

使用java将html导出word(带图片,带富文本编辑器CKEditor)

处理富文本编辑器的方法,这个方法最为麻烦,简单说明一下,我们一般存储富文本编辑器内容的时候会将其存为html的字符串,而图片是以路径的形式存在里面的,因此这里要将图片的路径读取出来,然后提取文件转换为base64字符串,而原本的html字符串,也需要将

使用java将html导出word(带图片,带富文本编辑器CKEditor)

标签截取出来然后替换为mht引用的编码。然后将替换后的html码放到${content}标签中,base64字符串也放到对应占位符中,同时在xml占位符也要替换为文件引用的格式,

特别注意的是,base64字符串和xml中替换的内容,文件名必须对应!!而且base64字符串会有一个引用头,里面的部分代码必须另起一行顶头写!!否则会失败!!

博主在这个方法上花的时间最久,最后终于将格式拼好了,代码如下:

使用java将html导出word(带图片,带富文本编辑器CKEditor)

使用java将html导出word(带图片,带富文本编辑器CKEditor)

使用java将html导出word(带图片,带富文本编辑器CKEditor)

使用java将html导出word(带图片,带富文本编辑器CKEditor)

最后就是转存为doc的方法了:

使用java将html导出word(带图片,带富文本编辑器CKEditor)

三、调用过程

最后简单说下调用的过程吧:

1.读取mht文件获得mht字符串(需传入文件路径);

2.从数据库中取出富文本编辑器的字符串,调用富文本编辑器的处理方法,需传参(富文本编辑器字符串,mht模版字符串),返回处理之后的mht字符串;

3.从数据库中取出对应图片,调用图片转base64字符串的方法,然后将得到的base64字符串去replacemht字符串中图片的占位符,如(${image});

4.从数据库中取出其他的数据,替换mht字符串中对应的占位符;

5.将mht字符串调用转码方法,返回转码后的字符串;

6.调用转doc的方法,需传入参数(mht字符串,目标路径,目标文件名)

博主一周的心血,欢迎技术交流,转载请说明出处!

本文由 黑白世界4648 第一时间收藏到GET,原文来自 → blog.sina.com.cn

「GetParty」

关注微信号,推送好文章

微信中长按图片即可关注

更多精选文章

评论
微博一键登入