java 导出word

  • 目前来看,java导出word大致有6种解决方案:

  1:Jacob是Java-COM Bridge的缩写,使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用。DLL动态链接库的生成需要windows平台的支持。该方案只能在windows平台实现,是其局限性。

  2:Apache POI包括一系列的API,他的excel处理很强大,对于word还局限于读取,目前只能实现一些简单文件的操作,不能设置样式。有兴趣学习的同学,http://www.w3ii.com/zh-CN/apache_poi_word/default.html这个文档官方可以看看

  3:Java2word是一个在java程序中调用 MS Office Word 文档的组件类库)。该组件提供了一组简单的接口,以便java程序调用他的服务操作Word 文档。

  4:iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。功能强大。

  5:JSP输出样式,该方案实现简单,但是处理样式有点缺陷,简单的导出可以使用。

  6:用XML做就很简单了。Word从2003开始支持XML格式,大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。

综上所述:我先使用poi做了一套导出word,但是由于页眉页脚输出打不开word,结合网上意见,决定试试freemaker导出word

可以看看这个博客,很详细https://blog.csdn.net/qq_24084925/article/details/58586615


        首先说说word和xml的关系,每个word它都对应着一个xml文件,也就是说你修改了xml,对应的word文件也就跟着修改了。通过word的保存功能可以将一个word文件保存为xml文件,该文件虽然是.xml格式的,但是直接双击打开的话还是使用word打开,所以你只能用txt将它打开,用txt打开之后将里面的一句话:<?mso-application progid="Word.Document"?>去掉,然后保存,接着就可以双击直接打开了,这样使用的就是IE打开的,就可以查看里面的节点具体的构造。

最上面的主节点是<w:wordDocument>(如果不是,你将word文件保存成xml的时候使用的是07word,选择的是:word xml文档(*.xml),你可选择word 2003 xml文档(*.xml)试试);该主节点下面有大致8个节点,其中我们要操作的就是<w:body>节点,该节点是word的正文节点,其他的节点没有去研究;<w:body>下面包含的节点可能会有:<w:p>段落节点、<w:tbl>表格节点。

1.首先编辑xml,https://segmentfault.com/a/1190000011709732 ,可以去看


保存成 abc.xml;

然后用代码编辑器打开,由于打开格式比较乱,可以先格式化之后再修改:


修改步骤如下:1.将${a.item1},被打乱的部分删掉,如下图,否则无法显示数据


2.list遍历循环输出的话要在每一行前后加上<#list 你的数据list as 转换的变量名></#list>

(3)图片的话,在模板里面先加入图片占位,打开xml文档,图片所在的位置会有一大串base64编码,将图片形成的一大串base64编码改成图片的数据变量,如${image}
clipboard.png到这里文件里面加入的<#list 你的数据list as 转换的变量名></#list>属于非法写法,还有图片的base64编码没了,所以到这里的xml文档就无法用word打开查看最终样式了。导出word的模板就形成好了

土亢

  • 图片使用base64编码,放在“yyy”的位置:“<w:binData w:name="wordml://xxx.png">yyy</w:binData>”
  • 当文档存在图片时,尤其是多张图片需要动态读取时,“wordml://${xxx}.png”中的xxx需要相应动态变化,不然图片会重复哦。
  • 单元格合并时,可在ftl里写相应判断,同上行内容使用“<w:vmerge />”或者“<w:vmerge w:val="continue"/>”来表示合并,否则,使用“<w:vmerge w:val="restart"/>”来另起新行。这里注意的是“vmerge”都是小写,学习过程中在网上看到是“vMerge”,合并不起作用,排查了半天错。

    <#assign tempName=""/>
    ...
    <#if tempName!=Table.name>
      <w:vmerge w:val="restart"/>
      <#assign tempName=Table.name/>
    <#else>
      <w:vmerge />
    </#if>







  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值