次の方法で共有


ドキュメント パーツのテキストを検索して置換する

適用対象: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010

この記事の内容
パッケージとドキュメント パーツ
WordprocessingDocument オブジェクトの取得
サンプル コードの動作のしくみ
サンプル コード

このトピックでは、Open XML SDK 2.0 for Microsoft Office のクラスを使用して、プログラムによってワープロ ドキュメントのテキスト値を検索して置換する方法について説明します。

このトピックのコードをコンパイルするには、次のアセンブリ ディレクティブが必要です。

using System.IO;
using System.Text.RegularExpressions;
using DocumentFormat.OpenXml.Packaging;
Imports System.IO
Imports System.Text.RegularExpressions
Imports DocumentFormat.OpenXml.Packaging

パッケージとドキュメント パーツ

Open XML ドキュメントはパッケージとして保存されます。このパッケージの形式は、ISO/IEC 29500-2 (英語) に定義されています。パッケージの内部は、リレーションシップで結ばれた複数のパーツに分けることができます。パーツ間のリレーションシップによって、ドキュメントのカテゴリが決まります。パッケージのリレーションシップ アイテムにメイン ドキュメント パーツへのリレーションシップを含めると、そのドキュメントをワープロ ドキュメントとして定義できます。パッケージのリレーションシップ アイテムにプレゼンテーション パーツへのリレーションシップを含めると、そのドキュメントをプレゼンテーション ドキュメントとして定義できます。パッケージのリレーションシップ アイテムにブック パーツへのリレーションシップを含めると、そのドキュメントをスプレッドシート ドキュメントとして定義できます。このトピックでは、ワープロ ドキュメント パッケージを使用します。

WordprocessingDocument オブジェクトの取得

サンプル コードでは、以下の using ステートメントに示すように、まず WordprocessingDocument クラスをインスタンス化することにより、ワープロ ファイルを開きます。同じステートメントで、ドキュメントの編集を有効にするためにブール型のパラメーターを true に設定して Open メソッドを使用することにより、ワープロ ファイル document を開きます。

using (WordprocessingDocument wordDoc = 
        WordprocessingDocument.Open(document, true))
{
    // Insert other code here.
}
Using wordDoc As WordprocessingDocument = WordprocessingDocument.Open(document, True)
    ' Insert other code here.
End Using

using ステートメントは、一般的な .Open, .Save, .Close シーケンスに代わる手段として推奨されます。これによって、閉じかっこに達したときに、Dispose メソッド (Open XML SDK がリソースをクリーンアップするために使用する内部メソッド) が自動的に呼び出されます。using ステートメントに続くブロックは、作成された、または using ステートメントで指定されたオブジェクト (この場合は wordDoc) のスコープを設定します。Open XML SDK の WordprocessingDocument クラスは、System.IDisposable 実装の一部として自動的にオブジェクトを保存して閉じるため、また、Dispose が、ブロックの終わりで自動的に呼び出されるため、using を使用する場合は、Save および Close を明示的に呼び出す必要はありません。

サンプル コードの動作のしくみ

編集を有効にしてファイルを開いた後で、StreamReader オブジェクトを使用して読み取ります。

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

    using (sr)
        docText = sr.ReadToEnd
    End using

"Hello world!" という文字列が含まれる正規表現オブジェクトを作成します。次に、"Hi Everyone!" というテキストでテキスト値を置換します。正規表現の詳細については、「.NET Framework の正規表現」を参照してください。

Regex regexText = new Regex("Hello world!");
docText = regexText.Replace(docText, "Hi Everyone!");
Dim regexText As Regex = New Regex("Hello world!")
docText = regexText.Replace(docText, "Hi Everyone!")

サンプル コード

以下のコード例は、正規表現を使用して "MyPkg8.docx" という名前のワープロ ファイルに含まれるテキスト値 "Hello world!" を検索し、"Hi Everyone!" という値に置換する方法を示しています。SearchAndReplace メソッドを呼び出すには、次の例のようなコードを使用します。

SearchAndReplace(@"C:\Users\Public\Documents\MyPkg8.docx");
SearchAndReplace("C:\Users\Public\Documents\MyPkg8.docx")

プログラムを実行した後で、ファイルを調べて "Hello world!" というテキストが変更されていることを確認できます。

以下に、C# と Visual Basic による完全なサンプル コードを示します。

// To search and replace content in a document part.
public static void SearchAndReplace(string document)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
    {
        string docText = 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);
        }
    }
}
' To search and replace content in a document part. 
Public Sub SearchAndReplace(ByVal document As String)
    Dim wordDoc As WordprocessingDocument = WordprocessingDocument.Open(document, True)
    using (wordDoc)
        Dim docText As String = Nothing
        Dim sr As StreamReader = New StreamReader(wordDoc.MainDocumentPart.GetStream)

        using (sr)
            docText = sr.ReadToEnd
        End using

        Dim regexText As Regex = New Regex("Hello world!")
        docText = regexText.Replace(docText, "Hi Everyone!")
        Dim sw As StreamWriter = New StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create))

        using (sw)
            sw.Write(docText)
        End using
    End using
End Sub

関連項目

参照

Class Library Reference

その他の技術情報

.NET Framework の正規表現