向Word文档中的现有表添加行(打开XML)

我需要使用现有表(例如,3列)打开现有Word文档(.docx)并向该表添加新行。 有没有办法做到这一点? 我正在使用Open XML

我正在创建这样的表(第一次):

Table tbl = new Table(); // Set the style and width for the table. TableProperties tableProp = new TableProperties(); TableStyle tableStyle = new TableStyle() { Val = "TableGrid" }; // Make the table width 100% of the page width. TableWidth tableWidth = new TableWidth() { Width = "5000", Type = TableWidthUnitValues.Pct }; // Apply tableProp.Append(tableStyle, tableWidth); tbl.AppendChild(tableProp); // Add 3 columns to the table. TableGrid tg = new TableGrid(new GridColumn(), new GridColumn(), new GridColumn()); tbl.AppendChild(tg); // Create 1 row to the table. TableRow tr1 = new TableRow(); // Add a cell to each column in the row. TableCell tc1 = new TableCell(new Paragraph(new Run(new Text("1")))); TableCell tc2 = new TableCell(new Paragraph(new Run(new Text("2")))); TableCell tc3 = new TableCell(new Paragraph(new Run(new Text("3")))); tr1.Append(tc1, tc2, tc3); // Add row to the table. tbl.AppendChild(tr1); return tbl; 

干得好,

 Body bod = doc.MainDocumentPart.Document.Body; foreach (Table t in bod.Descendants()) { t.Append(new TableRow(new TableCell(new Paragraph(new Run(new Text("test")))))); }

使用LINQ获取正确的表。

编辑:

假设您想要获得包含4列的表。

 Body bod = doc.MainDocumentPart.Document.Body; foreach (Table t in bod.Descendants().Where(tbl => tbl.GetFirstChild().Descendants().Count() == 4)) { t.Append(new TableRow(new TableCell(new Paragraph(new Run(new Text("test")))))); }

假设您要获取包含单词“mytable”的表格。

 Body bod = doc.MainDocumentPart.Document.Body; foreach (Table t in bod.Descendants().Where(tbl => tbl.InnerText.Contains("myTable"))) { t.Append(new TableRow(new TableCell(new Paragraph(new Run(new Text("test")))))); }

这是一个更详细的示例,您可以在现有表中添加5行。

这假设该表是文档中的第一个表。 如果没有,你必须找到你的桌子。

代码获取表的最后一行并复制它。 之后,您只需在单元格中填写数据即可。

 Table myTable = doc.Body.Descendants().First(); TableRow theRow = myTable.Elements().Last(); for (int i = 0; i < 5; i++) { TableRow rowCopy = (TableRow)theRow.CloneNode(true); var runProperties = GetRunPropertyFromTableCell(rowCopy, 0); var run = new Run(new Text(i.ToString() + " 1")); run.PrependChild(runProperties); rowCopy.Descendants().ElementAt(0).RemoveAllChildren();//removes that text of the copied cell rowCopy.Descendants().ElementAt(0).Append(new Paragraph(run)); //I only get the the run properties from the first cell in this example, the rest of the cells get the document default style. rowCopy.Descendants().ElementAt(1).RemoveAllChildren(); rowCopy.Descendants().ElementAt(1).Append(new Paragraph(new Run(new Text(i.ToString() + " 2")))); rowCopy.Descendants().ElementAt(2).RemoveAllChildren(); rowCopy.Descendants().ElementAt(2).Append(new Paragraph(new Run(new Text(i.ToString() + " 3")))); myTable.AppendChild(rowCopy); } myTable.RemoveChild(theRow); //you may want to remove this line. I have it because in my code i always have a empty row last in the table that i copy.

GetRunPropertiesFromTableCell是我尝试使用与现有行相同的文本格式的快速黑客尝试。

 private static RunProperties GetRunPropertyFromTableCell(TableRow rowCopy, int cellIndex) { var runProperties = new RunProperties(); var fontname = "Calibri"; var fontSize = "18"; try { fontname = rowCopy.Descendants() .ElementAt(cellIndex) .GetFirstChild() .GetFirstChild() .GetFirstChild() .GetFirstChild() .Ascii; } catch { //swallow } try { fontSize = rowCopy.Descendants() .ElementAt(cellIndex) .GetFirstChild() .GetFirstChild() .GetFirstChild() .GetFirstChild() .Val; } catch { //swallow } runProperties.AppendChild(new RunFonts() { Ascii = fontname }); runProperties.AppendChild(new FontSize() { Val = fontSize }); return runProperties; } 

这里是从数据集添加到现有表的行

  DataTable dt = new DataTable(); dt.Columns.Add("Gender"); dt.Columns.Add("Passport"); dt.Columns.Add("Name"); foreach (RepeaterItem item in rptemplist.Items) { TextBox txtGender = (TextBox)item.FindControl("txtGender"); TextBox txtPassport = (TextBox)item.FindControl("txtPassport"); TextBox txtName = (TextBox)item.FindControl("txtName"); dt.Rows.Add(new object[] { txtGender.Text, txtPassport.Text, txtName.Text }); } using (WordprocessingDocument wordDoc2 = WordprocessingDocument.Open(file, true)) { var doc = wordDoc2.MainDocumentPart.Document; DocumentFormat.OpenXml.Wordprocessing.Table table = doc.MainDocumentPart.Document.Body.Elements().FirstOrDefault(); int icounterfortableservice; for (icounterfortableservice = 0; icounterfortableservice < dt.Rows.Count; icounterfortableservice++) { DocumentFormat.OpenXml.Wordprocessing.TableRow tr = new DocumentFormat.OpenXml.Wordprocessing.TableRow(); DocumentFormat.OpenXml.Wordprocessing.TableCell tablecellService1 = new DocumentFormat.OpenXml.Wordprocessing.TableCell(new DocumentFormat.OpenXml.Wordprocessing.Paragraph(new DocumentFormat.OpenXml.Wordprocessing.Run(new DocumentFormat.OpenXml.Wordprocessing.Text(dt.Rows[icounterfortableservice]["Gender"].ToString())))); DocumentFormat.OpenXml.Wordprocessing.TableCell tablecellService2 = new DocumentFormat.OpenXml.Wordprocessing.TableCell(new DocumentFormat.OpenXml.Wordprocessing.Paragraph(new DocumentFormat.OpenXml.Wordprocessing.Run(new DocumentFormat.OpenXml.Wordprocessing.Text(dt.Rows[icounterfortableservice]["Passport"].ToString())))); DocumentFormat.OpenXml.Wordprocessing.TableCell tablecellService3 = new DocumentFormat.OpenXml.Wordprocessing.TableCell(new DocumentFormat.OpenXml.Wordprocessing.Paragraph(new DocumentFormat.OpenXml.Wordprocessing.Run(new DocumentFormat.OpenXml.Wordprocessing.Text(dt.Rows[icounterfortableservice]["Name"].ToString())))); tr.Append(tablecellService1, tablecellService2, tablecellService3); table.AppendChild(tr); } }