我目前正在使用apache poi来阅读MS Word文档(.docx)格式的内容。这些文档包含复杂的表结构,包括合并单元格和嵌套表格。我必须识别表中的合并单元格,并在属于合并单元格布局的所有单元格中复制其值。我无法发布图片,因为这是我的第一篇文章。
下面编写的代码遍历表内容,以便获取每个单元格中的值。为简单起见,我只指定了需要注意的代码。
XWPFDocument docxFile = new XWPFDocument(new FileInputStream(docFile));
List <IBodyElement> bodyElementList = docxFile.getBodyElements();
for(int i=0;i<bodyElementList.size();i++){
IBodyElement bodyElement = bodyElementList.get(i);
if(bodyElement instanceof XWPFTable){
XWPFTable table = (XWPFTable)bodyElement;
List <XWPFTableRow> rowList = table.getRows();
for(XWPFTableRow Row : rowList){
List <XWPFTableCell> columnList = Row.getTableCells();
for(XWPFTableCell column: columnList) {
CTVMerge ctvMerge = column.getCTTc().getTcPr().getVMerge();
CTHMerge cthMerge = column.getCTTc().getTcPr().getHMerge();
CTDecimalNumber gridSpan = column.getCTTc().getTcPr().getGridSpan();
}
}
}
}
如果列是垂直合并单元格组的一部分,则 column.getCTTc()。getTcPr()。getVMerge()始终返回 org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVMerge ,通过调用 cvtMerge.getVal(),我可以用它来识别垂直合并单元格的开始和结束。
但是,我很难识别水平合并的单元格及其在表格中的范围。如果column是水平合并单元格的一部分,则 column.getCTTc()。getTcPr()。getHMerge()始终返回null。
因此,我使用了 column.getCTTc()。getTcPr()。getGridSpan(),它返回了 org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDecimalNumber <的实例。 / strong>即可。但是,这里的问题是,它返回水平合并单元格和网格的值(如果单元格水平和垂直合并)。在这两种情况下, gridSpan.getVal()仅返回colspan值。如何获得rowspan值?当且仅当我知道rowspan时,我才能识别网格的范围。
我使用正确的API吗?有没有更好的方法来获取Apache POI的所有这些信息?请帮我解决这个问题。
下面是解压缩word文档后我从document.xml获取的表XML的片段。下面的xml片段以table-end标签结束,但是,它没有出现在代码区域的下方,不知道为什么!!!。
<w:tbl>
<w:tblPr>
<w:tblStyle w:val="TableGrid"/>
<w:tblW w:w="0" w:type="auto"/>
<w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="3116"/>
<w:gridCol w:w="3117"/>
</w:tblGrid>
<w:tr w:rsidR="00004765" w:rsidTr="00834A42">
<w:tc>
<w:tcPr>
<w:tcW w:w="3116" w:type="dxa"/>
</w:tcPr>
<w:p w:rsidR="00004765" w:rsidRDefault="00004765"/>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="3117" w:type="dxa"/>
<w:vMerge w:val="restart"/>
</w:tcPr>
<w:p w:rsidR="00004765" w:rsidRDefault="00004765">
<w:r>
<w:t>Vertically merged cells</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<w:tr w:rsidR="00004765" w:rsidTr="00834A42">
<w:tc>
<w:tcPr>
<w:tcW w:w="3116" w:type="dxa"/>
</w:tcPr>
<w:p w:rsidR="00004765" w:rsidRDefault="00004765"/>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="3117" w:type="dxa"/>
<w:vMerge/>
</w:tcPr>
<w:p w:rsidR="00004765" w:rsidRDefault="00004765"/>
</w:tc>
</w:tr>
<w:tr w:rsidR="00004765" w:rsidTr="00973ED9">
<w:tc>
<w:tcPr>
<w:tcW w:w="6233" w:type="dxa"/>
<w:gridSpan w:val="2"/>
</w:tcPr>
<w:p w:rsidR="00004765" w:rsidRDefault="00004765">
<w:r>
<w:t>Horizontally merged c</w:t>
</w:r>
<w:bookmarkStart w:id="0" w:name="_GoBack"/>
<w:bookmarkEnd w:id="0"/>
<w:r>
<w:t>ells</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>