Zum Fußzeileninhalt springen
IRONWORD VERWENDEN

Wie man ausfüllbare Formularvorlagen in C# mit IronWord erstellt

Jahrelang hatten .NET-Teams, die personalisierte Word-Dokumente in großem Maßstab erstellen wollten, zwei echte Optionen, und keine war gut.

Die erste Möglichkeit bestand darin, Microsoft Word selbst über COM-Interop zu automatisieren. Es funktionierte, bis es das nicht mehr tat. Word-Interop ist langsam, fragil, erfordert eine Word-Lizenz auf jedem Rechner und bricht zusammen in dem Moment, in dem Sie versuchen, es in einem Linux-Container, einer Azure-Funktion oder jeder Serverumgebung auszuführen, in der Word nicht installiert ist. Die meisten Teams, die es versucht haben, endeten damit, es zu umgehen.

Die zweite Möglichkeit war eine benutzerdefinierte Suchen-und-Ersetzen-Pipeline. Lesen Sie die .docx als XML oder als Text, tauschen Sie Platzhalter-Token gegen echte Werte aus und speichern Sie das Ergebnis. Das funktionierte in einfachen Fällen und brach bei realen Word-Dokumenten, die komplexe Feldstrukturen verwenden, die nichts mit den einfachen {{FirstName}}-Tokens zu tun haben, die Entwickler zu finden erwarten.

IronWord unterstützt jetzt das Seriendruckverfahren nativ. Vorlagen, die in Microsoft Word entworfen wurden und die gleiche Seriendruckfeld-Syntax verwenden, die Word selbst erzeugt, werden direkt aus .NET-Code befüllt, ohne dass eine Word-Installation erforderlich ist.

Was die Funktion macht

Die Seriendruck-Engine verarbeitet beide Arten von Seriendruckfeldern, die Word erzeugt:

  • Einfache Felder im "Feldname"-Format, die man erhält, wenn man <> direkt in die Vorlage tippt
  • Komplexe Felder, die mehrteilige XML-Struktur, die Word durch Einfügen → Schnellbausteine → Feld erzeugt

Vorlagen können Einzelwert-Platzhalter enthalten, die einmal pro Dokument ersetzt werden, und wiederholende Bereiche, begrenzt durch "Tabellenanfang:Name" und "Tabellenende:Name"-Markierungen, die sich zu einer Zeile pro Datensatz erweitern.

Das zweite Element verleiht der Funktion ihren Mehrwert. Wiederholungsbereiche sind die Methode, wie eine einzelne Template-Zeile in einer Rechnung sich zu einer 50-Zeilen-Artikelpositionstabelle erweitert oder wie ein Kontaktslot in einem Etikettenblatt aus einer Datenbank zu einem vollständigen Avery-Raster wird.

Personalisierte Anschreiben aus einem CRM

Die meisten Teams nutzen den Seriendruck zuerst durch Verkaufsoperationen. Das CRM hält Kundendaten; Marketing oder Verkaufsoperationen müssen personalisierte Anschreiben, Willkommenspakete oder Erneuerungsmitteilungen senden. Das Muster ist einfach: Eine Vorlage, eine Zeile pro Kunde, ein personalisiertes Dokument entsteht.

// Template: "Dear &laquo;FirstName&raquo;, thank you for your order of &laquo;Amount&raquo;..."
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 &laquo;FirstName&raquo;, thank you for your order of &laquo;Amount&raquo;..."
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
$vbLabelText   $csharpLabel

Die Datenquelle ist ein DataTable, was bedeutet, dass alles, was in eine DataTable geladen werden kann (Salesforce, HubSpot, SQL Server, eine CSV, eine API-Antwort), zur Seriendruckquelle wird, ohne dass zusätzlicher Adapter-Code erforderlich ist.

Rechnungen mit wiederkehrenden Positionen

Das Rechnungswesen ist, wo die Fähigkeit zur Wiederholungsbereich ihre Stärken zeigt. Eine Rechnungsvorlage hat einen Kopfbereich (Kundenname, Bestell-ID, Daten), eine Zeile in einer Artikelpositionstabelle und einen Fußbereich (Summen). Wenn der Seriendruck abläuft, erweitert sich die Ein-Template-Zeile zu einer Zeile pro Produkt, unabhängig davon, ob die Bestellung eine Artikelposition oder fünfzig umfasst.

