Word文書の文字列をC#で置換する方法として色々ありますが、OpenXMLライブラリを使用して置換する方法を紹介します。
OpenXMLライブラリを使えば、実行環境にWordがインストールされていなくても、Wordファイルを編集することができます。
注意事項
このライブラリが編集可能なファイル形式は、*.docx
などのXML形式のファイルです。
*.doc
など旧型式のWordファイルには対応していません。
インストールするライブラリ
Nuget から 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)を作成します。
ファイル名を「テスト文書.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);
以下のように、「あ」が「か」に変更されていれば、成功です。
注意事項
このファイルでは、「あいうえお」を「かきくけこ」に置換しようとすると、失敗します。
なぜかというと、XML文書上、「あいうえ」と「お」が分かれており、正規表現の指定new Regex(あいうえお);
では失敗するからです。
置換に失敗する場合は、正規表現の指定方法に注意しましょう。
おすすめ本 c#コードレシピ集
c#コードレシピ集は、「文字列を大文字あるいは小文字に変換したい」や「Taskをキャンセルしたい」など逆引き的にコードの書き方を調べられるレシピ集です。
2021年8月に発売された本で、全部で385個のレシピが収録されています。
ジャンルは日付処理やLINQ、並列処理と非同期処理など幅広く記載されています。
Kindle対応ですので、まずはサンプルをダウンロードして何が書かれているか確認してはいかがでしょうか。
コメント