1

1 つの行にセル スパンを持つテーブルを作成したいと思います。2 つのセルにまたがるスパンは正常に機能しますが、Span コマンドは Word in のように 2 つのセルを 1 つに連結しません。

Span コマンドは、最初のセルの右の境界線を 2 番目のセルの右の境界線に移動します。

その結果、Span のある行は、他の行と同様にもう 1 つのセルになります。

追加のセルは空ですが、表示されています。

不要なセルを削除できませんでした。このセルで次の setText コマンドを使用したテストは java.lang.IndexOutOfBoundsException になるため、不要なセルへの removeCell コマンドは機能しているように見えますが、Word ファイルでは不要なセルが既に表示されています。

この問題を解決するためのアイデアはありますか?

私のセットアップ: Win7-64 dom4j-1.6.1.jar ooxml-schemas-1.1.jar poi-3.12-20150511.jar poi-excelant-3.12-20150511.jar poi-ooxml-3.12-20150511.jar poi-ooxml-schemas -3.12-20150511.jar poi-scratchpad-3.12-20150511.jar xmlbeans-2.6.0.jar

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;

public class MainCreateTable {

    public static void setCellSpan(XWPFTableCell cell, int span) {
        if (cell.getCTTc().getTcPr() == null) {
            cell.getCTTc().addNewTcPr();
        }
        if (cell.getCTTc().getTcPr().getGridSpan() == null) {
            cell.getCTTc().getTcPr().addNewGridSpan();
        }
        cell.getCTTc().getTcPr().getGridSpan().setVal(BigInteger.valueOf((long) span));
    }

    /**
     *
     * expected Table
     * 
     * ---------------------------------------------|<br>
     * | row 1 cell 1 | row 1 cell 2 | row 1 cell 3 |<br>
     * ---------------------------------------------|<br>
     * | row 2 cell 1                | row 2 cell 2 |<br>
     * ---------------------------------------------|<br>
     * | row 3 cell 1 | row 3 cell 2 | row 3 cell 3 |<br>
     * ---------------------------------------------|<br>
     *
     * generated Table: with an additional empty Cell in Row 2
     * 
     * ---------------------------------------------|<br>
     * | row 1 cell 1 | row 1 cell 2 | row 1 cell 3 |<br>
     * ---------------------------------------------|-|<br>
     * | row 2 cell 1                | row 2 cell 2 | |<br>
     * ---------------------------------------------|-|<br>
     * | row 3 cell 1 | row 3 cell 2 | row 3 cell 3 |<br>
     * ---------------------------------------------|<br>
     *
     */
    public void makeTable() throws IOException {
        String docName = MainCreateTable.class.getSimpleName();
        XWPFDocument document = new XWPFDocument();

        XWPFTable table = document.createTable();
        XWPFTableRow tableRowOne = table.getRow(0);
        tableRowOne.getCell(0).setText("   row 1 cell 1   ");
        tableRowOne.addNewTableCell().setText("   row 1 cell 2   ");
        tableRowOne.addNewTableCell().setText("   row 1 cell 3   ");

        XWPFTableRow tableRowTwo = table.createRow();
        tableRowTwo.getCell(0).setText("   row 2 cell 1   ");
        tableRowTwo.getCell(1).setText("   row 2 cell 2   ");
        setCellSpan(tableRowTwo.getCell(0), 2);
        //tableRowTwo.removeCell(2);
        //tableRowTwo.getCell(2).setText("   row 2 cell 3   ");

        XWPFTableRow tableRowThree = table.createRow();
        tableRowThree.getCell(0).setText("   row 3 cell 1   ");
        tableRowThree.getCell(1).setText("   row 3 cell 2   ");
        tableRowThree.getCell(2).setText("   row 3 cell 3   ");

        FileOutputStream out = new FileOutputStream(new File(docName + ".docx"));
        document.write(out);
        out.close();
    }

    public static void main(String[] args) throws Exception {
        MainCreateTable mainCreateTable = new MainCreateTable();
        mainCreateTable.makeTable();
    }
}
4

1 に答える 1

2

どうやら XWPFTableRow はラッパー オブジェクトから参照を削除するだけで、XML ノードはドキュメント内に残します。それらを削除するには、次のように CTRow CTTc 配列から要素を削除する必要があります。

CTRow ctRow = row.getCtRow(); //row being a XWPFTableRow
CTTc[] ctTcs = new CTTc[2]; //the column count of the remaining elements 
//Fill the elements leaving out the third element
for(int i = 0; i < ctRow.sizeOfTcArray(); i++) { 
    if(i != 2) {
        ctTcs[i] = ctRow.getTcArray(i);
    }
}
ctRow.setTcArray(ctTcs);

XWPFTableRow.remove(int) を使用してラッパーを最新の状態に保つことは悪い考えではないと思いますが、この解決策は私にとってはうまくいきます。最後に要素を除外しているだけなので、単に ctTcs.length を使用できるため、このテストは必要ありません。

于 2015-08-05T07:56:01.577 に答える