How to Mail Merge Word Documents in C

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronWordは、Wordテンプレートに含まれるDataSetオブジェクト、または繰り返し領域のテーブルから取得したデータで埋めることにより、C#でメールマージを行います。Microsoft Office Interopを使用せずに、Microsoft Wordまたは互換性のあるツールで作成されたマージフィールドが自動的に検出されます。

メールマージは、スケールでパーソナライズされた文書を生成する標準的な方法です。同じテンプレートを共有しつつ受取人ごとに異なる形式の手紙、請求書、証明書、契約およびレポートを作成します。 各文書を手作業で編集する代わりに、マージフィールドを含む単一の.docxテンプレートを作成し、IronWordにデータソースからそれらを埋めさせます。 すべての操作はWordDocument.MailMergeエントリーポイントを通じて行われます。

クイックスタート:Word文書をメールマージする

Executeに渡して結果を保存します。

  1. IronWord をNuGetパッケージマネージャでインストール

    PM > Install-Package IronWord
  2. このコード スニペットをコピーして実行します。

    WordDocument doc = new WordDocument("template.docx");
    doc.MailMerge.Execute(new Dictionary<string, string> { { "FirstName", "Jane" }, { "Company", "Acme Corp" } });
    doc.SaveAs("output.docx");
  3. 実際の環境でテストするためにデプロイする

    今日プロジェクトで IronWord を使い始めましょう無料トライアル

    arrow pointer


辞書からメールマージをするにはどうすればいいですか?

最も簡単なデータソースは、マージフィールド名によってキー付けされたIDictionary<string, string>です。 Executeはキーに一致する名前のフィールドすべてを置換します。

WordDocument doc = new WordDocument("template.docx");
doc.MailMerge.Execute(new Dictionary<string, string>
{
    { "FirstName", "Jane" },
    { "LastName",  "Smith" },
    { "Company",   "Acme Corp" }
});
doc.SaveAs("output.docx");
WordDocument doc = new WordDocument("template.docx");
doc.MailMerge.Execute(new Dictionary<string, string>
{
    { "FirstName", "Jane" },
    { "LastName",  "Smith" },
    { "Company",   "Acme Corp" }
});
doc.SaveAs("output.docx");
Dim doc As New WordDocument("template.docx")
doc.MailMerge.Execute(New Dictionary(Of String, String) From {
    {"FirstName", "Jane"},
    {"LastName", "Smith"},
    {"Company", "Acme Corp"}
})
doc.SaveAs("output.docx")
$vbLabelText   $csharpLabel

ヒントフィールド名のルックアップはデフォルトで大文字小文字を区別せず、Microsoft Wordと一致する)]} MailMerge.Options.CaseInsensitiveFieldNames = falseを設定して、大文字小文字の完全一致を要求します。

フィールド名と値の2つの並行するシーケンスを供給することもできます。

doc.MailMerge.Execute(
    new[] { "FirstName", "LastName" },
    new[] { "Jane", "Smith" });
doc.MailMerge.Execute(
    new[] { "FirstName", "LastName" },
    new[] { "Jane", "Smith" });
doc.MailMerge.Execute(  
    New String() { "FirstName", "LastName" },  
    New String() { "Jane", "Smith" })
$vbLabelText   $csharpLabel

ArgumentExceptionを投げます。

DataTableまたはDataRowからのメールマージはどうやって行いますか?

データがデータベースまたは既存のExecuteに渡します。 マージフィールド名は列名と一致しています。 Execute(DataRow)は行の親テーブルの列名を使用します。

DataTable table = new DataTable();
table.Columns.Add("FirstName");
table.Columns.Add("LastName");
DataRow row = table.NewRow();
row["FirstName"] = "Jane";
row["LastName"]  = "Smith";
table.Rows.Add(row);

WordDocument doc = new WordDocument("template.docx");
doc.MailMerge.Execute(row);
doc.SaveAs("output.docx");
DataTable table = new DataTable();
table.Columns.Add("FirstName");
table.Columns.Add("LastName");
DataRow row = table.NewRow();
row["FirstName"] = "Jane";
row["LastName"]  = "Smith";
table.Rows.Add(row);

WordDocument doc = new WordDocument("template.docx");
doc.MailMerge.Execute(row);
doc.SaveAs("output.docx");
Imports System.Data

