Yve*_* V. 12 java ms-word openoffice-writer apache-poi xwpf
我正在用apache-poi生成一个docx文件.在wordfile中,我添加了表,其列的宽度我希望看到固定.
目前,我使用此处描述的技术:http://apache-poi.1045710.n5.nabble.com/Is-there-a-way-set-set-the-width-of-a-column-in-XWPFTableCell -td5711491.html
基本上,这需要设置
cell.getCTTc().addNewTcPr().addNewTcW().setW(BigInteger.valueOf(cols[j]));
Run Code Online (Sandbox Code Playgroud)
在该列的每个单元格上.
问题是,当文件在MS Word中完美打开时,open office会以不同的方式将我设置的值解释为列宽.虽然MS Word显然假设20个点为单位,但开放办公室似乎使用点代替,因此当我在OO中打开生成的文档时,所有列都宽20倍.
通常当我在生成的输出中看到一些奇怪的东西时,我解压缩docx文件,查看值应该是什么并更改我的代码.但是开放式办公室似乎无法保存到docx,因此我无法更改OO中的值将其保存回来并查看Word是否仍然正确解释文档以便找到跨应用程序解决方案.
知道如何设置表格列的宽度,以便OO和MS Wordt同样解释它吗?
Ded*_*tor 10
最近有人向我指出LibreOffice可以保存到docx.通过更改生成的文件并将其保存并反编译结果,我已经能够解决问题.
关键是首先为表本身添加一个显式宽度.Word似乎并不关心它的存在,OpenOffice/LibreOffice能够正确地呈现表.
所以,在创建表之后,我做了如下:
CTTblWidth width = table.getCTTbl().addNewTblPr().addNewTblW();
width.setType(STTblWidth.DXA);
width.setW(BigInteger.valueOf(9072));
Run Code Online (Sandbox Code Playgroud)
不要碰单电池.添加GRID:
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");
Run Code Online (Sandbox Code Playgroud)
网格设置整列的宽度.您不需要执行任何循环来为每个单元格设置宽度.它适用于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));
}
Run Code Online (Sandbox Code Playgroud)
小智 6
创建表格后,布局默认设置为“自动”,因此单元格的宽度将始终增加以跟随字符串的长度。根据 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);
Run Code Online (Sandbox Code Playgroud)
设置单独宽度的方法如下:
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]));
}
}
Run Code Online (Sandbox Code Playgroud)
柱长以二十分之一点 (dxa) 或 1/1440 英寸为单位。
| 归档时间: |
|
| 查看次数: |
15219 次 |
| 最近记录: |