赞
踩
poi-tl文档地址:
当前业务需求:需要在word中指定的位置,根据数据动态生成多个表格,数据格式:List<Table>。
poi-tl中提供了多种插件用于动态生成表格,但这些插件与遇到的业务需求不匹配。遂决定写一个动态生成多个表格的插件。
实现思路:基于单个渲染表格的插件中引用的方法,(com.deepoove.poi.policy.TableRenderPolicy.Helper#renderTable),在插入一个表格后,换行,在新的一行再插入一个表格,达到动态生成多个表格的效果。
tips:1)最后一个表格后不需要再添加换行
生成目录有两种方式可以参考:
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域代码文档地址:
在页眉中插入页码,使用域函数{PAGE}或者在页面添加。
tips:当被合成的word中有分节符时,模板文件中的页眉会被挪到word的最后一节,导致最后一节前面的word文档没有页眉。通过提前在模板文件中插入一个分节符,对于分节符后的文档设置页眉为【链接到前一条页眉】。再有同样的场景时,都会追加前一个页眉。
合成文件使用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文件中有一些通过域函数添加的数据或文件时,打开文件会提示文件损坏,需要修改。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。