[英]Populate .docx second table using OpenXml SDK WordprocessingDocument
Im trying to populate 2 tables in .docx file from a controller.我试图从控制器填充 .docx 文件中的 2 个表。 I have no problem populating the first table.填充第一个表没有问题。 But I can't seem to find a way to populate the second one.但我似乎找不到填充第二个的方法。 Here is my controller code.这是我的控制器代码。
using (WordprocessingDocument sourceDoc = WordprocessingDocument.Open(Server.MapPath("~/doc/temp.docx"), false))
using (var resultDoc = WordprocessingDocument.Create(stream, DocumentFormat.OpenXml.WordprocessingDocumentType.Document, true))
{
//Declare a TABLE class(This will get you first table of docx)
Table table = body.Elements<Table>().First();
//Accessing 1st row of the table
TableRow row = table.Elements<TableRow>().ElementAt(0);
//Accessing 2nd cell of that row
TableCell cell = row.Elements<TableCell>().ElementAt(0);
Paragraph p = cell.Elements<Paragraph>().First();
Run r = p.Elements<Run>().First();
Text text1 = r.Elements<Text>().First();
//replacing text in that CELL
text1.Text = text1.Text.Replace("xTitlex", "Title");
//Accessing 2nd ROW of That table
row = table.Elements<TableRow>().ElementAt(1);
//Accessing 2nd CELL of that row
cell = row.Elements<TableCell>().ElementAt(1);
p = cell.Elements<Paragraph>().First();
r = p.Elements<Run>().First();
text1 = r.Elements<Text>().First();
//Replacing text in that CELL
text1.Text = text1.Text.Replace("xVal1x", "Item1");
//This dont seem to work
//Declare a 2nd TABLE class(This will get you second table of docx)
Table table2 = body.Elements<Table>().Last();
TableRow row2 = table2.Elements<TableRow>().ElementAt(0);
////Accessing 2nd cell of that row
TableCell cell2 = row2.Elements<TableCell>().ElementAt(1);
Paragraph p2 = cell.Elements<Paragraph>().Last();
Run r2 = p.Elements<Run>().Last();
Text text12 = r.Elements<Text>().Last();
////replacing text in that CELL
text12.Text = text1.Text.Replace("xVal2x", "Item2");
}
stream.Seek(0, SeekOrigin.Begin);
Firstly, some code seems to be missing from your example.首先,您的示例中似乎缺少一些代码。 For example, I can't see how you initialized your body
variable.例如,我看不到您是如何初始化body
变量的。 So let's assume you initialized body
essentially as follows:因此,让我们假设您基本上按如下方式初始化了body
:
Body body = sourceDoc.MainDocumentPart.Document.Body;
Next, looking at your code, you mixed up some variables and, thus, reference the wrong table.接下来,查看您的代码,您混淆了一些变量,因此引用了错误的表。 Specifically, the following lines from your code correctly select the last (second in this case) table, then the first row, and finally, the second cell of that row.具体来说,代码中的以下几行正确选择了最后一个(在本例中为第二个)表,然后是第一行,最后是该行的第二个单元格。
//This dont seem to work
//Declare a 2nd TABLE class(This will get you second table of docx)
Table table2 = body.Elements<Table>().Last();
TableRow row2 = table2.Elements<TableRow>().ElementAt(0);
////Accessing 2nd cell of that row
TableCell cell2 = row2.Elements<TableCell>().ElementAt(1);
Then, however, you initialize the next Paragraph
, Run
, and Text
instances p2
, r2
, and text12
based on first table's cell
, p
, and r
references, completely ignoring cell2
, p2
, and r2
.但是,然后,您根据第一个表的cell
、 p
和r
引用初始化下一个Paragraph
、 Run
和Text
实例p2
、 r2
和text12
,完全忽略cell2
、 p2
和r2
。
Paragraph p2 = cell.Elements<Paragraph>().Last();
Run r2 = p.Elements<Run>().Last();
Text text12 = r.Elements<Text>().Last();
This means text12
references a Text
instance contained in your first table.这意味着text12
引用包含在您的第一个表中的Text
实例。 So, ultimately, replacing "xVal2x"
does not have any effect, because that Text
instance does not contain that string of characters.因此,最终,替换"xVal2x"
没有任何效果,因为该Text
实例不包含该字符串。
I got help from someone.我得到了某人的帮助。 This is the solution.这就是解决方案。
//Declare a 2nd TABLE class(This will get you second table of docx)
Table table2 = body.Elements<Table>().ElementAt(1);
//Access first row
row = table2.Elements<TableRow>().ElementAt(0);
//Accessing 2nd cell of that row
cell = row.Elements<TableCell>().ElementAt(1);
p = cell.Elements<Paragraph>().First();
r = p.Elements<Run>().First();
text1 = r.Elements<Text>().First();
//Replacing text in that CELL
text1.Text = text1.Text.Replace("xVal2x", "Item2");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.