开发语言:C#
源码大小:108KB
源码大小:108KB
下载源码后,重新生成一下就会自动下载依赖文件,这里用的是NPOI 2.7.4
效果图
核心源码
public void AddTableToWord(string outputPath) { //word模板位置 string templatePaht = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Report", "report.docx"); // 读取现有文档 XWPFDocument doc; using (FileStream fs = new FileStream(templatePaht, FileMode.Open, FileAccess.Read)) { doc = new XWPFDocument(fs); } //XWPFDocument doc = new XWPFDocument(); { // 添加空行 //doc.CreateParagraph(); // 创建表格 XWPFTable table = doc.CreateTable(5, 7); InsertEmptyParagraphAtPosition(doc, 5); MoveTableToPosition(doc, table, 6); // 1. 将表格布局设置为固定 if (table.GetCTTbl().tblPr == null) { table.GetCTTbl().AddNewTblPr(); } table.GetCTTbl().tblPr.tblLayout = new CT_TblLayoutType() { type = ST_TblLayoutType.@fixed }; // 设置表格宽度(简单方式) table.Width = 4500; table.SetColumnWidth(0, 200); //table.SetColumnWidth(1, 800); // 设置行高 - 遍历每一行 foreach (XWPFTableRow row in table.Rows) { // 设置行高为500缇(twips),高度规则为精确高度 row.Height = 400; //row.Height = HeightRule.EXACTLY; // 或者使用 HeightRule.ATLEAST foreach (var cell in row.GetTableCells()) { SetCellCenterAlignment(cell, ParagraphAlignment.CENTER); } } //设置表格水平居中对齐 SetTableHorizontalCenter(table); // 填充内容(不设置复杂样式) FillSimpleTable(table); // 保存 using (FileStream outFs = new FileStream(outputPath, FileMode.Create)) { doc.Write(outFs); } } } private void FillSimpleTable(XWPFTable table) { // 第一行:标题 table.GetRow(0).MergeCells(0, 6); table.GetRow(0).GetCell(0).SetText("这是被插入的表格"); //SetCellCenterAlignment(table.GetRow(0).GetCell(0), ParagraphAlignment.CENTER); // 第二行 var row1 = table.GetRow(1); row1.GetCell(0).SetText("相别"); row1.MergeCells(1, 2); row1.GetCell(1).SetText("A相"); //SetCellCenterAlignment(row1.GetCell(1), ParagraphAlignment.CENTER); row1.MergeCells(2, 3); row1.GetCell(2).SetText("B相"); row1.MergeCells(3, 4); row1.GetCell(3).SetText("C相"); // 第三行 var row2 = table.GetRow(2); row2.GetCell(0).SetText("负载"); row2.GetCell(1).SetText("最大(%)"); row2.GetCell(2).SetText("最小(%)"); row2.GetCell(3).SetText("最大(%)"); row2.GetCell(4).SetText("最小(%)"); row2.GetCell(5).SetText("最大(%)"); row2.GetCell(6).SetText("最小(%)"); // 第四行:电压 table.GetRow(3).GetCell(0).SetText("电压"); //SetCellCenterAlignment(table.GetRow(3).GetCell(0), ParagraphAlignment.CENTER); // 第五行:电流 table.GetRow(4).GetCell(0).SetText("电流"); } /// <summary> /// 设置表格水平居中对齐 /// </summary> /// <param name="table"></param> public void SetTableHorizontalCenter(XWPFTable table) { try { // 使用反射获取表格的底层 CTTbl 对象 Type tableType = table.GetType(); FieldInfo ctTblField = tableType.GetField("ctTbl", BindingFlags.NonPublic | BindingFlags.Instance); if (ctTblField != null) { // 获取 CTTbl 对象 object ctTbl = ctTblField.GetValue(table); if (ctTbl != null) { // 获取或创建 tblPr PropertyInfo tblPrProperty = ctTbl.GetType().GetProperty("tblPr"); if (tblPrProperty != null) { object tblPr = tblPrProperty.GetValue(ctTbl); if (tblPr == null) { tblPr = Activator.CreateInstance(tblPrProperty.PropertyType); tblPrProperty.SetValue(ctTbl, tblPr, null); } // 获取或创建 jc PropertyInfo jcProperty = tblPr.GetType().GetProperty("jc"); if (jcProperty != null) { object jc = jcProperty.GetValue(tblPr); if (jc == null) { jc = Activator.CreateInstance(jcProperty.PropertyType); jcProperty.SetValue(tblPr, jc, null); } // 设置对齐方式为居中 PropertyInfo valProperty = jc.GetType().GetProperty("val"); if (valProperty != null) { // 使用 ST_Jc 枚举的 center 值 Type stJcType = typeof(ST_Jc); object centerValue = Enum.Parse(stJcType, "center"); valProperty.SetValue(jc, centerValue, null); Console.WriteLine("表格横向居中设置成功!"); return; } } } } } Console.WriteLine("无法设置表格横向居中,使用备选方案"); } catch (Exception ex) { Console.WriteLine($"设置表格横向居中时出错: {ex.Message}"); } } /// <summary> /// 设置单元格内容对齐类型 /// </summary> /// <param name="cell">表格单元格</param> /// <param name="paragraphAlignment">段落对齐类型,如ParagraphAlignment.CENTER 是水平居中</param> /// <param name="isBold">是否加粗(用于标题)</param> private void SetCellCenterAlignment(XWPFTableCell cell, ParagraphAlignment paragraphAlignment, bool isBold = false) { try { // 1. 设置垂直居中 cell.SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); // 2. 设置水平居中 if (cell.Paragraphs.Count > 0) { // 获取或创建段落 XWPFParagraph paragraph = cell.Paragraphs[0]; paragraph.Alignment = paragraphAlignment; //ParagraphAlignment.CENTER; // 水平居中 // 设置字体样式 if (paragraph.Runs.Count > 0) { XWPFRun run = paragraph.Runs[0]; run.FontSize = 10; run.FontFamily = "宋体"; run.IsBold = isBold; } else { // 如果没有Run,创建一个 XWPFRun run = paragraph.CreateRun(); run.FontSize = 10; run.FontFamily = "宋体"; run.IsBold = isBold; } } else { // 如果没有段落,创建一个 XWPFParagraph paragraph = cell.AddParagraph(); paragraph.Alignment = ParagraphAlignment.CENTER; XWPFRun run = paragraph.CreateRun(); run.FontSize = 10; run.FontFamily = "宋体"; run.IsBold = isBold; } } catch (Exception ex) { Console.WriteLine($"设置单元格对齐时出错: {ex.Message}"); } } /// <summary> /// 指定位置插入表格 /// </summary> /// <param name="doc"></param> /// <param name="table"></param> /// <param name="targetPos"></param> private static void MoveTableToPosition(XWPFDocument doc, XWPFTable table, int targetPos) { try { // 获取表格的CTTbl var ctTable = table.GetCTTbl(); // 获取body中的所有元素 var bodyItems = doc.Document.body.Items; // 查找表格当前位置 int currentPos = -1; for (int i = 0; i < bodyItems.Count; i++) { if (bodyItems[i] == ctTable) { currentPos = i; break; } } if (currentPos != -1 && currentPos != targetPos) { // 移除当前位置的表格 bodyItems.RemoveAt(currentPos); // 在目标位置插入表格 if (targetPos >= bodyItems.Count) { bodyItems.Add(ctTable); } else { bodyItems.Insert(targetPos, ctTable); } } } catch (Exception ex) { Console.WriteLine($"移动表格出错: {ex.Message}"); } } /// <summary> /// 辅助方法:在指定位置插入空段落 /// </summary> /// <param name="doc"></param> /// <param name="position"></param> private static void InsertEmptyParagraphAtPosition(XWPFDocument doc, int position) { try { // 获取文档的CT_Document var ctDocument = doc.Document; var ctBody = ctDocument.body; // 创建新的CT_P(段落) CT_P ctParagraph = new CT_P(); // 在指定位置插入 if (position >= ctBody.Items.Count) { ctBody.Items.Add(ctParagraph); } else { ctBody.Items.Insert(position, ctParagraph); } // 创建XWPFParagraph包装器(可选,如果需要后续操作) XWPFParagraph newParagraph = new XWPFParagraph(ctParagraph, doc); } catch (Exception ex) { Console.WriteLine($"插入空段落出错: {ex.Message}"); } }
测试方法调用
AddTableToWord("test.docx");
本文来自 www.luofenming.com