Word 文書のテキスト検索・置換は、文書編集において頻繁に必要となる操作です。大量の文書を扱う場合、手動で編集するのは時間がかかり、見落としも発生しがちです。C++ でプログラム的に処理できれば、こうした作業を自動化できます。
本記事では、Spire.Doc for C++ を使用して、C++ で Word 文書内のテキストを検索・置換する方法を紹介します。Spire.Doc for C++ は、Microsoft Office がインストールされていない環境でも Word 文書の作成・編集・変換を行える、独立した C++ ライブラリです。
環境構築
Spire.Doc for C++ をプロジェクトに導入するには、主に以下の2つの方法があります。
-
NuGet 経由でのインストール(推奨): Visual Studio の「NuGet パッケージの管理」から
spire.doc.cppを検索してインストールします。 - 手動でのライブラリ追加: 公式サイトからパッケージをダウンロードし、ヘッダーファイルとライブラリファイルを手動でプロジェクトに追加します。
導入後は、以下のようにヘッダーファイルをインクルードします。
#include "Spire.Doc.o.h"
基本的なテキスト置換(全インスタンスの置換)
Document->Replace() メソッドを使うと、指定したテキストをすべて検索し、別のテキストに一括置換できます。
#include "Spire.Doc.o.h"
using namespace Spire::Doc;
using namespace std;
int main()
{
// Documentクラスのインスタンスを初期化
intrusive_ptr<Document> document = new Document();
// Word文書をロード
document->LoadFromFile(L"Input.docx");
// 特定のテキストを検索し、すべてのインスタンスを別のテキストに置換
document->Replace(L"Spire.Doc", L"Eiceblue", false, true);
// 結果を保存
document->SaveToFile(L"ReplaceAllInstances.docx", FileFormat::Docx2013);
document->Close();
}
Replace メソッドの引数は以下の通りです。
- 第1引数:検索対象の文字列
- 第2引数:置換後の文字列
- 第3引数:大文字・小文字を区別するか (
trueで区別する) - 第4引数:単語全体に一致させるか (
trueで単語全体に一致)
最初のインスタンスのみを置換する
すべてではなく最初に見つかったテキストだけを置換したい場合もあるでしょう。その場合は、SetReplaceFirst メソッドで置換モードを変更します。
#include "Spire.Doc.o.h"
using namespace Spire::Doc;
using namespace std;
int main()
{
intrusive_ptr<Document> document = new Document();
document->LoadFromFile(L"Input.docx");
// 最初に見つかったテキストのみを置換するモードに設定
document->SetReplaceFirst(true);
// 最初のインスタンスのみ置換
document->Replace(L"Spire.Doc", L"Eiceblue", false, true);
document->SaveToFile(L"ReplaceFirstInstance.docx", FileFormat::Docx2013);
document->Close();
}
正規表現を使ったテキスト置換
特定のパターンに一致するテキストを置換したい場合は、正規表現が便利です。Spire.Doc for C++ は Regex クラスを使ったパターンマッチングをサポートしています。
#include "Spire.Doc.o.h"
using namespace Spire::Doc;
using namespace std;
int main()
{
intrusive_ptr<Document> doc = new Document();
doc->LoadFromFile(L"Input.docx");
// 正規表現を作成(例:# で始まる単語にマッチ)
intrusive_ptr<Regex> regex = new Regex(L"\\#\\w+\\b");
// 正規表現にマッチするテキストを置換
doc->Replace(regex, L"Monitor");
doc->SaveToFile(L"ReplaceWithRegex.docx", FileFormat::Docx2013);
doc->Close();
}
この例では \#\w+\b という正規表現で「#」で始まる単語を検索し、「Monitor」に置換しています。日付や製品コードなど、特定の書式パターンを持つテキストを一括変換する際に役立ちます。
テキストを画像に置換する
テキストを画像に置き換えたいケースもあるでしょう。Spire.Doc for C++ にはテキストを画像に直接置換するメソッドは用意されていませんが、テキスト位置に画像を挿入し、元のテキストを削除することで実現できます。
#include "Spire.Doc.o.h"
using namespace Spire::Doc;
using namespace std;
int main()
{
intrusive_ptr<Document> doc = new Document();
doc->LoadFromFile(L"Input.docx");
// 文書内の特定テキストをすべて検索
vector<intrusive_ptr<TextSelection>> selections =
doc->FindAllString(L"Spire.Doc", true, true);
int index = 0;
intrusive_ptr<TextRange> range = nullptr;
// 検索結果をループ処理
for (auto selection : selections)
{
// 画像をロード
intrusive_ptr<DocPicture> pic = new DocPicture(doc);
pic->LoadImage(L"img.jpg");
// 見つかったテキストを単一のテキスト範囲として取得
range = selection->GetAsOneRange();
// 段落内での位置を取得
index = range->GetOwnerParagraph()
->GetChildObjects()->IndexOf(range);
// テキスト位置に画像を挿入
range->GetOwnerParagraph()
->GetChildObjects()->Insert(index, pic);
// 元のテキスト範囲を削除
range->GetOwnerParagraph()
->GetChildObjects()->Remove(range);
}
doc->SaveToFile(L"ReplaceWithImage.docx", FileFormat::Docx2013);
doc->Close();
}
このテクニックは、ドキュメント内のプレースホルダーテキストをロゴやバッジなどの画像に置き換える際に応用できます。
注意点
- 本ライブラリは Microsoft Office のインストールを必要としませんが、商用利用の場合はライセンスが必要です。利用前にライセンス条項を確認してください。
- 大規模な文書を処理する場合、メモリ使用量に注意が必要です。不要になったオブジェクトは適切に破棄しましょう。
- 日本語を含むマルチバイト文字を扱う場合、ソースファイルの文字エンコーディング設定に留意してください。
まとめ
本記事では、Spire.Doc for C++ を用いて Word 文書内のテキストを検索・置換する方法をいくつか紹介しました。具体的には、Document->Replace() による全インスタンスの一括置換、SetReplaceFirst(true) による最初のインスタンスのみの置換、Regex クラスを用いた正規表現によるパターンマッチ置換、そしてテキスト範囲を取得して画像に差し替える応用的な方法の4つを扱っています。いずれも対象の文字列や正規表現パターンを指定する形で実装でき、文書処理の自動化に応用できます。実際のプロジェクトで利用する際は、商用ライセンスの要否やマルチバイト文字のエンコーディングに注意してください。