关于word在表格拆分与组合那些事儿
2017-08-25 本文已影响260人
igool
在word的处理之中,文字,各种类型的图片,最复杂的公式,之前编写的API基本都覆盖了。不过,昨天在做一个文档测试时,发现表格没有能很好的处理。debug文档对应的xml发现,表格与其它这几种内容的组织方式不太一样。像图片,公式,不管么样,都还在基于p(word的基本段落标签)标签,图片与公式的内容都还是隶属于p的内容块里面。但是表格的组织方式是顺序的,独立于任何元素。我们可以通过一张图来看看:

并且它的上级节点就是document,tbl就是word中对应的表格,里面有对表格宽度,高度,行列的各种属性定义。
拆分:
具体在做内容拆分的时候,如果把某一块内容的拆在一起,这是很关键的。特别是里面包含了文字,图片,表格。问题来了,如何定位表格呢?请看下面的图:

很明显,表格里面如果要显示内容,必然是有p元素块。在通过过滤p元素块的过程中,我们可以定位到表格中的某一个cell 块,通过docx4j提供的得到父表签的方法,就能找出当前这个cell所在表格在哪一行,那一行属于哪个表格。过程就是tc=>tr=>tbl的关系(如果对docx4j的API熟悉,你就毫无压力)。有些同学可能会问,如果通过1定位到了表格,那2,3,4,5,6肯定都能定位了?这样不就同一个表格重复了吗?good question!解决这个问题也很easy,我们可以对添加过的tbl做一个缓存,如果下次再出现,证明已经处理过了。效果如图:


以上就是关于拆分的原理说明。下面,我们简单说一下组合。
组合:
单纯就表格来说,组合其实不复杂,通过body得到当前子WORD的所有元素,遍历之后添加到新的WORD就行了。
最后贴一张合成的WORD截图:





整个WORD是一个A3的版式,是带奇偶分页的。