// Template:
//   Bill To: &laquo;CustomerName&raquo;  Order: &laquo;OrderId&raquo;
//   ┌──────────┬─────┬──────────┐
//   │ &laquo;TableStart:Items&raquo;&laquo;Product&raquo; │ &laquo;Qty&raquo; │ &laquo;LineTotal&raquo; &laquo;TableEnd:Items&raquo; │
//   └──────────┴─────┴──────────┘
//   Total: &laquo;Total&raquo;

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: &laquo;CustomerName&raquo;  Order: &laquo;OrderId&raquo;
//   ┌──────────┬─────┬──────────┐
//   │ &laquo;TableStart:Items&raquo;&laquo;Product&raquo; │ &laquo;Qty&raquo; │ &laquo;LineTotal&raquo; &laquo;TableEnd:Items&raquo; │
//   └──────────┴─────┴──────────┘
//   Total: &laquo;Total&raquo;

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")
$vbLabelText   $csharpLabel

Das gleiche Muster funktioniert für Angebote, Bestellungen, Kontoauszüge und jedes Dokument, bei dem eine variable Anzahl von Elementen in eine festgeformte Seite integriert ist.

Avery Etikettenblätter und Umschläge

Versand- und Betriebsteams erstellen Etiketten und Umschläge aus Kontaktlisten, und die Layouts (Avery 5160, 5161, 5163 und deren internationale Äquivalente) sind standardisierte Vorlagen, die es seit Jahrzehnten gibt. IronWord füllt sie direkt aus: Jede Zelle im Etikettengraster nimmt den entsprechenden Kontakt aus einem einzigen API-Aufruf auf.

// Template: a 3&times;10 Avery 5160 grid, each cell has &laquo;CONTACT_FULLNAME&raquo; / &laquo;CONTACT_ADDRESS&raquo;
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&times;10 Avery 5160 grid, each cell has &laquo;CONTACT_FULLNAME&raquo; / &laquo;CONTACT_ADDRESS&raquo;
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")
$vbLabelText   $csharpLabel

Für Kontaktlisten mit variabler Länge gilt das ExecuteWithRegions-Muster aus dem Rechnung-Beispiel: Definieren Sie eine Zelle als wiederkehrende Einheit, und der Rest des Blattes füllt sich automatisch.

Multi-Region-Berichte

Die leistungsstärkste Anwendung sind Multi-Region-Berichte. Ein Quartalsbericht könnte "Top Kunden" und "Top Produkte" Abschnitte enthalten, die jeweils von einer eigenen Tabelle angetrieben werden. Mit einem Dataset, das mehrere Tabellen enthält, dehnt der Seriendruck beide Regionen in einem einzigen Aufruf aus.

// Template:
//   Top Customers
//   &laquo;TableStart:Customers&raquo; &bull; &laquo;Name&raquo; | &laquo;City&raquo; | &laquo;Revenue&raquo; &laquo;TableEnd:Customers&raquo;
//   Top Products
//   &laquo;TableStart:Products&raquo;  &laquo;ProductName&raquo;: &laquo;Revenue&raquo;     &laquo;TableEnd:Products&raquo;

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
//   &laquo;TableStart:Customers&raquo; &bull; &laquo;Name&raquo; | &laquo;City&raquo; | &laquo;Revenue&raquo; &laquo;TableEnd:Customers&raquo;
//   Top Products
//   &laquo;TableStart:Products&raquo;  &laquo;ProductName&raquo;: &laquo;Revenue&raquo;     &laquo;TableEnd:Products&raquo;

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")
$vbLabelText   $csharpLabel

Jede DataTable im DataSet entspricht ihrer entsprechenden "TabelleAnfang:..." Region nach Namen, und die Skalarfelder füllen die Kopfbereichswerte im gleichen Durchgang.

Für Teams mit solchen Dokument-Workflows, die auf eine saubere .NET-Implementierung warten, bündelt die Iron Suite IronWord zusammen mit IronPDF, IronOCR, IronXL und IronBarcode in einer einzigen Lizenz.

Starten Sie eine kostenlose Testversion, keine Kreditkarte erforderlich.

Warum das funktioniert

Einige Dinge unterscheiden diesen Ansatz von den Alternativen:

