问题背景
用apache-poi生成word文件中表格,在使用python-docx库解析时报错:
问题分析
- word文档本质上是一个rar压缩包,用winrar解析后如下:
-
查看document.xml,可以看到table元素下面是没有<w:tblGrid>这个元素的
-
用python-docx生成一个带表格的word文件,同样解压,打开document.xml,可以找到<w:tblGrid>这个元素
- 问题就在这个<w:tblGrid>了,POI默认不会生成这个元素。
解决办法
-
我试过在POI生成的文档强行加上<w:tblGrid>元素,然后再压缩成rar,结果根本打不开,这说明word文档是一种特殊的rar,一旦解压,可能就会丢失一些关键数据,这个办法行不通。
-
然后查了一下POI的方法,发现POI本身可以通过CTTbl来设置高级属性。
-
这样问题就简单了,通过CTTbl给表格加上一个CTTblGrid,然后给每列加一个假的宽度就行了,像这样:
java
CTTbl ctTbl = table.getCTTbl();
CTTblGrid tblGrid = ctTbl.getTblGrid();
if (tblGrid == null) {
tblGrid = ctTbl.addNewTblGrid();
for (int i = 0; i < 5; i++) {
CTTblGridCol ctTblGridCol = tblGrid.addNewGridCol();
ctTblGridCol.setW(1000);
}
}
- 问题解决。