java中生成poi-tl合并word文件总结

poi-tl文档地址:

Poi-tl Documentation

1,渲染动态表格

当前业务需求:需要在word中指定的位置,根据数据动态生成多个表格,数据格式:List<Table>。

poi-tl中提供了多种插件用于动态生成表格,但这些插件与遇到的业务需求不匹配。遂决定写一个动态生成多个表格的插件。

实现思路:基于单个渲染表格的插件中引用的方法,(com.deepoove.poi.policy.TableRenderPolicy.Helper#renderTable),在插入一个表格后,换行,在新的一行再插入一个表格,达到动态生成多个表格的效果。

tips:1)最后一个表格后不需要再添加换行

2,生成目录

生成目录有两种方式可以参考:

1)poi-tl中提供的插件TOCRenderPolicy(com.deepoove.poi.plugin.toc.TOCRenderPolicy)

2)原生poi提供的方法org.apache.poi.xwpf.usermodel.XWPFDocument#createTOC

因为业务需要需要合成其他的word,所以当其他word中也有标题时,在最终的文件中更新域时,生成的目录中会将其他word的标题也囊括进去,以及其他word中也有目录时,更新后也会将模板文件中的标题囊括进去。

自定义目录插件,基于TOC域代码,使用\t参数,可以对指定样式的文本生成目录。也可以在word页面可视化操作生成目录,在word中通过Alt+F9切换域代码显示形式。基于TOCRenderPolicy插件,替换插件中的域代码。

tips:

1)生成目录时,可以指定样式文字目录对应的等级,比如 {TOC \h \z \t "demoStyle1,1,demoStyle2,2" },这个域代码中指定了两个样式生成目录,demoStyle1按照1级目录,demoStyle2按照2级目录。在目录中,1级目文字基于TOC 1的样式,2级目录文字基于TOC 2。

2)想要让目录中的文字对齐时,可以指定TOC 1,TOC 2 样式中的制表位。

3)在合成word的场景中,多个word中都包含TOC 1样式,合成文件后以最后一个文件的TOC 1为准,所以在模板文件中预设的TOC 1样式会被覆盖掉。需要将其他word中的TOC 1样式名字修改掉。poi解析word后,TOC 1 样式的名称为toc 1,与在word中看见的名称不一致。且被合成的word中的一级目录对应的样式会随着我们预设的样式改变。有一个取巧的方法,可以在模板文件中生成目录时,指定目录等级为9,只要其他word中的标题没到9级({TOC \h \z \t "demoStyle1,9,demoStyle2,9" }),就不会收到影响。无论哪种方式,请根据实际场景酌情修改样式名称。

Microsoft域代码文档地址:

域代码:目录 (目录) 字段 - Microsoft 支持

3,插入页码

在页眉中插入页码,使用域函数{PAGE}或者在页面添加。

tips:当被合成的word中有分节符时,模板文件中的页眉会被挪到word的最后一节,导致最后一节前面的word文档没有页眉。通过提前在模板文件中插入一个分节符,对于分节符后的文档设置页眉为【链接到前一条页眉】。再有同样的场景时,都会追加前一个页眉。

4,合成文件

合成文件使用poi-tl中的合成函数com.deepoove.poi.xwpf.NiceXWPFDocument#merge(com.deepoove.poi.xwpf.NiceXWPFDocument)

tips:

1)合并文件后,同名样式会有冲突。比如基于样式名生成样式时,样式名冲突时不能正确生成目录,需要修改模板中的样式名称以及域函数中指定的样式名称,或者修改被合成的word中的样式名称。

2)与上文中TOC 1样式冲突类似,正文以及页眉等通用样式也会冲突,可以将被合成的word中样式名修改为其他,这样合成后word的样式就统一了,也可以在word模板中指定使用到的文字的样式,不使用默认样式。

3)​​​​​​​使用poi生成word文件时,zip相关的报错-CSDN博客

未解决问题:

1)合并word文件后,纸张大小、页边距等没控制,使用了图形时,图形的边框等样式丢失。

2)使用了TOC域函数后,打开文件会提示域更新,在本地word上生成目录。当需要在线预览的场景,没有提前生成目录,目录处预览到的是空白。

3)word文件中有一些通过域函数添加的数据或文件时,打开文件会提示文件损坏,需要修改。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值