Dim table As New DataTable()
table.Columns.Add("FirstName")
table.Columns.Add("LastName")
Dim row As DataRow = table.NewRow()
row("FirstName") = "Jane"
row("LastName") = "Smith"
table.Rows.Add(row)

Dim doc As New WordDocument("template.docx")
doc.MailMerge.Execute(row)
doc.SaveAs("output.docx")
$vbLabelText   $csharpLabel

繰り返しテーブル領域を埋めるにはどうすればよいですか?

繰り返し領域は、1つのテンプレート行を多くの行に変換し、請求書の明細項目や注文リストに最適です。 テンプレート内で、繰り返しコンテンツをTableEnd:RegionNameという名前の2つのマーカーフィールドの間に配置します。 次に、テーブルの一致する行ごとに領域のコンテンツを繰り返すExecuteWithRegionsを呼び出します。

DataTableを受け入れます。

DataTable orders = new DataTable("Orders");
orders.Columns.Add("Item");
orders.Columns.Add("Qty");
orders.Rows.Add("Widget A", "3");
orders.Rows.Add("Widget B", "1");

DataSet ds = new DataSet();
ds.Tables.Add(orders);

WordDocument doc = new WordDocument("invoice-template.docx");
doc.MailMerge.ExecuteWithRegions(ds);
doc.MailMerge.Execute(new Dictionary<string, string> { { "CustomerName", "Jane Smith" } });
doc.SaveAs("invoice.docx");
DataTable orders = new DataTable("Orders");
orders.Columns.Add("Item");
orders.Columns.Add("Qty");
orders.Rows.Add("Widget A", "3");
orders.Rows.Add("Widget B", "1");

DataSet ds = new DataSet();
ds.Tables.Add(orders);

WordDocument doc = new WordDocument("invoice-template.docx");
doc.MailMerge.ExecuteWithRegions(ds);
doc.MailMerge.Execute(new Dictionary<string, string> { { "CustomerName", "Jane Smith" } });
doc.SaveAs("invoice.docx");
Imports System.Data
Imports System.Collections.Generic

Dim orders As New DataTable("Orders")
orders.Columns.Add("Item")
orders.Columns.Add("Qty")
orders.Rows.Add("Widget A", "3")
orders.Rows.Add("Widget B", "1")

Dim ds As New DataSet()
ds.Tables.Add(orders)

Dim doc As New WordDocument("invoice-template.docx")
doc.MailMerge.ExecuteWithRegions(ds)
doc.MailMerge.Execute(New Dictionary(Of String, String) From {{"CustomerName", "Jane Smith"}})
doc.SaveAs("invoice.docx")
$vbLabelText   $csharpLabel

ご注意ExecuteWithRegionsは繰り返し領域のみを埋めます。 領域外の標準的なマージフィールドも埋めるためには、上記のように領域を展開した後にExecute(...)を呼び出します。

テンプレートのマージフィールドを調べるにはどうすればよいですか?

マージする前に、テンプレートの内容を調査することができます。これはテンプレートを検証したり、データソースを動的に構築するために役立ちます。

  • GetFieldNames()はドキュメント順で重複しないすべての値型マージフィールドの名前を返します。
  • TableStart領域の名前を返します。
  • MergeFieldオブジェクトとして返します。
WordDocument doc = new WordDocument("template.docx");
IReadOnlyList<string> fieldNames = doc.MailMerge.GetFieldNames();
IReadOnlyList<string> regionNames = doc.MailMerge.GetRegionNames();
// fieldNames:  ["FirstName", "LastName", "Company"]
// regionNames: ["Orders", "LineItems"]
WordDocument doc = new WordDocument("template.docx");
IReadOnlyList<string> fieldNames = doc.MailMerge.GetFieldNames();
IReadOnlyList<string> regionNames = doc.MailMerge.GetRegionNames();
// fieldNames:  ["FirstName", "LastName", "Company"]
// regionNames: ["Orders", "LineItems"]
Dim doc As New WordDocument("template.docx")
Dim fieldNames As IReadOnlyList(Of String) = doc.MailMerge.GetFieldNames()
Dim regionNames As IReadOnlyList(Of String) = doc.MailMerge.GetRegionNames()
' fieldNames:  ["FirstName", "LastName", "Company"]
' regionNames: ["Orders", "LineItems"]
$vbLabelText   $csharpLabel

