Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向word中的多行添加文本时,只需使用一个书签_C#_Openxml - Fatal编程技术网

C# 向word中的多行添加文本时,只需使用一个书签

C# 向word中的多行添加文本时,只需使用一个书签,c#,openxml,C#,Openxml,是否可以借助书签和openXML向word文档添加几行 我们有一个worddocument作为报告模板。 在该模板中,我们需要添加几个事务行。 问题是行数不是静态的。例如,它可以是0、1或42 在当前模板(我们可以更改)中,我们添加了3个书签 交易部分、交易部分2和交易部分3。 树transactionparts使用三种不同的数据内容(ID、描述、金额)形成一行 如果我们只有一个事务行,那么将数据添加到这些书签中是没有问题的,但是当我们应该添加第二行时,我们该怎么做呢?没有更多行的书签 有没有聪

是否可以借助书签和openXML向word文档添加几行

我们有一个worddocument作为报告模板。 在该模板中,我们需要添加几个事务行。 问题是行数不是静态的。例如,它可以是0、1或42

在当前模板(我们可以更改)中,我们添加了3个书签 交易部分、交易部分2和交易部分3。 树transactionparts使用三种不同的数据内容(ID、描述、金额)形成一行

如果我们只有一个事务行,那么将数据添加到这些书签中是没有问题的,但是当我们应该添加第二行时,我们该怎么做呢?没有更多行的书签

有没有聪明的方法


或者我们应该更改worddocument,使行最终位于表中?这能更好地解决问题吗?

我会在一个3列的表中放一个书签,称之为“事务”。 这样地

当您知道表的设计,但不知道需要的行数时,最简单的方法是为每行数据添加一行

您可以使用这样的代码来实现这一点

//make some data.
            List<String[]> data = new List<string[]>();

            for (int i = 0; i < 10; i++)
                data.Add(new String[] {"this","is","sparta" });
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open("yourDocument.docx", true))
                {
                    var mainPart = wordDoc.MainDocumentPart;
                    var bookmarks = mainPart.Document.Body.Descendants<BookmarkStart>();
                    var bookmark = 
                        from n in bookmarks 
                        where n.Name == "transactions" 
                        select n;

                    OpenXmlElement elem = bookmark.First().Parent;
                    //isolate tabel
                    while (!(elem is DocumentFormat.OpenXml.Wordprocessing.Table))
                        elem = elem.Parent;
                    var table = elem; //found
                    //save the row you wanna copy in each time you have data.
                    var oldRow = elem.Elements<TableRow>().Last();
                    DocumentFormat.OpenXml.Wordprocessing.TableRow row = (TableRow)oldRow.Clone();
                    //remove old row
                    elem.RemoveChild<TableRow>(oldRow);
                    foreach (String[] s in data)
                    {
                        DocumentFormat.OpenXml.Wordprocessing.TableRow newrow = (TableRow)row.Clone();
                        var cells = newrow.Elements<DocumentFormat.OpenXml.Wordprocessing.TableCell>();
                        //we know we have 3 cells
                        for(int i = 0; i < cells.Count(); i++)
                        {
                            var c = cells.ElementAt(i);
                            var run = c.Elements<Paragraph>().First().Elements<Run>().First();
                            var text = run.Elements<Text>().First();
                            text.Text = s[i];
                        }
                        table.AppendChild(newrow);
                    }
                }
//制作一些数据。
列表数据=新列表();
对于(int i=0;i<10;i++)
Add(新字符串[]{“this”,“is”,“sparta”});
使用(WordprocessingDocument wordDoc=WordprocessingDocument.Open(“yourDocument.docx”,true))
{
var mainPart=wordDoc.MainDocumentPart;
var bookmarks=mainPart.Document.Body.subjects();
变量书签=
从书签中的n开始
其中n.Name==“事务”
选择n;
OpenXmlElement elem=bookmark.First().Parent;
//隔离片
而(!(元素是DocumentFormat.OpenXml.Wordprocessing.Table))
元素=元素父元素;
var table=elem;//找到
//每次有数据时保存要复制的行。
var oldRow=elem.Elements().Last();
DocumentFormat.OpenXml.Wordprocessing.TableRow行=(TableRow)oldRow.Clone();
//删除旧行
RemoveChild元素(oldRow);
foreach(数据中的字符串[]s)
{
DocumentFormat.OpenXml.Wordprocessing.TableRow newrow=(TableRow)row.Clone();
var cells=newrow.Elements();
//我们知道我们有3个细胞
对于(int i=0;i
你最终会得到这个

我已经在一个非常基本的文档上测试了这段代码,并且知道它是有效的。 祝你好运,如果我能进一步澄清,请告诉我