搜索和替换文档部件中的文本

本主题演示如何使用 Open XML SDK for Office 中的类以编程方式搜索和替换字处理文档中的文本值。


包和文档部件

Open XML 文档存储为包,其格式由 ISO/IEC 29500 定义。 包可以具有多个彼此之间存在关系的部件。 部件之间的关系控制文档的类别。 如果文档的包关系项包含与主文档部件的关系,可将文档定义为字处理文档。 如果文档的包关系项包含与演示文稿部件的关系,可将文档定义为演示文稿文档。 如果文档的包关系项包含与工作簿部件的关系,可将文档定义为电子表格文档。 在本操作方法主题中,您将使用字处理文档包。


获取 WordprocessingDocument 对象

在示例代码中,首先通过实例化 类来打开字处理文件, WordprocessingDocument 如以下 using 语句所示。 在同一语句中,使用 Open 方法打开字处理文件document,并将布尔参数设置为 true 以启用编辑文档。

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))

在 v3.0.0+ 中, Close() 已删除 方法,转而依赖于 using 语句。 它确保在 Dispose() 到达右大括号时自动调用 方法。 using 语句后面的块为 using 语句中创建或指定的对象设定范围。 WordprocessingDocument由于 Open XML SDK 中的 类会自动保存并关闭对象作为其IDisposable实现的一using部分,并且由于Dispose()在退出块时会自动调用,因此无需显式调用 Save()Dispose() ,只要使用 语句。


示例代码

以下示例演示了一种快速简单的搜索和替换方法。 它可能不可靠,因为它检索字符串格式的 XML 文档。 根据正则表达式,你可能会无意中替换 XML 标记并损坏文档。 如果只想搜索文档,但不替换内容,可以使用 MainDocumentPart.Document.InnerText

此示例还演示如何使用正则表达式搜索和替换存储在字处理文件中的文本值“Hello World!”值“大家好! 若要调用 方法 SearchAndReplace,可以使用以下示例。

SearchAndReplace(args[0]);

运行该程序后,可以检查文件以查看文本"Hello world!"中的更改

以下是使用 C# 和 Visual Basic 编写的完整示例代码。

static void SearchAndReplace(string document)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
    {
        string? docText = null;


        if (wordDoc.MainDocumentPart is null)
        {
            throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
        }

        using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
        {
            docText = sr.ReadToEnd();
        }

        Regex regexText = new Regex("Hello World!");
        docText = regexText.Replace(docText, "Hi Everyone!");

        using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
        {
            sw.Write(docText);
        }
    }
}

另请参阅