C# Docxファイルの文字列を置換する【OpenXML】

Word文書の文字列をC#で置換する方法として色々ありますが、OpenXMLライブラリを使用して置換する方法を紹介します。

OpenXMLライブラリを使えば、実行環境にWordがインストールされていなくても、Wordファイルを編集することができます。

注意事項

このライブラリが編集可能なファイル形式は、*.docxなどのXML形式のファイルです。

*.docなど旧型式のWordファイルには対応していません。

インストールするライブラリ

Nuget から DocumentFormat.OpenXmlライブラリをダウンロードします。

DocumentFormat.OpenXml

機能概要

この関数では、以下の機能を実装しています。

  • 引数からdocxファイルパスを受け取り、ファイルを開く
  • 引数からList<ReplacePattern>を受け取り、文字列置換する
  • docx ファイルを上書き保存する

上記より、引数は以下の2つを持ちます。

  • string docxFilePath docxファイルパス
  • List<ReplacePattern> replPatternList 置換パターンリスト

置換処理ソースコード


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

    /// <summary>
    /// docxファイルを一括置換して上書き保存する
    /// </summary>
    /// <param name=docxFilePath>docxファイルパス</param>
    /// <param name=replPatternList>置換パターンリスト</param>
    public void MultieplaceStringDocx(string docxFilePath, List<ReplacePattern> replPatternList)
    {

        using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(docxFilePath, true))
        {
            string docText = null;
            using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
            {
                docText = sr.ReadToEnd();
            }

            foreach(ReplacePattern item in replPatternList)
            {
                docText = item.oldRegex.Replace(docText, item.newString);
            }

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

    }

以下で、Wordファイルを開き、wordDocオブジェクトに格納します。

WordprocessingDocument wordDoc = WordprocessingDocument.Open(docxFilePath, true)

Wordファイルの中身を全て読み取り、docTextに格納します。

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

置換パターンリスト(List型)を foreachでループし、置換します。置換後のWordファイルデータは、docTextに格納されます。

foreach(ReplacePattern item in replPatternList)
{
    docText = item.oldRegex.Replace(docText, item.newString);
}

最後に、置換後のデータを上書き保存します。

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

置換パターンクラス

置換パターンクラスは、以下2つのメンバーを持ちます。

  • Regex oldRegex 検索文字列(正規表現)
  • string newString 置換文字列(文字列型)
    /// <summary>
    /// 置換パターン
    /// </summary>
    public class ReplacePattern
    {
        /// <summary>
        /// 検索文字列正規表現
        /// </summary>
        public Regex oldRegex;

        /// <summary>
        /// 置換文字列
        /// </summary>
        public string newString;
    }

使い方

以下のようなWordファイル(テスト文書.docx)を作成します。

置換前Wordファイル

ファイル名を「テスト文書.docx」とします。

オートシェイプ図形の中にも文字列が含まれています。

このうち、「あ」を「か」に変換してみたいと思います。

呼び出し元ソース

    string docxFilePath = @"D:\@Playground\20200617\テスト文書.docx";

    List<ReplacePattern> replPtnList = new List<ReplacePattern>();
    ReplacePattern replPtn = new ReplacePattern();

    replPtn.oldRegex = new Regex("あ");
    replPtn.newString = "か";

    replPtnList.Add(replPtn);

    MultieplaceStringDocx(docxFilePath, replPtnList);

以下で、置換対象のdocxファイルパスを指定します。

    string docxFilePath = @"D:\@Playground\20200617\テスト文書.docx";

置換パターンリストと置換パターンクラスを定義し、置換情報をセットして、リストに追加します。

    List<ReplacePattern> replPtnList = new List<ReplacePattern>();
    ReplacePattern replPtn = new ReplacePattern();

    replPtn.oldRegex = new Regex("あ");
    replPtn.newString = "か";

    replPtnList.Add(replPtn);

最後に、呼び出します。

    MultieplaceStringDocx(docxFilePath, replPtnList);

以下のように、「あ」が「か」に変更されていれば、成功です。

置換後Wordファイル

注意事項

このファイルでは、「あいうえお」を「かきくけこ」に置換しようとすると、失敗します。

なぜかというと、XML文書上、「あいうえ」と「お」が分かれており、正規表現の指定new Regex(あいうえお);では失敗するからです。

XML文書

置換に失敗する場合は、正規表現の指定方法に注意しましょう。

おすすめ本 c#コードレシピ集

c#コードレシピ集は、「文字列を大文字あるいは小文字に変換したい」や「Taskをキャンセルしたい」など逆引き的にコードの書き方を調べられるレシピ集です。

2021年8月に発売された本で、全部で385個のレシピが収録されています。

ジャンルは日付処理やLINQ、並列処理と非同期処理など幅広く記載されています。

Kindle対応ですので、まずはサンプルをダウンロードして何が書かれているか確認してはいかがでしょうか。

コメント

タイトルとURLをコピーしました