Kindを公開します。

未一致フィールドとヌル値を制御するにはどうすればよいですか?

マージ動作はMailMerge.Optionsを通じて設定されます:

オプション Default 動作
RemoveUnusedFields true データソースに一致するキーがないマージフィールドを削除します。 その場に残すためにfalseに設定します。
RemoveUnusedRegions true データソースに一致するテーブルがないTableEnd領域を削除します。
NullValueReplacement "" データソースがフィールドにnull値を提供する場合に代わりに使われるテキスト。
CaseInsensitiveFieldNames true フィールド名の一致時に大文字小文字を無視し、Microsoft Wordの動作に一致します。
WordDocument doc = new WordDocument("template.docx");
doc.MailMerge.Options.RemoveUnusedFields = false;
doc.MailMerge.Execute(new Dictionary<string, string> { { "FirstName", "Jane" } });
doc.SaveAs("partial-output.docx");
WordDocument doc = new WordDocument("template.docx");
doc.MailMerge.Options.RemoveUnusedFields = false;
doc.MailMerge.Execute(new Dictionary<string, string> { { "FirstName", "Jane" } });
doc.SaveAs("partial-output.docx");
Dim doc As New WordDocument("template.docx")
doc.MailMerge.Options.RemoveUnusedFields = False
doc.MailMerge.Execute(New Dictionary(Of String, String) From {{"FirstName", "Jane"}})
doc.SaveAs("partial-output.docx")
$vbLabelText   $csharpLabel

データソースなしでの単純な値置換については、Word文書内のテキストを置換する方法を参照してください。

よくある質問

C#でWord文書をメールマージする方法

WordDocumentコンストラクタでMERGEFIELDプレースホルダを含むWordテンプレートを読み込み、その後、名前がキーやカラムに一致する各フィールドを置換するためにdoc.MailMerge.Executeを辞書、DataTable、またはDataRowとともに呼び出し、SaveAsで結果を保存します。Microsoft Wordで作成されたマージフィールドは自動的に検出され、Microsoft Officeのインストールは必要ありません。

IronWordが使用できるデータソースはどれですか?

MailMerge.Executeはフィールド名と値のIDictionary、フィールド名と値の2つの平行シーケンス、DataTable(最初の行を使用)、またはDataRow(親テーブルのカラムを使用)を受け入れます。MailMerge.ExecuteWithRegionsは繰り返しテーブル領域を展開するためにDataSetまたはDataTableを受け入れます。

Wordメールマージで繰り返しテーブル領域をどうやって埋めますか?

テンプレートの繰り返しコンテンツをTableStart:RegionNameとTableEnd:RegionNameマージフィールド間に包み、DataSetまたはDataTableでMailMerge.ExecuteWithRegionsを呼び出します。領域の内容は一致するテーブルの各行ごとに繰り返されます。ExecuteWithRegionsは領域のみを埋めるため、その後に標準のマージフィールドを埋めるためにExecuteを呼び出します。

マージ前にテンプレートのマージフィールドを検査できますか?

はい。MailMerge.GetFieldNamesは文書順に値スタイルのフィールド名を返し、GetRegionNamesはTableStart領域名を返し、GetFieldsは各フィールドの名前、指示、種類(Value、TableStart、TableEnd、NextRecord)、RegionNameを公開するMergeFieldオブジェクトを返します。

データと一致しないマージフィールドはどうなりますか?

デフォルトではMailMergeOptions.RemoveUnusedFieldsはtrueであり、データソースに一致するキーがないフィールドは出力から削除されます。falseに設定するとそれらを残します。RemoveUnusedRegionsがtrueの場合、一致しないTableStart/TableEnd領域は削除され、null値はNullValueReplacement文字列で置換されます。

メールマージフィールドの一致は大文字小文字を区別しますか?

いいえ。フィールド名の検索はデフォルトで大文字小文字を区別せず、Microsoft Wordの動作に一致します。MailMerge.Options.CaseInsensitiveFieldNamesをfalseに設定すれば、大文字小文字は一致します。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

準備はできましたか?
Nuget ダウンロード 48,355 | バージョン: 2026.7 リリースされたばかり
Still Scrolling Icon

まだスクロールしていますか?

すぐに証拠が欲しいですか? PM > Install-Package IronWord
サンプルを実行する あなたのデータが Word ドキュメントになるのを見る。