C#NPOI设置WORD中表格TABLE的固定列宽
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 (人懒没办法)

 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号