12

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 ではファイルが完全に開くのに対し、open office では、列幅に設定した値が異なる方法で解釈されることです。MS Word は明らかに 20 分の 1 の単位を想定していますが、オープン オフィスでは代わりにポイントを使用しているように見えるため、生成されたドキュメントを OO で開くと、すべての列が 20 倍広くなります。

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

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

4

5 に答える 5

11

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

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

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

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

CTTblWidth width = table.getCTTbl().addNewTblPr().addNewTblW();
width.setType(STTblWidth.DXA);
width.setW(BigInteger.valueOf(9072));
于 2015-03-02T23:15:08.407 に答える
10

単一細胞に触れないでください。グリッドを追加します。

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));
}
于 2016-03-03T06:34:29.087 に答える
0

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

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));
}
于 2017-06-20T10:02:31.883 に答える