web-dev-qa-db-ja.com

XWPFTableCell(docx)でテーブルの列幅を設定します

Apache-poiを使用してdocxファイルを生成しています。ワードファイルに、固定したい列の幅を持つテーブルを追加します。

現在、私はここで説明されている手法を使用しています: http://Apache-poi.1045710.n5.nabble.com/Is-there-a-way-to-set-the-width-of-a-column -in-XWPFTableCell-td5711491.html

基本的に、これは設定を伴います

cell.getCTTc().addNewTcPr().addNewTcW().setW(BigInteger.valueOf(cols[j])); 

その列の各セルに。

問題は、ファイルがMS Wordで完全に開かれているのに、OpenOfficeが列幅に設定した値を異なる方法で解釈することです。 MS Wordは明らかにポイントの20分の1を単位として想定していますが、Open Officeは代わりにポイントを使用しているようです。したがって、生成されたドキュメントをOOで開くと、すべての列が20倍広くなります。

通常、生成された出力に何か奇妙なものが見られる場合は、docxファイルを解凍し、値がどうあるべきかを確認して、コードを変更します。しかし、Open Officeはdocxに保存できないようです。そのため、OO保存し直して、Wordがドキュメントを正しく解釈して、クロスアプリケーションソリューション。

OOとMSWordtの両方が同じように解釈するようにテーブル列の幅を設定する方法はありますか?

12
Yves V.

質問から抽出された回答:

最近、LibreOfficeがdocxに保存できることが指摘されました。生成されたファイルを変更して保存し直し、結果​​を逆コンパイルすることで、問題を解決することができました。

重要なのは、最初にテーブル自体に明示的な幅を設定することです。 Wordはその存在を気にしていないようで、OpenOffice/LibreOfficeはテーブルを正しくレンダリングできます。

したがって、テーブルの作成後、次のようにしました。

CTTblWidth width = table.getCTTbl().addNewTblPr().addNewTblW();
width.setType(STTblWidth.DXA);
width.setW(BigInteger.valueOf(9072));
10
Deduplicator

単一のセルには触れないでください。グリッドを追加します。

XWPFDocument doc = new XWPFDocument();
XWPFTable table = doc.createTable(1,2);
table.getCTTbl().addNewTblGrid().addNewGridCol().setW(BigInteger.valueOf(6000));
table.getCTTbl().getTblGrid().addNewGridCol().setW(BigInteger.valueOf(2000));
table.getRow(0).getCell(0).setText("1A");
table.getRow(0).getCell(1).setText("1B");
XWPFTableRow newrow = table.createRow();
newrow.getCell(0).setText("2A");
newrow.getCell(1).setText("2B");

グリッドは、列全体の幅を設定します。すべてのセルの幅を設定するためにサイクルを実行する必要はありません。 LibreOfficeとGoogleDocsで動作します。

MS Wordでも設定された幅を監視するには、最初の行のセルの幅を設定します。

 widthCellsAcrossRow(table, 0, 0, 4000);
 widthCellsAcrossRow(table, 0, 0, 5000);

private static void widthCellsAcrossRow (XWPFTable table, int rowNum, int colNum, int width) {
        XWPFTableCell cell = table.getRow(rowNum).getCell(colNum);
        if (cell.getCTTc().getTcPr() == null)
            cell.getCTTc().addNewTcPr();
        if (cell.getCTTc().getTcPr().getTcW()==null)
            cell.getCTTc().getTcPr().addNewTcW();
        cell.getCTTc().getTcPr().getTcW().setW(BigInteger.valueOf((long) width));
}
7
nEraquasAr

テーブルの作成時に、レイアウトはデフォルトで「自動」に設定されているため、セルの幅は常に文字列の長さに合わせて増加します。 OpenXMLマークアップによると、次のようになりますw:tblPr w:tblLayout w:type="auto"
解決策は、レイアウトをに設定することです 修繕 個々の列の長さを設定しますw:tblPr w:tblLayout w:type="fixed"

テーブルレイアウトを設定するためのpoiコードは次のとおりです。

XWPFTable table = document.createTable();
CTTblLayoutType type = table.getCTTbl().getTblPr().addNewTblLayout();
type.setType(STTblLayoutType.FIXED);

個々の幅を設定する方法は次のとおりです。

 int[] cols = {
    4896,
    1872,
    4032,
    1728,
    1440
};

for (int i = 0; i < table.getNumberOfRows(); i++) {
    XWPFTableRow row = table.getRow(i);
    int numCells = row.getTableCells().size();
    for (int j = 0; j < numCells; j++) {
        XWPFTableCell cell = row.getCell(j);
        CTTblWidth cellWidth = cell.getCTTc().addNewTcPr().addNewTcW();
        CTTcPr pr = cell.getCTTc().addNewTcPr();
        pr.addNewNoWrap();
        cellWidth.setW(BigInteger.valueOf(cols[j]));
    }
}

列の長さは、20分の1ポイント(dxa)または1/1440インチです。

2
sassyshin

他の回答に基づく...

  public static void setTableColumnsWidth(XWPFTable table, long... widths) {
    CTTblGrid grid = table.getCTTbl().addNewTblGrid();
    for (long w : widths) {
      grid.addNewGridCol().setW(BigInteger.valueOf(w));
    }    
  }

使用法:

setTableColumnsWidth(table, 1440, 2700, 3000, 1440);
0
mnesarco

これは主要で非常にトリッキーな要素です。テーブルセルの幅を設定するこの独自の一般的な方法を使用して解決しました。

private static void setTableColumnWidths(XWPFTable table) {
    table.getCTTbl().addNewTblGrid().addNewGridCol().setW(BigInteger.valueOf(2000));
    table.getCTTbl().getTblGrid().addNewGridCol().setW(BigInteger.valueOf(3200));
    table.getCTTbl().getTblGrid().addNewGridCol().setW(BigInteger.valueOf(1000));
    table.getCTTbl().getTblGrid().addNewGridCol().setW(BigInteger.valueOf(1000));
    table.getCTTbl().getTblGrid().addNewGridCol().setW(BigInteger.valueOf(1105));
    table.getCTTbl().getTblGrid().addNewGridCol().setW(BigInteger.valueOf(1105));
}
0
Rahul khanvani