How to Mail Merge Word Documents in C

This article was translated from English: Does it need improvement?
Translated
View the article in English

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.

  1. IronWord aşağıdaki NuGet Paket Yöneticisi ile yükleyin

    PM > Install-Package IronWord
  2. 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");
  3. Canlı ortamınızda test için dağıtım yapın

    Ücretsiz deneme ile bugün projenizde IronWord kullanmaya başlayın

    arrow pointer


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

İpuçlarıAlan adı aramaları varsayılan olarak büyük/küçük harfe duyarsızdır ve Microsoft Word ile eşleşir. Tam eşleşme gerektirmesi için 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" })
$vbLabelText   $csharpLabel

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

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

[(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üm TableStart bölgelerinin adlarını geri döndürür.
  • GetFields(), TableEnd işaretçileri de dahil olmak üzere her alanı MergeField nesneleri 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"]
$vbLabelText   $csharpLabel

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

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.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapı...

Daha Fazla Oku
Başlamaya Hazır mısınız?
Nuget İndirmeler 48,355 | Sürüm: 2026.7 yeni yayınlandı
Still Scrolling Icon

Hâlâ Kaydırıyor Musunuz?

Hızlıca kanıt ister misiniz? PM > Install-Package IronWord
bir örnek çalıştırın verilerinizi bir Word belgesine dönüştürün.