How to Mail Merge Word Documents in C
IronWord, verilerinizi sözlükler, DataSet nesnelerinden veya tekrarlanan-bölge tablolarından alarak, Word şablonundaki MERGEFIELD yer tutucularını doldurarak C#'ta birleştirme işlemi yapar, tümü Microsoft Office Interop kullanmadan. Microsoft Word veya herhangi bir uyumlu araçla oluşturulan birleşim alanları otomatik olarak algılanır.
E-posta birleştirme, ölçekte kişiselleştirilmiş belgeler oluşturmanın standart yoludur: bir şablon paylaşan, ancak alıcıya göre farklılık gösteren form mektupları, faturalar, sertifikalar, sözleşmeler ve raporlar. Her belgeyi elle düzenlemek yerine, birleşim alanları içeren tek bir .docx şablonu oluşturur ve IronWord'un bunları veri kaynağınızdan doldurmasına izin verirsiniz. Her işleme WordDocument.MailMerge giriş noktası aracılığıyla erişilir.
Hızlı Başlangıç: Bir Word Belgesini Mail Merge ile Birleştirin
MERGEFIELD yer tutucuları içeren bir şablon yükleyin, Execute'a alan adları ve değerlerinden oluşan bir sözlük aktarın ve sonucu kaydedin.
-
IronWord aşağıdaki NuGet Paket Yöneticisi ile yükleyin
-
Bu kod parçacığını kopyalayın ve çalıştırın.
WordDocument doc = new WordDocument("template.docx"); doc.MailMerge.Execute(new Dictionary<string, string> { { "FirstName", "Jane" }, { "Company", "Acme Corp" } }); doc.SaveAs("output.docx"); -
Canlı ortamınızda test için dağıtım yapın
Ücretsiz deneme ile bugün projenizde IronWord kullanmaya başlayın
Asgari İş Akışı (5 adım)
- C# e-posta birleştirme için NuGet'ten kütüphaneyi indirin
MERGEFIELDyer tutucularını içeren bir Word şablonu oluşturunWordDocumentyapıcı fonksiyonunu kullanarak şablonu yükleyin- Veri kaynağınız ile
MailMerge.ExecuteveyaMailMerge.ExecuteWithRegionsçağırın - Doldurulmuş belgeyi kaydedin
Bir Sözlükten E-posta Birleştirmesini Nasıl Yaparım?
En basit veri kaynağı birleşim alanı adlarına göre anahtarlanmış bir IDictionary<string, string>'dır. Execute adı bir anahtarla eşleşen her alanı değiştirir.
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 ayarlarını yapın.Ayrıca, alan adları ve değerlerinden oluşan iki paralel dizi sağlayabilirsiniz:
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" })
Execute(fieldNames, values), iki dizi farklı uzunluklardaysa bir ArgumentException atar.
Bir DataTable veya DataRow'dan E-posta Birleştirmesini Nasıl Yaparım?
Veriler bir veritabanından veya mevcut bir DataSet'den geldiğinde, bir DataTable veya DataRow doğrudan Execute'a aktarın. Birleştirme alanı adları sütun adları ile eşleştirilir. Execute(DataTable), tablonun ilk satırındaki değerleri kullanırken, Execute(DataRow) satırın üst tablo adlarını kullanır.
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")
Tekrar Eden Tablo Bölgelerini Nasıl Doldururum?
Tekrar eden bölgeler, bir şablon satırını birden fazla satıra dönüştürür, bu da fatura hat öğeleri veya sipariş listeleri için idealdir. Şablonda, tekrarlanan içeriği TableStart:RegionName ve TableEnd:RegionName adındaki iki işaret alanı arasına almaya çalışın. Daha sonra, eşleşen tablonun her satırı için bir defa bölgenin içeriğini tekrarlayan ExecuteWithRegions'ı çağırın.
ExecuteWithRegions, tam bir DataSet (adı bir tabloyla eşleşen her bölgeyi genişletir), tek bir DataTable (adı dataTable.TableName ile eşleşen bölgeyi genişletir) veya bir DataTable ile birlikte bir bölge adı kabul eder.
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")
[(i:(ExecuteWithRegions yalnızca tekrarlanan bölgeleri doldurur. Bölgelerin dışında standart birleşim alanlarını da doldurmak için, yukarıda gösterildiği gibi bölgeleri genişlettikten sonra Execute(...)'i çağırın.)}]
Bir Şablonun Birleştirme Alanlarını Nasıl İncelerim?
Birleştirmeden önce, bir şablonun neler içerdiğini keşfedebilir, bu da şablonları doğrulamak veya veri kaynağını dinamik olarak oluşturmak için faydalıdır.
GetFieldNames(), belgede sıralı ve tekrarlanmamış tüm değer-stili birleşim alanlarının adlarını geri döndürür.GetRegionNames(), belgede bildirilen tümTableStartbölgelerinin adlarını geri döndürür.GetFields(),TableEndişaretçileri de dahil olmak üzere her alanıMergeFieldnesneleri olarak geri döndürür.
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"]
Her MergeField, Name'sunu, belgede saklandığı haliyle tam Instruction metnini (örneğin MERGEFIELD FirstName \* MERGEFORMAT), yalnızca bölge işaretçileri için ayarlanan bir RegionName (örneğin "Orders", "TableStart:Orders"'den) ve alanı Value (veri değeri ile değiştirilen metin), TableStart 'ye veya TableEnd 'ye sınıflandıran bir Kind (tekrarlanan bir bölge sınırları) veya NextRecord (aynı şablon gövdesi içinde bir sonraki veri kaydına ilerleyen bir NEXT alanı) açar.
Eşleşmemiş Alanları ve Null Değerlerini Nasıl Kontrol Edebilirim?
Birleştirme davranışı MailMerge.Options aracılığıyla yapılandırılır:
| Seçenek | Default | Davranış |
|---|---|---|
RemoveUnusedFields |
true |
Veri kaynağında eşleşen bir anahtar bulunmayan birleştirme alanlarını kaldırır. Yerinde bırakmak için false olarak ayarlayın. |
RemoveUnusedRegions |
true |
Veri kaynağında eşleşen tablo bulunmayan TableEnd bölgeleri kaldırır. |
NullValueReplacement |
"" |
Bir alan için veri kaynağı bir null değeri sağladığında yerleşen metin. |
CaseInsensitiveFieldNames |
true |
Alan adları eşleştirilirken büyük/küçük harf göz ardı edilir, bu Microsoft Word davranışıdır. |
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")
Basit değer yerine koyma işlemini bir veri kaynağı olmadan yapmak istiyorsanız, bir Word belgesinde metni nasıl değiştireceğinizi görmek için tıklayın.
Sıkça Sorulan Sorular
C# ile bir Word belgesinde nasıl posta birleştirme yaparım?
MERGEFIELD yer tutucuları içeren bir Word şablonunu WordDocument yapılandırıcısı ile yükleyin, ardından bir IDictionary, DataTable veya DataRow ile doc.MailMerge.Execute çağırarak adı bir anahtar veya sütunla eşleşen her alanı değiştirin ve sonucu SaveAs ile kaydedin. Microsoft Word'de oluşturulan birleştirme alanları otomatik olarak algılanır ve Microsoft Office yüklemeye gerek yoktur.
IronWord hangi veri kaynaklarını posta birleştirme için kullanabilir?
MailMerge.Execute, alan adları ve değerlerinin iki paralel dizisini, alan isimleri ve değerleri içeren bir IDictionary'yi, DataTable (ilk satırı kullanarak) ya da DataRow'u (ebeveyn tablosunun sütunlarını kullanarak) kabul eder. MailMerge.ExecuteWithRegions, tekrar eden tablo bölgelerini genişletmek için bir DataSet veya DataTable kabul eder.
Word posta birleştirmesinde tekrarlayan tablo bölgelerini nasıl doldururum?
Şablondaki tekrarlayan içeriği TableStart:RegionName ve TableEnd:RegionName birleştirme alanları arasında sarın, ardından MailMerge.ExecuteWithRegions'u bir DataSet veya DataTable ile çağırın. Bölgenin içeriği, eşleşen tablonun her satırında bir kez tekrarlanır. ExecuteWithRegions yalnızca bölgeleri doldurduğu için, herhangi bir standart birleştirme alanını doldurmak için birleştirme sonrası Execute'u çağırın.
Bir şablonun birleştirme alanlarını birleştirmeden önce inceleyebilir miyim?
Evet. MailMerge.GetFieldNames, belge sırasındaki değer stilinde alan adlarını döndürür, GetRegionNames TableStart bölge adlarını döndürür ve GetFields, her alanın Adını, Talimatını, Türünü (Değer, TableStart, TableEnd veya NextRecord) ve BölgeAdını açığa çıkaran MergeField nesnelerini döndürür.
Eşleşmeyen verilerle birleştirme alanları ne olur?
Varsayılan olarak MailMergeOptions.RemoveUnusedFields true'dur, bu nedenle veri kaynağında eşleşen bir anahtarı olmayan alanlar çıktıdan kaldırılır. Bunu false olarak ayarlayarak yerinde bırakılmalarını sağlayabilirsiniz. RemoveUnusedRegions true iken eşleşmeyen TableStart/TableEnd bölgeleri kaldırılır ve boş değerler NullValueReplacement dizgisi ile değiştirilir.
Posta birleştirme alan eşleştirmesi büyük/küçük harf duyarlı mı?
Hayır. Alan adı aramaları varsayılan olarak büyük/küçük harf duyarsızdır, Microsoft Word davranışı ile eşleşir. MailMerge.Options.CaseInsensitiveFieldNames'ı false olarak ayarlayarak tam bir harf eşleşmesine ihtiyacınız varsa bunun tersini yapın.

