Aggiungi una riga a una tabella esistente in un documento di Word (aperto XML)

Devo aprire un documento Word esistente (.docx) con una tabella esistente (con, ad esempio, 3 colonne) e aggiungere una nuova riga a quella tabella. C’è un modo per farlo? Sto usando Open XML

Sto creando la tabella in questo modo (per la prima volta):

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; 

Ecco qui,

 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")))))); }

Usa LINQ per ottenere il tavolo corretto.

MODIFICARE:

Supponi di voler ottenere la tabella con 4 colonne.

 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")))))); }

Di ‘che vuoi ottenere il tavolo che contiene la parola “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")))))); }

Ecco un esempio più dettagliato in cui aggiungi 5 righe a una tabella esistente.

Ciò presuppone che la tabella sia la prima nel documento. Se no, devi trovare il tuo tavolo.

Il codice ottiene l’ultima riga del tavolo e lo copia. Dopodiché hai solo bisogno di inserire i tuoi dati nelle celle.

 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 è il mio rapido tentativo di hacker di utilizzare lo stesso formato per il testo delle file già esistenti.

 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; } 

qui sto aggiungendo righe a una tabella esistente dal set di dati

  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); } }