0

私はテーブルを作成し、その下の境界線とテーブルの後に来るもの (通常はテキスト) の間にスペースを残すようにしようとしています。

ooxml の仕様を調べた限りでは、要素 tblPr (テーブル プロパティ) -> tblpPr (テーブル位置プロパティ) のこのチェーンをテーブルに追加し、属性 bottomFromText を、間に必要な特定の量のスペースに設定する必要があることを理解しています。テーブルと次の要素、vertAnchor 属性 (現在は「テキスト」値で構成しています)、そして最後に 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));

私の主な参考資料はこれです。また、(LibreOffice Writer と Microsoft Office 2007 を使用して) テーブルと必要なスペースだけの単純なドキュメントを作成し、その中のファイル (具体的には word/document.xml) を抽出して、これを適切に表示しています。これを達成するための私のすべての努力は、今のところ成功していません。

ここで何が間違っているか知っていますか?私は間違った考えを持っていると強く信じています...

前もって感謝します。

4

1 に答える 1

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でそれを行っていた場合、2 つの方法のいずれかでそれを作成します。

最初の方法は、JAXB オブジェクト ファクトリを明示的に使用することです。

org.docx4j.wml.ObjectFactory wmlObjectFactory = 新しい 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);

2 つ目は、文字列を非整列化することです。

    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);
于 2013-05-28T21:03:43.710 に答える