NPOI关于 WORD 中 TABLE 的列宽设置
table is XWPFTable
设置表格的tblLayout
table.GetCTTbl().AddNewTblPr().tblLayout = new CT_TblLayoutType() { type = ST_TblLayoutType.@fixed };
tblLayout 这个属性 默认值是 autofit 这里需要设置为 fixed 将自动改为固定宽
如果说你使用的NPOI 版本过低没有 GetCTTbl 这个方法的话 那么可以使用反射将 ctTbl 拿出
var tableType = table.GetType();
FieldInfo fieldInfo = tableType.GetField("ctTbl", BindingFlags.NonPublic | BindingFlags.Instance);
设置每列的宽度!
如果你的Tabel是在生成时就指定了列和行 那么可以直接使用方法
var row = table.Rows[0];
var cells = row.GetTableCells();
for (int i = 0; i < cells.Count; i++) {
table.SetColumnWidth(i,980);
}
SetColumnWidth 设置每列的宽度 i 指的是对应的列 从0开始 980?指的是宽度 这里的单位是 twip 在 1920*1080 分辨率下 8522twip 宽度刚好一页
如果说你的Table并不是在生成时指定的大小 而是使用 AddNewCol 这个方法进行对列大小的调整 那么 SetColumnWidth 对这种ADD生成的并没有支持
SetColumnWidth 源代码 NPOI.XWPF.UserModel.XWPFTable
public void SetColumnWidth(int columnIndex, ulong width)
{
if (this.ctTbl.tblGrid == null)
return;
if (columnIndex > this.ctTbl.tblGrid.gridCol.Count)
{
throw new ArgumentOutOfRangeException(string.Format("Column index {0} doesn't exist.", columnIndex));
}
this.ctTbl.tblGrid.gridCol[columnIndex].w = width;
}
这里并不难看出 宽度其实和列的设置无关 而是来自于 grid 这元素 Word XML代码 可以通过这里的w:w来调整宽度
<w:tblGrid>
<w:gridCol w:w="980" />
<w:gridCol w:w="980" />
<w:gridCol w:w="980" />
</w:tblGrid>
所以在使用 AddNewCol 时还需要对grid进行添加 AddNewGridCol 添加完对应的grid之后再使用 SetColumnWidth
table.GetCTTbl().tblGrid.AddNewGridCol();
//当然你也可以在 AddNewGridCol 就对宽度进行设置 但是使用这种方式时 会出现空指针异常 需要增加对 tblGrid == null 的判断
table.GetCTTbl().tblGrid.gridCol.Add(new CT_TblGridCol (){ w=980 });
这里由于其他关系并没有相关 DEMO (人懒没办法)