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 (人懒没办法)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM