
IronWordを使用してC#で記入可能なフォームテンプレートを作成する方法
何年もの間、個別にWordドキュメントを大規模に生成する必要がある.NETチームには、2つの実際的な選択肢があり、どちらも良くはありませんでした。
最初は、COMインタープロセスを通じてMicrosoft Word自体を自動化することでした。それは動作しましたが、動作しなくなるまで。 Wordインタープロセスは遅く、脆弱で、すべてのマシンでWordライセンスが必要で、Linuxコンテナ、Azure機能、またはWordがインストールされていないサーバー環境の内部で実行しようとした瞬間に壊れてしまいます。 それに挑戦したほとんどのチームはそれを再実装する羽目になりました。
2番目はカスタムの置換パイプラインで、.docxをXMLまたはテキストとして読み込み、プレースホルダーのトークンを実際の値に置き換え、結果を保存します。 それは単純なケースではうまく機能しましたが、開発者が想定する単純な{{FirstName}} トークンとはまったく異なる複雑なフィールド構造を使用する実際のWord文書では壊れてしまいました。
IronWordは現在、ネイティブでメールマージをサポートしています。 Microsoft Wordでデザインされたテンプレートは、Word自身が生成するマージフィールド構文を使用し、Wordのインストールなしで直接.NETコードからポピュレートされます。
この機能の説明
メールマージエンジンは、Wordが生成する両方のスタイルのマージフィールドを処理します:
- シンプルなフィールドは "FieldName" フォーマットで、これはテンプレートに直接
<<FieldName>>と入力することで得られます - 複雑なフィールドは、挿入 → クイックパーツ → フィールド経由で生成される複数要素のXML構造
テンプレートは、ドキュメントごとに1回置き換えられる単一値のプレースホルダーや、"TableStart:Name"及び"TableEnd:Name"マーカーで囲まれた繰り返し領域を含むことができ、これらはデータレコードごとに1行まで展開されます。
この第2の要素が、この機能がその居場所を得る理由です。 繰り返し領域は、請求書の1つのテンプレート行が50行のラインアイテム表に展開する方法や、ラベルシートの1つのコンタクトスロットがデータベースから取得されたフルのAveryグリッドになる方法です。
CRMからの個人化されたカバーレター
ほとんどのチームはまず営業業務を通じてメールマージを行います。 CRMは顧客記録を保持しています; マーケティングまたは営業部門は、個別化されたカバーレター、ウェルカムパケット、または更新通知を送る必要があります。 パターンは簡単です:1つのテンプレート、1顧客あたり1行、1つの個別化されたドキュメントのアウトプット。
// Template: "Dear «FirstName», thank you for your order of «Amount»..."
DataTable customers = LoadFromSalesforce(); // FirstName, LastName, Amount, ...
foreach (DataRow row in customers.Rows)
{
var doc = new WordDocument("cover-letter-template.docx");
doc.MailMerge.Execute(row);
doc.SaveAs($"letters/{row["LastName"]}.docx");
}Imports System.Data
' Template: "Dear «FirstName», thank you for your order of «Amount»..."
Dim customers As DataTable = LoadFromSalesforce() ' FirstName, LastName, Amount, ...
For Each row As DataRow In customers.Rows
Dim doc As New WordDocument("cover-letter-template.docx")
doc.MailMerge.Execute(row)
doc.SaveAs($"letters/{row("LastName")}.docx")
NextデータソースはDataTableであり、したがってSalesforce、HubSpot、SQL Server、CSV、APIレスポンスなど、何でも読み込めばマージソースとして使用できます。
繰り返しラインアイテムを持つ請求書
請求処理は繰り返し領域の能力がその価値を発揮する場所です。請求書テンプレートには、ヘッダー(顧客名、注文ID、日付)、ラインアイテム表の1行、及びフッター(合計)が含まれています。 マージが実行されると、単一のテンプレート行が、製品あたり1行に展開します。そのため、注文に1つのラインアイテムがあるか50あるかに関わらず同じです。
// Template:
// Bill To: «CustomerName» Order: «OrderId»
// ┌──────────┬─────┬──────────┐
// │ «TableStart:Items»«Product» │ «Qty» │ «LineTotal» «TableEnd:Items» │
// └──────────┴─────┴──────────┘
// Total: «Total»
var doc = new WordDocument("invoice-template.docx");
doc.MailMerge.ExecuteWithRegions(orderLineItems); // one row per product
doc.MailMerge.Execute(new Dictionary<string, string>
{
{ "CustomerName", "Acme Industries" },
{ "OrderId", "10444" },
{ "Total", "$1,117.71" },
});
doc.SaveAs("invoice-10444.docx");Imports System.Collections.Generic
' Template:
' Bill To: «CustomerName» Order: «OrderId»
' ┌──────────┬─────┬──────────┐
' │ «TableStart:Items»«Product» │ «Qty» │ «LineTotal» «TableEnd:Items» │
' └──────────┴─────┴──────────┘
' Total: «Total»
Dim doc As New WordDocument("invoice-template.docx")
doc.MailMerge.ExecuteWithRegions(orderLineItems) ' one row per product
doc.MailMerge.Execute(New Dictionary(Of String, String) From {
{"CustomerName", "Acme Industries"},
{"OrderId", "10444"},
{"Total", "$1,117.71"}
})
doc.SaveAs("invoice-10444.docx")このパターンは見積書、購入注文書、声明、及び変動長リストが固定形ページ内にあるすべてのドキュメントでも機能します。
Averyラベルシートと封筒
配送およびオペレーションチームは、連絡先リストからラベルと封筒を生成し、レイアウト(Avery 5160, 5161, 5163とその国際的な同等物)は数十年存在する標準テンプレートです。 IronWordはそれらを直接入力します:ラベルグリッドの各セルが単一のAPIコールから適切な連絡先を取得します。
// Template: a 3×10 Avery 5160 grid, each cell has «CONTACT_FULLNAME» / «CONTACT_ADDRESS»
var doc = new WordDocument("avery-5160.docx");
doc.MailMerge.Execute(new Dictionary<string, string>
{
{ "CONTACT_FULLNAME", "Jane Doe" },
{ "CONTACT_ADDRESS", "100 Main Street, Boston, MA 02108" },
});
doc.SaveAs("labels-jane.docx");Imports System.Collections.Generic
' Template: a 3×10 Avery 5160 grid, each cell has «CONTACT_FULLNAME» / «CONTACT_ADDRESS»
Dim doc As New WordDocument("avery-5160.docx")
doc.MailMerge.Execute(New Dictionary(Of String, String) From {
{"CONTACT_FULLNAME", "Jane Doe"},
{"CONTACT_ADDRESS", "100 Main Street, Boston, MA 02108"}
})
doc.SaveAs("labels-jane.docx")可変長の連絡先リストの場合、請求書の例からのExecuteWithRegionsパターンが適用されます:1つのセルを繰り返し単位として定義し、シートの残りが自動的に埋められます。
マルチリージョンレポート
最も強力なアプリケーションはマルチリージョンレポートです。 四半期の要約には、それぞれ独自のデータテーブルによって駆動される"トップ顧客"および"トップ製品"セクションが含まれるかもしれません。 複数のテーブルを含むDataSetを使用すれば、マージが両方の領域を単一のコールで展開します。
// Template:
// Top Customers
// «TableStart:Customers» • «Name» | «City» | «Revenue» «TableEnd:Customers»
// Top Products
// «TableStart:Products» «ProductName»: «Revenue» «TableEnd:Products»
var ds = new DataSet();
ds.Tables.Add(topCustomers); // TableName = "Customers"
ds.Tables.Add(topProducts); // TableName = "Products"
var doc = new WordDocument("quarterly-report.docx");
doc.MailMerge.ExecuteWithRegions(ds); // expands both regions
doc.MailMerge.Execute(new Dictionary<string, string>
{
{ "CompanyName", "Iron Software" },
{ "ReportDate", "Q2 2026" },
});
doc.SaveAs("Q2-2026-report.docx");Imports System.Data
Imports System.Collections.Generic
' Template:
' Top Customers
' «TableStart:Customers» • «Name» | «City» | «Revenue» «TableEnd:Customers»
' Top Products
' «TableStart:Products» «ProductName»: «Revenue» «TableEnd:Products»
Dim ds As New DataSet()
ds.Tables.Add(topCustomers) ' TableName = "Customers"
ds.Tables.Add(topProducts) ' TableName = "Products"
Dim doc As New WordDocument("quarterly-report.docx")
doc.MailMerge.ExecuteWithRegions(ds) ' expands both regions
doc.MailMerge.Execute(New Dictionary(Of String, String) From {
{"CompanyName", "Iron Software"},
{"ReportDate", "Q2 2026"}
})
doc.SaveAs("Q2-2026-report.docx")DataSet内の各DataTableは、その対応する"TableStart:..."領域と名前で一致し、スカラー・フィールドが同じパスでヘッダー値を埋めます。
これらのようなドキュメントワークフローを持つチームのために、クリーンな.NET実装を待っている場合、Iron SuiteはIronWordをIronPDF、IronOCR、IronXL、およびIronBarcodeとともに単一ライセンスでまとめています。
無料トライアルを始める、クレジットカードは不要です。
なぜこれがうまくいくのか
いくつかの点でこのアプローチは他の選択肢と異なります:
ネイティブWord構文。テンプレートはMicrosoft Wordでデザインされ、Wordがすでに提供しているマージフィールドツールを使用します。 .docxとして保存し、ファイルをIronWordに渡せばマージが実行されます。 独自のテンプレート言語、翻訳層、ドキュメントを設計するチームのための別の学習曲線はありません。
単純および複雑なフィールドフォーマットの両方。Wordがフィールドを挿入した方法に応じて、2つの異なるフィールド構造を生成します。 IronWordは両方に対応しているため、異なるチームメンバーによって異なる方法で設計された既存のテンプレートがすべて修正なしで動作します。
外部依存関係がありません。ライブラリは完全に.NET上で動作します。 Wordのインストールなし、COMなし、Officeライセンスなし、インタープロップのもろさなし。 Windowsの開発者マシンで動作する同じコードが、Linuxコンテナ、Azure Function、またはサーバーレスビルドエージェントで同じく動作します。
まとめ
メールマージは.NETのドキュメントツールスペースで長らくギャップとなっており、別通りの回避策はうまく歳を重ねませんでした。 IronWordのネイティブメールマージは、Wordのマージフィールド構文をミラーリングするモデルでそのギャップを埋め、単純な値と繰り返し領域をサポートし、ドキュメントの自動化に歴史的に伴ってきた展開荷物なしで実行されます。
請求書、ラベル、手紙、契約書、および報告書を大規模に生成するチームにとって、これは1つのテンプレートから数千の個別化されたドキュメントへの最もクリーンな道です。

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


