简体   繁体   English

使用 OpenXml SDK WordprocessingDocument 填充 .docx 第二个表

[英]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);

And this is what temp.docx looks like.这就是 temp.docx 的样子。 在此处输入图片说明

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 .但是,然后,您根据第一个表的cellpr引用初始化下一个ParagraphRunText实例p2r2text12 ,完全忽略cell2p2r2

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM