Comment créer des modèles de formulaires remplissables en C# à l'aide d'IronWord
Pendant des années, les équipes .NET qui avaient besoin de générer des documents Word personnalisés à grande échelle n'avaient que deux options réelles, et aucune n'était bonne.
La première était d'automatiser Microsoft Word lui-même via l'interop COM. Cela fonctionnait jusqu'à ce que ça ne marche plus. L'interop Word est lent, fragile, nécessite une licence Word sur chaque machine, et s'effondre dès que vous essayez de l'exécuter dans un conteneur Linux, une fonction Azure ou tout autre environnement serveur où Word n'est pas installé. La plupart des équipes qui ont essayé ont fini par le réécrire.
La seconde était un pipeline personnalisé de recherche et remplacement. Lisez le fichier .docx comme XML ou comme texte, remplacez les tokens de placeholder par des valeurs réelles, et sauvegardez le résultat. Cela fonctionnait pour des cas simples et se cassait sur de vrais documents Word, qui utilisent des structures de champs complexes qui ne ressemblent en rien aux simples {{FirstName}} tokens que les développeurs s'attendent à trouver.
IronWord prend désormais en charge la fusion de courrier de manière native. Les modèles conçus dans Microsoft Word, utilisant la même syntaxe de champ de fusion que Word génère lui-même, sont peuplés directement à partir du code .NET sans installation de Word nécessaire.
Ce que la fonctionnalité fait
Le moteur de fusion de courrier gère les deux styles de champ de fusion que Word génère :
- Champs simples, au format "NomChamp", qui est ce que vous obtenez en tapant <
> directement dans le modèle - Champs complexes, la structure XML multi-élément que Word génère via Insérer → Quick Parts → Field
Les modèles peuvent inclure des placeholders à valeur unique qui sont remplacés une fois par document, et des régions répétitives délimitées par les marqueurs "TableStart:Nom" et "TableEnd:Nom", qui se développent en une ligne par enregistrement de données.
La deuxième partie est là où la fonctionnalité trouve sa place. Les régions répétitives sont la manière dont une seule ligne de modèle dans une facture se déploie en une table d'éléments de ligne de 50 lignes, ou comment un emplacement de contact dans une feuille d'étiquettes devient une grille Avery complète alimentée par une base de données.
Des lettres de motivation personnalisées à partir d'un CRM
La plupart des équipes utilisent d'abord la fusion de courrier par le biais des opérations de vente. Le CRM contient des enregistrements clients ; les opérations marketing ou de vente doivent envoyer des lettres d'accompagnement personnalisées, des packs de bienvenue, ou des avis de renouvellement. Le schéma est simple : un modèle, une ligne par client, un document personnalisé en sortie.
// 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");
}
// 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
La source de données est un DataTable, ce qui signifie que tout ce qui se charge dans un (Salesforce, HubSpot, SQL Server, un CSV, une réponse d'API) devient une source de fusion de courrier sans code adaptateur supplémentaire.
Factures avec éléments de ligne répétitifs
La facturation est là où la capacité de région répétitive trouve son utilité. Un modèle de facture a un en-tête (nom du client, ID de commande, dates), une ligne dans une table d'éléments de ligne, et un pied de page (totaux). Lorsque la fusion s'exécute, la ligne de modèle unique s'élargit à une ligne par produit, que la commande ait un élément de ligne ou cinquante.
// 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");
// 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")
Le même schéma fonctionne pour les devis, les bons de commande, les relevés, et tout document où une liste de longueur variable se trouve à l'intérieur d'une page de forme fixe.
Feuilles d'étiquettes Avery et enveloppes
Les équipes d'expédition et d'opérations génèrent des étiquettes et des enveloppes à partir de listes de contacts, et les mises en page (Avery 5160, 5161, 5163, et leurs équivalents internationaux) sont des modèles standardisés qui existent depuis des décennies. IronWord les remplit directement : chaque cellule de la grille d'étiquettes récupère le contact approprié à partir d'un seul appel 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");
// 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")
Pour les listes de contacts à longueur variable, le modèle ExecuteWithRegions de l'exemple de facture s'applique : définissez une cellule comme l'unité répétitive, et le reste de la feuille se remplit automatiquement.
Rapports multi-régions
L'application la plus puissante est les rapports multi-régions. Un résumé trimestriel pourrait inclure des sections "Clients Principaux" et "Produits Principaux", chacune alimentée par sa propre table de données. Avec un DataSet contenant plusieurs tables, la fusion étend les deux régions en un seul appel.
// 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");
// 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")
Chaque DataTable du DataSet s'aligne avec sa région correspondante "TableStart:..." par nom, et les champs scalaires remplissent les valeurs d'en-tête dans la même passe.
Pour les équipes avec des flux de travail de documents comme celui-ci en attente d'une mise en œuvre .NET propre, Iron Suite regroupe IronWord aux côtés de IronPDF, IronOCR, IronXL, et IronBarcode dans une licence unique.
Commencez un essai gratuit, aucune carte de crédit requise.
Pourquoi ça fonctionne
Quelques éléments distinguent cette approche des alternatives :
Syntaxe Word native. Les modèles sont conçus dans Microsoft Word, en utilisant les outils de champ de fusion que Word fournit déjà. Enregistrez en .docx, confiez le fichier à IronWord, et la fusion fonctionne. Aucun langage de modèle propriétaire, aucune couche de traduction, aucune courbe d'apprentissage distincte pour l'équipe qui conçoit les documents.
Formats de champs simples et complexes. Word produit deux structures de champs distinctes selon la façon dont le champ a été inséré. IronWord gère les deux, ce qui signifie que les modèles existants conçus par différents membres de l'équipe de différentes manières fonctionnent tous sans modification.
Aucune dépendance externe. La bibliothèque fonctionne entièrement sur .NET. Pas de Word installé, pas de COM, pas de licence Office, pas de fragilité interop. Le même code qui s'exécute sur une machine de développeur Windows fonctionne identiquement dans un conteneur Linux, une fonction Azure, ou un agent de construction sans serveur.
Résumé
La fusion de courrier a été une lacune de longue date dans l'espace outillage de documents .NET, et les solutions de contournement n'ont pas bien vieilli. La fusion de courrier native d'IronWord comble cette lacune avec un modèle qui reflète la syntaxe de champ de fusion de Word lui-même, prend en charge les valeurs simples et les régions répétitives, et fonctionne sans aucun des bagages de déploiement qui ont historiquement accompagné l'automatisation des documents dans .NET.
Pour les équipes générant des factures, des étiquettes, des lettres, des contrats, et des rapports à grande échelle, c'est le chemin le plus propre d'un modèle unique à des milliers de documents personnalisés.
Questions Fréquemment Posées
Qu'est-ce que la fusion et publipostage IronWord ?
La fusion et publipostage IronWord est une fonctionnalité qui vous permet de générer des documents Word personnalisés à partir d'applications .NET sans nécessiter d'installation de Microsoft Word.
IronWord Mail Merge peut-il générer des documents à grande échelle ?
Oui, IronWord Mail Merge est conçu pour gérer la génération de documents Word personnalisés à grande échelle, ce qui le rend idéal pour le traitement par lots massif.
Est-ce que Microsoft Word est requis pour utiliser IronWord Mail Merge ?
Non, IronWord Mail Merge ne nécessite pas l'installation de Microsoft Word, permettant une expérience de génération de documents fluide dans les applications .NET.
Quels types de documents peuvent être générés à l'aide de IronWord Mail Merge ?
IronWord Mail Merge peut générer une variété de documents, y compris des factures, des lettres, des étiquettes et des rapports à l'aide de modèles Word.
Comment IronWord Mail Merge s'intègre-t-il avec .NET ?
IronWord Mail Merge est pris en charge nativement dans .NET, offrant aux développeurs une manière simple et efficace de mettre en œuvre la fonctionnalité de publipostage dans leurs applications.
Quels sont les avantages d'utiliser IronWord Mail Merge par rapport aux méthodes traditionnelles ?
Utiliser IronWord Mail Merge élimine le besoin de Microsoft Word, réduit la dépendance aux logiciels tiers et offre une solution évolutive pour générer des documents à partir des applications .NET.
IronWord Mail Merge peut-il être utilisé pour générer des rapports ?
Oui, IronWord Mail Merge peut être utilisé pour générer des rapports détaillés à partir de modèles Word, le rendant polyvalent pour divers besoins de documentation.
IronWord Mail Merge est-il adapté à la génération automatisée de documents ?
Oui, IronWord Mail Merge est idéal pour la génération automatisée de documents, permettant aux développeurs de créer des documents personnalisés de manière programmatique dans leurs applications .NET.



