在使用NPOI操作制作word數據模板時,需要在word中插入表格,包括合並單元格的方式
圖例:
1,沒有合並單元的方式創建表格,這種方式是提前創建好所需要的表格,然后再往里面填數
XWPFDocument doc= new XWPFDocument(); //創建表格-提前創建好表格后填數 XWPFTable tableContent = doc.CreateTable(4, 5);//4行5列 tableContent.Width = 1000 * 5; tableContent.SetColumnWidth(0, 1000);/* 設置列寬 */ tableContent.SetColumnWidth(1, 1500); tableContent.SetColumnWidth(2, 1500); tableContent.SetColumnWidth(3, 1000); tableContent.GetRow(0).GetCell(0).SetParagraph(SetCellText(doc, tableContent, "地點")); tableContent.GetRow(0).GetCell(1).SetParagraph(SetCellText(doc, tableContent, "日期")); tableContent.GetRow(0).GetCell(2).SetParagraph(SetCellText(doc, tableContent, "男性")); tableContent.GetRow(0).GetCell(3).SetParagraph(SetCellText(doc, tableContent, "女性")); tableContent.GetRow(0).GetCell(4).SetParagraph(SetCellText(doc, tableContent, "合計")); //測試數據格式 //string[,] siblings = new string[3, 5] { { "航天橋", "-", "0", "0", "0" }, { "馬甸", "-", //"0", "0", "0" }, { "洋橋", "04月16日 - 05月31日", "0", "0", "0" } }; //List<ArrayList> list=Common.PubVars.listTable; for (int i = 0; i < list.Count;i++)//有3個數組 { ArrayList ls=list[i]; for (int j = 0; j < ls.Count;j++) {
tableContent.GetRow(i + 1).GetCell(j).SetParagraph(SetCellText(doc, tableContent, ls[j].ToString())); } }
//設置字體樣式
public XWPFParagraph SetCellText(XWPFDocument doc, XWPFTable table, string setText) { //table中的文字格式設置 CT_P para = new CT_P(); XWPFParagraph pCell = new XWPFParagraph(para, table.Body); pCell.Alignment = ParagraphAlignment.CENTER;//字體居中 pCell.VerticalAlignment = TextAlignment.CENTER;//字體居中 XWPFRun r1c1 = pCell.CreateRun(); r1c1.SetText(setText); r1c1.FontSize = 12; r1c1.FontFamily = "華文楷體"; //r1c1.SetTextPosition(20);//設置高度 return pCell; }
2,合並單元格的方式,這種方式需要一行一行的創建並操作合並,填入數據,
//數據樣例 //string[,] siblings = new string[10, 7] { //{ "1", "test1", "0", "0", "0","0","0" }, //{ "2", "test2", "0", "0", "0","0", "0" }, //{ "3", "test3", "0", "0", "0","0", "0"}, //{ "4", "test4", "0", "0", "0","0", "0"}, //{ "5", "test5", "0", "0", "0","0", "0"}, //{ "6", "test6", "0", "0", "0","0", "0"}, //{ "7", "test7", "0", "0", "0","0", "0"}, //{ "8", "test8", "0", "0", "0","0", "0"}, //{ "9", "test9", "0", "0", "0","0", "0"}, //{ "10","test10", "0", "0", "0","0", "0"}, //}; List<ArrayList> listYcTable=new List<ArrayList>(); int rows = list.Count; int col = 0; foreach (ArrayList al in list) { col = al.Count;//列數 } //創建表格 XWPFTable table = doc.CreateTable(1, col);//思路,數據一行一行畫 table.RemoveRow(0);//去掉第一行空白的 table.Width = 1000 * 5; table.SetColumnWidth(0, 300);/* 設置列寬 */ table.SetColumnWidth(1, 1200); for (int i = 0; i < col - 3; i++) { table.SetColumnWidth(2 + i, 800);/* 設置列寬 */ } table.SetColumnWidth(col - 1, 700); CT_Row nr = new CT_Row(); XWPFTableRow mr = new XWPFTableRow(nr, table);//創建行 table.AddRow(mr);//將行添加到table中 XWPFTableCell c1 = mr.CreateCell();//創建單元格 CT_Tc ct = c1.GetCTTc(); CT_TcPr cp = ct.AddNewTcPr(); //第1行 cp.AddNewVMerge().val = ST_Merge.restart;//合並行 cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直 ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center; ct.GetPList()[0].AddNewR().AddNewT().Value = "序號"; c1 = mr.CreateCell();//創建單元格 ct = c1.GetCTTc(); cp = ct.AddNewTcPr(); cp.AddNewVMerge().val = ST_Merge.restart;//合並行 cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直 ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center; ct.GetPList()[0].AddNewR().AddNewT().Value = "指標名稱"; c1 = mr.CreateCell();//創建單元格 ct = c1.GetCTTc(); cp = ct.AddNewTcPr(); cp.gridSpan = new CT_DecimalNumber(); cp.gridSpan.val = Convert.ToString(col - 3); //合並列 cp.AddNewVAlign().val = ST_VerticalJc.center; ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center;//單元格內容居中顯示 ct.GetPList()[0].AddNewR().AddNewT().Value = "年齡段"; c1 = mr.CreateCell();//創建單元格 ct = c1.GetCTTc(); cp = ct.AddNewTcPr(); cp.AddNewVMerge().val = ST_Merge.restart;//合並行 cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直 ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.center; ct.GetPList()[0].AddNewR().AddNewT().Value = "合計"; //=====第一行表頭結束========= //2行,多行合並類似 nr = new CT_Row(); mr = new XWPFTableRow(nr, table); table.AddRow(mr); c1 = mr.CreateCell();//創建單元格 ct = c1.GetCTTc(); cp = ct.AddNewTcPr(); cp.AddNewVMerge().val = ST_Merge.@continue;//合並行 序號 c1 = mr.CreateCell();//創建單元格 ct = c1.GetCTTc(); cp = ct.AddNewTcPr(); cp.AddNewVMerge().val = ST_Merge.@continue;//合並行 指標名稱 //年齡段分組 //["20歲以下","21-30","31-40","41-50","51-60","70歲以上"] ArrayList alAge = Common.PubVars.ageGroup;//年齡段數組 for (int i = 0; i < alAge.Count; i++) { mr.CreateCell().SetText(Convert.ToString(alAge[i]));//年齡段單元格 } c1 = mr.CreateCell();//創建單元格 ct = c1.GetCTTc(); cp = ct.AddNewTcPr(); cp.AddNewVMerge().val = ST_Merge.@continue;//合並行 合計 //====第二行要合並的 for (int i = 0; i < list.Count; i++) { //創建一行 nr = new CT_Row(); mr = new XWPFTableRow(nr, table); table.AddRow(mr); for (int j = 0; j < list[i].Count; j++) { //每一行創建對應的數據 mr.CreateCell().SetText(list[i][j].ToString()); // table.GetRow(i + 1).GetCell(j).SetParagraph(SetCellText(doc, table, list[i][j].ToString())); } }
合並單元格有跨列合並,和跨行分部,兩個關鍵點:
跨列合並
cp.gridSpan = new CT_DecimalNumber();//實例化數字必須 cp.gridSpan.val = “3”; //合並列 合並3列
跨行合並
cp.AddNewVMerge().val = ST_Merge.restart;//合並行--開始行 cp.AddNewVMerge().val = ST_Merge.@continue;//合並行--到合並行
//合並的單元格--邊創建邊合並