Native Word-Syntax. Vorlagen werden in Microsoft Word entworfen, unter Verwendung der Seriendruckfeld-Tools, die Word bereits bereitstellt. Speichern als .docx, übergeben Sie die Datei an IronWord, und der Seriendruck läuft. Keine proprietäre Vorlagensprache, keine Übersetzungsschicht, keine separate Lernkurve für das Team, das die Dokumente entwirft.

Sowohl einfache als auch komplexe Feldformate. Word erzeugt zwei verschiedene Feldstrukturen, je nachdem, wie das Feld eingefügt wurde. IronWord verarbeitet beide, was bedeutet, dass bestehende Vorlagen, die von verschiedenen Teammitgliedern auf unterschiedliche Weise entworfen wurden, alle ohne Änderung funktionieren.

Keine externen Abhängigkeiten. Die Bibliothek läuft vollständig auf .NET. Keine Word-Installation, kein COM, keine Office-Lizenz, keine Interop-Instabilität. Der gleiche Code, der auf einer Windows-Entwickler-Maschine läuft, läuft identisch in einem Linux-Container, in einer Azure-Funktion oder in einem serverlosen Build-Agent.

Zusammenfassung

Seriendruck war eine lange bestehende Lücke im .NET-Dokumenten-Tooling-Bereich, und die Umgehungsmöglichkeiten sind nicht gut gealtert. IronWord's nativer Seriendruck schließt diese Lücke mit einem Modell, das Words eigene Seriendruckfeld-Syntax spiegelt, unterstützt sowohl einfache Werte als auch wiederholende Bereiche und läuft ohne das Bereitstellungsgepäck, das historisch mit Dokumentenautomatisierung in .NET einherging.

Für Teams, die Rechnungen, Etiketten, Briefe, Verträge und Berichte in großem Maßstab generieren, ist dies der sauberste Weg von einer einzigen Vorlage zu Tausenden personalisierten Dokumenten.

Häufig gestellte Fragen

Was ist IronWord-Serienbrief?

IronWord-Serienbrief ist eine Funktion, mit der Sie personalisierte Word-Dokumente aus .NET-Anwendungen erstellen können, ohne dass eine Microsoft Word-Installation erforderlich ist.

Kann IronWord-Serienbrief Dokumente im großen Maßstab erzeugen?

Ja, IronWord-Serienbrief ist dafür ausgelegt, personalisierte Word-Dokumente im großen Maßstab zu erzeugen, was es ideal für die Verarbeitung großer Chargen macht.

Ist Microsoft Word erforderlich, um IronWord-Serienbrief zu verwenden?

Nein, IronWord-Serienbrief erfordert keine Installation von Microsoft Word, was ein nahtloses Dokumentenerstellungserlebnis innerhalb von .NET-Anwendungen ermöglicht.

Welche Arten von Dokumenten können mit IronWord-Serienbrief erzeugt werden?

IronWord-Serienbrief kann eine Vielzahl von Dokumenten erzeugen, einschließlich Rechnungen, Briefe, Etiketten und Berichte, unter Verwendung von Word-Vorlagen.

Wie integriert sich IronWord-Serienbrief mit .NET?

IronWord-Serienbrief wird nativ in .NET unterstützt und bietet Entwicklern eine einfache und effiziente Möglichkeit, Serienbrieffunktionen in ihren Anwendungen zu implementieren.

Welche Vorteile hat die Verwendung von IronWord-Serienbrief gegenüber traditionellen Methoden?

Die Verwendung von IronWord-Serienbrief eliminiert die Notwendigkeit für Microsoft Word, reduziert die Abhängigkeit von Drittanbieter-Software und bietet eine skalierbare Lösung für die Dokumentenerstellung aus .NET-Anwendungen.

Kann IronWord-Serienbrief zur Erstellung von Berichten verwendet werden?

Ja, IronWord-Serienbrief kann zur Erstellung detaillierter Berichte aus Word-Vorlagen verwendet werden, was es vielseitig für verschiedene Dokumentationsbedürfnisse macht.

Ist IronWord-Serienbrief für die automatisierte Dokumentenerstellung geeignet?

Ja, IronWord-Serienbrief ist ideal für die automatisierte Dokumentenerstellung, da es Entwicklern ermöglicht, personalisierte Dokumente programmgesteuert innerhalb ihrer .NET-Anwendungen zu erstellen.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen

Iron-Support-Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an