Wordテンプレートを使用する際、名前や日付、さらには会社のロゴなど、特定のプレースホルダーを実際のコンテンツに置き換える必要がよくあります。これらを手作業で一つずつ変更すると時間がかかるだけでなく、繰り返し作業の負担も増えてしまいます。コードを記述すれば、この処理を自動化できます。本チュートリアルでは、C#の正規表現を使用してWordドキュメント内のテキストを置換する方法を紹介します。具体的には、ドキュメント全体を対象とした検索と置換、特定の段落内のテキストの置換、さらに一致したテキストを画像に置き換える方法について説明します。
はじめに:Word処理ライブラリのインストール
Wordドキュメントを処理する際は、.NET用のドキュメント処理ライブラリを利用することで、ファイルの読み込み、編集、形式変換などの操作を実行できます。また、対応するAPIを呼び出すことで、少量のC#コードを使用してWordドキュメント内の正規表現による検索と置換を実行できます。
必要なライブラリはNuGetを使用してインストールできます。以下のコマンドを実行してください。
PM> Install-Package Spire.Doc
正規表現を使用してWordドキュメント全体のテキストを置換する
まず、よくあるケースとして、Wordドキュメント全体に含まれる特定のテキストを置換する方法を見ていきましょう。正規表現を使用して #name や #tel などのプレースホルダーを検索し、名前や電話番号などの実際の内容に置き換えることができます。
ドキュメント処理ライブラリが提供する Document.Replace() メソッドを呼び出すことで、この操作を簡単に実行できます。以下では、手順とサンプルコードを通じて、C#の正規表現を使用してWordドキュメント内のテキストを置換する方法を説明します。
コード例:C#を使用してWordドキュメント全体の #name を「May」に置換する
using Spire.Doc;
using System.Text.RegularExpressions;
namespace FindText
{
class Program
{
static void Main(string[] args)
{
// Documentクラスのオブジェクトを作成し、Wordドキュメントを読み込む
Document doc = new Document();
doc.LoadFromFile("/input/replace template.docx");
// 正規表現を設定する
Regex regex = new Regex(@"#\w+\b");
// 一致するすべての項目を「May」に置換する
doc.Replace(regex, "May");
// ドキュメントを保存する
doc.SaveToFile("/output/replacealloccurences.docx", FileFormat.Docx2013);
}
}
}
C#で正規表現を使用して指定した段落内のテキストを置換する
Wordドキュメント全体のテキストを置換するのは比較的簡単ですが、特定の段落だけを変更したい場合は、どのようにすればよいでしょうか。
置換範囲をより細かく制御する必要がある場合、たとえば指定した段落内でのみ正規表現による置換を実行したい場合は、まず対象の段落のテキストを取得し、必要に応じてその内容を再設定します。具体的には、正規表現を使用して対象の段落内で一致するテキストを検索し、既存の内容を削除してから、置換後のテキストを挿入します。
まず、実際のコード例を見てから、具体的な手順を詳しく説明します。
コード例:正規表現を使用して最初の段落の #name を「Lily」に置換する
using Spire.Doc;
using Spire.Doc.Documents;
using System.Text.RegularExpressions;
class Program
{
static void Main(string[] args)
{
// Documentオブジェクトを作成し、テンプレートを読み込む
Document doc = new Document();
doc.LoadFromFile("/input/replace template.docx");
Regex regex = new Regex(@"#\w+\b");
// 最初の段落を取得する
Paragraph para = doc.Sections[0].Paragraphs[0];
string originalText = para.Text;
if (regex.IsMatch(originalText))
{
string newText = regex.Replace(originalText, "Lily");
// 既存の内容をクリアし、置換後のテキストを追加する
para.ChildObjects.Clear();
para.AppendText(newText);
}
// 変更後のドキュメントを保存する
doc.SaveToFile("/output/replacefirstpara.docx", FileFormat.Docx2013);
}
}
C#を使用してWord内の正規表現に一致するテキストを画像に置き換える
ドキュメント全体または指定した段落内のテキストを置換する方法を確認したところで、次はさらに応用的な使い方として、テキストを画像に置き換える方法を見ていきましょう。この方法は、レポートや会社案内などを自動生成する場面でよく使用されます。たとえば、[logo] のようなプレースホルダーを実際の会社ロゴに置き換えることができます。
C#の正規表現と画像挿入APIを組み合わせることで、この処理を自動化できます。まず実際のコード例を確認し、その後、実装の仕組みを詳しく説明します。
コード例:[avatar] を画像に置き換える
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using System.Text.RegularExpressions;
namespace RegexReplaceWithImage
{
class Program
{
static void Main(string[] args)
{
// Documentオブジェクトを作成し、ディスクからWordファイルを読み込む
Document document = new Document();
document.LoadFromFile(@"\input\replace template.docx");
// プレースホルダーを検索するための正規表現を定義する
Regex regex = new Regex(@"\[\w+\]", RegexOptions.IgnoreCase);
// ドキュメント内で検索パターンに一致するすべての内容を検索する
TextSelection[] selections = document.FindAllPattern(regex);
// 一致した各プレースホルダーを反復処理する
foreach (TextSelection selection in selections)
{
// 画像オブジェクトを作成し、ディスクから画像を読み込む
DocPicture pic = new DocPicture(document);
pic.LoadImage(@"\avatar-1.png");
// 一致したテキストを単一のTextRangeとして取得する
TextRange textRange = selection.GetAsOneRange();
// 所属する段落内でのTextRangeのインデックスを取得する
int index = textRange.OwnerParagraph.ChildObjects.IndexOf(textRange);
// 一致した位置に画像を挿入する
textRange.OwnerParagraph.ChildObjects.Insert(index, pic);
// 元のプレースホルダーテキストを削除する
textRange.OwnerParagraph.ChildObjects.Remove(textRange);
}
// 変更後のドキュメントをディスクに保存する
document.SaveToFile(@"\output\ReplaceTextWithImage.docx", FileFormat.Docx2016);
document.Close();
}
}
}
以上は、正規表現を使用してWordドキュメント全体の指定したテキストを置換するVB.NETのコード例です。
特定の段落内のテキストを置換したり、テキストを画像に置き換えたりするなど、ほかの操作が必要な場合も、C#とVB.NETのコード変換ツールを使用すれば、C#のサンプルコードをVB.NETに変換できます。
まとめ
正規表現を活用することで、C#を使用してWordドキュメント内のテキストを効率的に置換できるだけでなく、指定した内容を画像に置き換えることもできます。テンプレートやレポート、個別にカスタマイズされたドキュメントの処理など、さまざまな場面で繰り返し作業を減らし、処理効率を向上させることができます。