如何使用apache poi在MS word中获取合并的单元格(垂直和/或水平)

时间:2015-08-09 19:09:10

标签: apache-poi

伙计,我陷入了困境。希望我能得到你的建议,我已经描述了我在Apache POI面临的问题。

我目前正在使用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>

0 个答案:

没有答案