java对比HTML转docx格式使用POI,docx4j,JACOB方式

最近在做一个word文档在线编辑功能,其中就涉及到3个步骤

1、把word文档转成html,以供显示在页面上

2、在页面上使用可视化富文本插件ckeditor编辑html代码,页面好看又好用

3、把html再转成word文档

这其中就遇到了几个难点

1、转成的html代码不规范,2、HTML转成word时遇到图片位置有问题,表格格式有问题

第一个问题,我的解决方案就是做模板的时候,不要用word转html,后台直接存储使用html的格式去存储。

第二个问题,在HTML代码转成word的时候,我使用了以上3种方式,用了整整一周进行调试测试,最终结论如下:

一、POI

POI这个是我平常经常用的,我觉得我最信任的技术了,但是很难受,网上找到的代码都是html转成doc格式的,转成doc格式的也就算了,图片和表格真的很难控制。html转成docx也有代码,但是太复杂了,很难支持用户随意更改HTML后再组织成word文档。这块我调试的最久,最难用的了,如果word表格真的不复杂的话,还是可以用这个技术的,毕竟POI还是挺成熟的。

二、docx4j

docx4j是因为我在查询了上面POI走不通的时候,尝试使用了docx4j,功能是有,也能转成docx格式,还支持图片的base64的转码,并且docx4j里面集成了非常非常全面的格式化处理,感觉功能真的非常强大了,对了,中间因为docx4j使用的是标准的XHTML,所以中间还使用了jsoup去格式化HTML代码,使其标准。但是最终在生成成word文档的时候表格和图片的宽度总是比文档宽一部分,而我找了半天代码也没有找到解决方案,docx4j还是弃用了,如果各位有需要处理比较复杂的word文档,真的可以推荐一下docx4j试试能不能解决问题。

三、JACOB

JACOB本身就是java调用dll的桥梁库,我在网上找到了Jacob调用word原生的转化格式的代码,代码非常简洁,使用起来也特别简单,并且转化后的图片和表格都没有乱掉。计划之前接触了jsoup就使用jsoup格式化一下html代码,然后把图片文件仿造word转成html的文件夹方式处理成具体的文件和文件夹,然后调用word原生的html转成word的方式,效果最终出来的非常好。

jacab由于只是调用dll库,只能在window下使用。Linux可能需要使用其他的jar库,并且可以尝试使用openoffice去处理,既然别人有已经写好的软件和程序,我们没必要再重新走一次老路折磨自己。(Linux我这里没有这个环境,也具体就不清楚了,只是提供一种开发思路)

最后HTML转成word后,打开的时候会显示成网页格式,如果想打开使用的是word预览模式可以在HTML代码头部增加以下代码:

public String setHead(String html) {
		//添加一部分代码,用于打开的时候默认是word视图
		String head="<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>";
		head+="<html xmlns:v='urn:schemas-microsoft-com:vml' xmlns:o='urn:schemas-microsoft-com:office:office'";
		head+="xmlns:w='urn:schemas-microsoft-com:office:word' xmlns:m='http://schemas.microsoft.com/office/2004/12/omml'";
		head+="xmlns='http://www.w3.org/TR/REC-html40'><head>";
		head+="<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />";
		head+="<!--[if gte mso 9]><xml><w:WordDocument><w:View>Print</w:View><w:TrackMoves>false</w:TrackMoves><w:TrackFormatting/><w:ValidateAgainstSchemas/><w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid><w:IgnoreMixedContent>false</w:IgnoreMixedContent><w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText><w:DoNotPromoteQF/><w:LidThemeOther>EN-US</w:LidThemeOther><w:LidThemeAsian>ZH-CN</w:LidThemeAsian><w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript><w:Compatibility><w:BreakWrappedTables/><w:SnapToGridInCell/><w:WrapTextWithPunct/><w:UseAsianBreakRules/><w:DontGrowAutofit/><w:SplitPgBreakAndParaMark/><w:DontVertAlignCellWithSp/><w:DontBreakConstrainedForcedTables/><w:DontVertAlignInTxbx/><w:Word11KerningPairs/><w:CachedColBalance/><w:UseFELayout/></w:Compatibility><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><m:mathPr><m:mathFont m:val='Cambria Math'/><m:brkBin m:val='before'/><m:brkBinSub m:val='--'/><m:smallFrac m:val='off'/><m:dispDef/><m:lMargin m:val='0'/> <m:rMargin m:val='0'/><m:defJc m:val='centerGroup'/><m:wrapIndent m:val='1440'/><m:intLim m:val='subSup'/><m:naryLim m:val='undOvr'/></m:mathPr></w:WordDocument></xml><![endif]-->";
		head+=html;
		return head;
	}

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
POI是一种常用的技术,用于将HTML换为DOCX格式的文档。然而,使用POIHTMLDOCX格式时,可能会遇到一些困难,特别是在处理图片和表格方面。有些代码只能将HTML换为DOC格式,而不是DOCX格式。此外,对于用户想要在换后的文档中自由更改HTML并重新组织的情况,POI可能不太适合。因此,POI在处理复杂的HTMLDOCX的情况下可能不是最佳选择。[1] 如果POI无法满足您的需求,您可以尝试使用docx4jdocx4j是另一个功能强大的库,它支持将HTML换为DOCX格式,并且还支持图片的base64码。docx4j还集成了全面的格式化处理功能,可以处理复杂的文档格式。但是,有时在使用docx4j生成的文档中,表格和图片的宽度可能会比文档宽度多出一部分,这可能需要进一步的调试和解决方案。[2] 另外,您还可以考虑使用JACOB库。JACOB是一个用于在Java中调用DLL的桥梁库。通过使用JACOB,您可以调用Word原生的格式功能,将HTML换为DOCX格式JACOB的代码简洁易用,并且换后的图片和表格不会出现错乱的情况。您可以使用jsoup对HTML代码进行格式化处理,然后将图片文件处理成与WordHTML方式相似的文件和文件夹结构,最后调用Word原生的HTML换功能来生成最终的文档。[3] 综上所述,对于HTML换为DOCX格式的需求,您可以尝试使用POIdocx4jJACOB库,根据您的具体需求选择最适合的解决方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值