DocWright.MailMerge
1.1.4
dotnet add package DocWright.MailMerge --version 1.1.4
NuGet\Install-Package DocWright.MailMerge -Version 1.1.4
<PackageReference Include="DocWright.MailMerge" Version="1.1.4" />
<PackageVersion Include="DocWright.MailMerge" Version="1.1.4" />
<PackageReference Include="DocWright.MailMerge" />
paket add DocWright.MailMerge --version 1.1.4
#r "nuget: DocWright.MailMerge, 1.1.4"
#:package DocWright.MailMerge@1.1.4
#addin nuget:?package=DocWright.MailMerge&version=1.1.4
#tool nuget:?package=DocWright.MailMerge&version=1.1.4
DocWright.MailMerge
Fill a Word template from your own data: merge fields, repeating regions for tables and line items, nested relations, and one copy of the template per record in a single output document, separated by a page break, a section break or nothing.
No System.Data dependency — bind from objects, dictionaries or your own reader.
Add-on for DocWright.
Install
dotnet add package DocWright.MailMerge
You will normally also want the main package, which loads and saves documents:
dotnet add package DocWright
Usage
using DocWright;
using DocWright.Dom;
using DocWright.MailMerge;
using System.Globalization;
var converter = new DocWrightConverter();
var map = new MergeFieldMap<Order>()
.Add("CustomerName", o => o.Customer)
.Add("Total", o => o.Total)
.AddRelation("Items", o => o.Lines, new MergeFieldMap<Line>()
.Add("Description", l => l.Description)
.Add("Amount", l => l.Amount));
using WordDocument document = converter.Load(File.OpenRead("invoice-template.docx"));
// Reject a bad template before you have any data.
document.ValidateMergeRegions();
MergeResult result = document.Execute(
MergeDataSource.FromObjects(orders, map),
new MailMergeOptions
{
Culture = CultureInfo.GetCultureInfo("en-US"), // explicit, never ambient
RecordSeparator = MergeRecordSeparator.PageBreak,
});
if (result.UnmergedFieldNames.Count > 0)
{
Console.WriteLine("Template asked for: " + string.Join(", ", result.UnmergedFieldNames));
}
using FileStream output = File.Create("invoices.docx");
converter.Save(document, output);
Binding without a typed map
document.Execute(MergeDataSource.FromDictionaries(rows)); // many records
document.Execute(MergeDataSource.FromDictionary(row)); // one record
What you get
MERGEFIELDdiscovery and substitution, including fields split across runs- Repeating regions (
TableStart:/TableEnd:) with nesting andNEXT - Nested relations through
AddRelation MergeImage/MergeImageRequestto merge pictures, not just textValidateMergeRegions()to fail a malformed template earlyUnmergedFieldspolicy for fields your data does not supply
Determinism
Culture is explicit and never taken from the ambient thread culture, so a merge produces
the same output on every machine.
Requirements
.NET Framework 4.8, .NET Standard 2.0, .NET 8.0 or .NET 10.0.
Documentation
📖 DocWright documentation ·
Tutorial: generate invoices with mail merge ·
Mail merge data sources and options ·
API reference: DocWright.MailMerge
Contact
Questions, support or licensing: salwan@albahadly.com · www.albahadly.com
License
MIT.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 is compatible. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.8
- DocWright.Dom (>= 1.1.4)
- Microsoft.Bcl.HashCode (>= 1.1.1)
- System.Buffers (>= 4.6.1)
- System.Memory (>= 4.6.3)
- System.Runtime.CompilerServices.Unsafe (>= 6.1.2)
-
.NETStandard 2.0
- DocWright.Dom (>= 1.1.4)
- Microsoft.Bcl.HashCode (>= 1.1.1)
- System.Buffers (>= 4.6.1)
- System.Memory (>= 4.6.3)
- System.Runtime.CompilerServices.Unsafe (>= 6.1.2)
-
net10.0
- DocWright.Dom (>= 1.1.4)
-
net8.0
- DocWright.Dom (>= 1.1.4)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Guides, tutorials and API reference: https://docs.albahadly.com/docwright/