使用OpenXML构建段落的正确方法是什么?

时间:2013-06-07 14:54:03

标签: .net vb.net openxml openxml-sdk

我正在尝试根据现有段落 p 创建docx文件。我不是要克隆段落(最终我想在写入 newGraph 之前修改文本)

Dim newGraph As New Paragraph
For Each r As Run In p
    newGraph.Append(r)
Next

运行上面的代码会产生以下错误:

  

无法插入OpenXmlElement“newChild”,因为它是树的一部分。

从现有段落创建新段落的正确方法是什么(假设我想沿途修改文本)。

1 个答案:

答案 0 :(得分:1)

如错误所示, OpenXmlElement的实例无法添加到多个父级。

你可以:

  • 克隆每个Run,修改它们,然后将它们添加到新的paragraph

    Dim newGraph As New Paragraph
    For Each r As Run In p
       Dim newRun = r.Clone()
       ''make some changes here
       newGraph.Append(newRun)
    Next
    
  • 或克隆整个paragraph然后循环到每个Run,如果你想修改它们......

    Dim newGraph As Paragraph = Ctype(p.Clone, Paragraph)
    For Each r As Run In newGraph.Descendants(Of Run)()
       ''make some changes here
    
    Next
    

最佳方法取决于您想要做什么(克隆所有属性与否)。

来自MSDN的评论:

  

克隆OpenXmlNode会复制所有属性及其值,   包括由XML处理器生成的代表默认值的那些   属性。此方法以递归方式克隆节点和子树   在它下面。克隆等同于调用CloneNode(true)。

希望这有帮助。