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 (人懶沒辦法)