c# - 使用单个书签将文本添加到word中的多行

标签 c# openxml

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

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

在当前模板(我们可以更改)中,我们添加了 3 个书签 事务部分、事务部分 2 和事务部分 3。 tree transactionparts 形成一个具有三个不同数据内容(ID,描述,金额)的单行

如果我们只有一个交易行,我们可以毫无问题地将数据添加到这些书签,但是当我们应该添加第二行时我们该怎么办?没有更多行的书签。

有没有聪明的方法来做到这一点?

或者我们是否应该更改 worddocument 以便行最终出现在表格中?这会以更好的方式解决问题吗?

最佳答案

我会在 3 列的表格中放置一个书签,我们称它为“交易”。 像这样 tablelayout

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

你可以用这样的代码完成它

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

你最终得到了这个

final table

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

关于c# - 使用单个书签将文本添加到word中的多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13986371/

相关文章:

c# - ClickOnce - 无法发布,因为项目构建失败

c# - 如何检查一个对象是否等于同一类的新对象?

c# - 替换 OpenXML 中内容控件的文本

c# - 如何通过C#通过OpenXML从Word(.Docx)中提取OLE文件

c# - 如何在 Windows 上限制底部窗口全屏最大 y 位置

c# - 如何从 DataSet 中的 DataTable 存储中检索数据并将其存储在数组中?

C# WPF : Changing current tab with button click?

.net - 在不使用 Office Automation 的情况下生成 PowerPoint 演示文稿的一些技术有哪些?

ruby - XPath 选择 OOXML 中两个文本标记之间的所有节点?

c# - 在 Docx 文件*周围*运行中的文本中插入注释