首页 > 解决方案 > Open XML SDK:如果启用了更改,则不跟踪程序化文本更改

问题描述

我正在使用 Open XML SDK。我正在执行一些文本更改,但如果我看到输出文件,它有更改但没有被跟踪。

这是我的代码:

using (WordprocessingDocument doc = WordprocessingDocument.Open(@"C:\Users\Prateek\Desktop\Test.docx", true))
{
    var body = doc.MainDocumentPart.Document.Body;
    var paras = body.Descendants<Paragraph>();

    foreach (var para in paras)
    {
        foreach (var run in para.Elements<Run>())
        {
            foreach (var text in run.Elements<Text>())
            {
                if (text.Text.Contains("Lorem"))
                {
                    text.Text = text.Text.Replace("Lorem", "Lorem2");
                }
            }
        }
    }
}

标签: c#openxmlopenxml-sdk

解决方案


最重要的信息是您应该看看Open-Xml-PowerTools

Open XML SDK是一个用于操作 Open XML 标记的非常底层的库。它不提供任何抽象,这意味着您需要自己创建任何和所有标记,使用Open XML SDK提供的强类型类,或者提到另一个示例,Linq to XML 与Open- XML-PowerTools库。后者为各种用例提供​​了更强大的工具。

例如,Open XML SDK 提供强类型类(如ParagraphRunText)来表示 Open XML 元素(如w:pw:rw:t)。它还提供强类型类InsertedRunDeletedRunDeletedText来表示修订标记,例如w:insw:delw:delText。如上所述,您需要使用那些强类型类来创建所需的标记。

所以说你有以下文件:

<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:body>
    <w:p>
      <w:r>
        <w:t>Lorem ipsum dolor sit amet</w:t>
      </w:r>
    </w:p>
  </w:body>
</w:document>

如果您LoremLorem2修订标记替换,结果可能如下所示:

<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:body>
    <w:p>
      <w:del w:del w:id="0" w:author="Thomas Barnekow" w:date="2019-12-09T00:14:00Z">
        <w:r>
          <w:delText>Lorem</w:delText>
        </w:r>
      </w:del>
      <w:ins w:id="1" w:author="Thomas Barnekow" w:date="2019-12-09T00:14:00Z">
        <w:r>
          <w:t>Lorem2</w:t>
        </w:r>
      </w:ins>
      <w:r>
        <w:t xml:space="preserve"> ipsum dolor sit amet</w:t>
      </w:r>
    </w:p>
  </w:body>
</w:document>

好消息是Open-Xml-PowerTools库包含OpenXmlRegex为您生成所需标记的实用程序类。


推荐阅读