【问题标题】:How to set blank space after a table in a docx document (working with apache poi)如何在 docx 文档中的表格后设置空格(使用 apache poi)
【发布时间】:2013-05-28 12:59:25
【问题描述】:

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

据我了解ooxml规范,我需要将这个元素链添加到表中tblPr(表属性)-> tblpPr(表位置属性),并将属性bottomFromText设置为特定数量的空间我想要在表格和下一个元素之间,还有 vertAnchor 属性(现在我正在使用“text”值配置它),最后是 tblpY 属性。

我正在做的一个 q&d sn-p 是这样的(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 writer 和 Microsoft Office 2007)简单的文档,其中只有一个表格和我想要的空间,并提取其中的文件(特别是 word/document.xml)以查看它。到目前为止,我为实现这一目标所做的所有努力都没有成功。

你知道这里有什么问题吗?我坚信我有误解......

提前谢谢你。

【问题讨论】:

    标签: apache-poi openxml docx


    【解决方案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);
    

    【讨论】:

    • 首先我要感谢您的回答。第一种方法或多或少是我正在做的,第二种方法很脏,我尽量不在我的代码中硬编码东西,这应该是可维护的xD
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多