How to Mail Merge Word Documents in C
IronWordは、Wordテンプレートに含まれるDataSetオブジェクト、または繰り返し領域のテーブルから取得したデータで埋めることにより、C#でメールマージを行います。Microsoft Office Interopを使用せずに、Microsoft Wordまたは互換性のあるツールで作成されたマージフィールドが自動的に検出されます。
メールマージは、スケールでパーソナライズされた文書を生成する標準的な方法です。同じテンプレートを共有しつつ受取人ごとに異なる形式の手紙、請求書、証明書、契約およびレポートを作成します。 各文書を手作業で編集する代わりに、マージフィールドを含む単一の.docxテンプレートを作成し、IronWordにデータソースからそれらを埋めさせます。 すべての操作はWordDocument.MailMergeエントリーポイントを通じて行われます。
クイックスタート:Word文書をメールマージする
Executeに渡して結果を保存します。
-
IronWord をNuGetパッケージマネージャでインストール
-
このコード スニペットをコピーして実行します。
WordDocument doc = new WordDocument("template.docx"); doc.MailMerge.Execute(new Dictionary<string, string> { { "FirstName", "Jane" }, { "Company", "Acme Corp" } }); doc.SaveAs("output.docx"); -
実際の環境でテストするためにデプロイする
今日プロジェクトで IronWord を使い始めましょう無料トライアル
最小限のワークフロー(5ステップ)
- NuGetからWordメールマージ用のC#ライブラリをダウンロードします
MERGEFIELDプレースホルダーを含むWordテンプレートを作成しますWordDocumentコンストラクタでテンプレートを読み込みます- データソースで
MailMerge.ExecuteまたはMailMerge.ExecuteWithRegionsを呼び出します - 埋め込まれた文書を保存
辞書からメールマージをするにはどうすればいいですか?
最も簡単なデータソースは、マージフィールド名によってキー付けされた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")
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" })
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")
繰り返しテーブル領域を埋めるにはどうすればよいですか?
繰り返し領域は、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")
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"]
各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")
データソースなしでの単純な値置換については、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に設定すれば、大文字小文字は一致します。

