Поделиться через


Поиск и замена текста в части документа

В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для программного поиска и замены текстового значения в текстовом документе.


Пакеты и части документов

Документ Open XML хранится в виде пакета, формат которого определяется стандартом ISO/IEC 29500. Пакет может содержать несколько частей, между которыми существуют связи. Связь между частями определяет категорию документа. Документ может быть определен как текстовый, если его элемент связи пакета содержит связь с основной частью документа. Если элемент связи пакета содержит связь с частью презентации, документ может быть определен как документ презентации. Если элемент связи пакета содержит связь с частью книги, документ определяется как электронная таблица. В данном практическом руководстве рассматривается пакет текстового документа.


Получение объекта WordprocessingDocument

В примере кода сначала открывается текстовый файл, создав WordprocessingDocument экземпляр класса, как показано в следующей using инструкции. В той же инструкции вы открываете текстовый файл document с помощью Open метода с логическим параметром , чтобы true включить редактирование документа.

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

В версии 3.0.0+ Close() метод был удален в пользу использования инструкции using. Это гарантирует, что Dispose() метод автоматически вызывается при достижении закрывающей фигурной скобки. Блок, следующий за инструкцией using, создает область для объекта, создаваемого или именуемого в инструкции using. WordprocessingDocument Так как класс в пакете SDK open XML автоматически сохраняет и закрывает объект в рамках его IDisposable реализации, а так как Dispose() вызывается автоматически при выходе из блока, не нужно явно вызывать Save() или Dispose() до тех пор, пока вы используете инструкцию using .


Пример кода

В следующем примере показан быстрый и простой способ поиска и замены. Он может оказаться не вполне надежным, поскольку извлекает документ 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);
        }
    }
}

См. также