在 XWPFTableCell (docx) 中设置表的列宽

我正在使用apache-poi生成一个docx文件。在wordfile中,我添加了表格,其列的宽度是我希望看到固定的。

目前,我使用这里描述的技术: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显然假设20th的点作为单位,但open office似乎使用点代替,因此当我在OO中打开生成的文档时,所有列都宽20倍。

通常,当我在生成的输出中看到一些奇怪的东西时,我会解压缩docx文件,看看值应该是多少,然后更改我的代码。但是open Office似乎无法保存到docx,所以我无法更改OO中的值将其保存回去,看看Word是否仍然正确解释文档以找到跨应用程序解决方案。

任何想法,我如何设置表列的宽度,以便OO和MS Wordt都解释它相同?


答案 1

从问题中提取的答案:

最近有人向我指出,LibreOffice能够保存到docx。通过更改生成的文件并将其保存回去并重新编译结果,我已经能够解决问题。

关键是首先为表本身设置一个显式宽度。Word似乎并不关心它的存在,OpenOffice/LibreOffice能够正确呈现表格。

因此,在创建表后,我执行以下操作:

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

答案 2

不要触摸单个细胞。添加网格:

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));
}

推荐