如何在docx文档中的表之后设置空格(使用apache poi)

时间:2013-05-28 12:59:26

标签: apache-poi openxml docx

我一直在尝试创建表格并让它们在底部边框和表格之后的任何内容之间留下一些空间(通常是文本)。

据我浏览ooxml规范,我明白我需要在表中添加这个元素链tblPr(表属性) - > tblpPr(表位置属性),并将属性bottomFromText设置为我想要的表和下一个元素之间的特定量空间,也就是vertAnchor属性(现在我用“text”值配置它),最后是tblpY属性。

我正在做的q& d片段就是这个(java和apache poi):

XWPFTable table = document.createTable();
CTTblPr _cttblpr = table.getCTTbl().addNewTblPr();

_cttblpr.addNewTblpPr().setBottomFromText(BigInteger.valueOf(284));
_cttblpr.getTblpPr().setVertAnchor(STVAnchor.TEXT);
_cttblpr.getTblpPr().setTblpY(BigInteger.valueOf(1));

我的主要参考资料是this。此外,我一直在创建(使用LibreOffice编写器和Microsoft Office 2007)简单文档,只需要一个表和我想要的空间,并提取其中的文件(具体是word / document.xml)来查看它。到目前为止,我所有努力实现这一目标都是不成功的。

你知道这里有什么问题吗?我坚信我错过了概念......

提前谢谢。

1 个答案:

答案 0 :(得分:1)

你是对的,你需要 w:bottomFromText ,例如:

            <w:tbl>
                <w:tblPr>
                    <w:tblpPr w:leftFromText="187" w:rightFromText="187" w:bottomFromText="4320" w:vertAnchor="text" w:tblpY="1"/>
                    <w:tblOverlap w:val="never"/>
                </w:tblPr>

基于以上所述,您的代码看似合理。

为了进行比较,如果您使用 docx4j 进行比较,则可以通过以下两种方式之一创建。

第一种方法是显式使用JAXB对象工厂:

org.docx4j.wml.ObjectFactory wmlObjectFactory = new org.docx4j.wml.ObjectFactory();

Tbl tbl = wmlObjectFactory.createTbl(); 
JAXBElement<org.docx4j.wml.Tbl> tblWrapped = wmlObjectFactory.createBodyTbl(tbl); 
    // Create object for tblPr
    TblPr tblpr = wmlObjectFactory.createTblPr(); 
    tbl.setTblPr(tblpr); 
        // Create object for tblpPr
        CTTblPPr tblppr = wmlObjectFactory.createCTTblPPr(); 
        tblpr.setTblpPr(tblppr); 
            tblppr.setLeftFromText( BigInteger.valueOf( 187) ); 
            tblppr.setRightFromText( BigInteger.valueOf( 187) ); 
            tblppr.setBottomFromText( BigInteger.valueOf( 4320) ); 
            tblppr.setVertAnchor(org.docx4j.wml.STVAnchor.TEXT);
            tblppr.setTblpY( BigInteger.valueOf( 1) ); 
        // Create object for tblOverlap
        CTTblOverlap tbloverlap = wmlObjectFactory.createCTTblOverlap(); 
        tblpr.setTblOverlap(tbloverlap); 
            tbloverlap.setVal(org.docx4j.wml.STTblOverlap.NEVER);

第二种是解组字符串:

    String openXML = "<w:tbl xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">
                      + "<w:tblPr>
                            + "<w:tblpPr w:bottomFromText=\"4320\" w:leftFromText=\"187\" w:rightFromText=\"187\" w:tblpY=\"1\" w:vertAnchor=\"text\"/>"
                                + "<w:tblOverlap w:val=\"never\"/>"
                          +"</w:tblPr>"
etc    
                +"</w:tbl>";
    Tbl tbl = (Tbl)XmlUtils.unmarshalString(openXML);