ในบทความนี้ ผมจะแสดงวิธีใช้งาน MS Word Mail Merge โดยใช้ C# หรือ VB.NET โดยไม่ต้องใช้ MS Word หรือ Office Interop Aspose.Words for .NET เป็น Word API ที่มีฟีเจอร์หลากหลายและทรงพลัง ซึ่งให้ฟีเจอร์ MS Word Mail Merge ทั้งแบบพื้นฐานและแบบขยายทั้งหมด ซึ่งช่วยให้คุณสร้างจดหมาย ซองจดหมาย รายงาน ใบแจ้งหนี้ และเอกสารประเภทอื่นๆ ภายใน Windows Forms, เว็บแอปพลิเคชัน ASP.NET หรือแอปพลิเคชัน .NET/.NET Core ใดๆ

ครอบคลุมคุณสมบัติเด่นของ .NET Mail Merge API บทความนี้ประกอบด้วยส่วนต่อไปนี้:

จดหมายเวียนคืออะไร?

Mail Merge เป็นวิธีการสร้างรายงาน จดหมาย ซองจดหมาย ใบแจ้งหนี้ และเอกสารประเภทอื่นๆ โดยอัตโนมัติ จดหมายเวียนใน MS Word ช่วยให้คุณสร้างเอกสารเทมเพลตที่มีเขตข้อมูลผสาน จากนั้นเติมข้อมูลในฟิลด์เหล่านั้นโดยใช้ระเบียนในแหล่งข้อมูล เพื่อทำความเข้าใจเกี่ยวกับ Mail Merge สมมติว่าคุณต้องส่งจดหมายถึงบุคคลต่างๆ สิบคน และจะต้องอัปเดตเฉพาะช่องชื่อและที่อยู่เท่านั้น ในกรณีเช่นนี้ เพียงสร้างเทมเพลตของจดหมาย แล้วสร้างตัวอักษรแบบไดนามิกโดยการเติมฟิลด์การผสานชื่อและที่อยู่โดยใช้แหล่งข้อมูล

แหล่งข้อมูลสำหรับจดหมายเวียน

ข้อมูลสำหรับจดหมายเวียนสามารถดึงมาจากแหล่งข้อมูลใดก็ได้ เช่น XML, JSON หรือฐานข้อมูล เท่าที่เกี่ยวข้องกับ Aspose.Words for .NET คุณสามารถใช้แหล่งข้อมูลใดก็ได้ที่สนับสนุนโดย ADO.NET สามารถโหลดข้อมูลลงใน DataSet, DataTable, DataView หรืออาร์เรย์ของค่าต่างๆ ได้

การเตรียมเทมเพลตสำหรับจดหมายเวียน

แม่แบบจดหมายเวียนคือเอกสารที่มีเขตข้อมูลผสาน เขตข้อมูลเหล่านี้จะถูกเติมด้วยข้อมูลในแหล่งข้อมูลเมื่อมีการดำเนินการจดหมายเวียน เอกสารเทมเพลตไม่จำเป็นต้องเป็นรูปแบบเทมเพลต และสามารถเป็นเอกสาร DOC/DOCX ได้ นี่คือวิธีเตรียมเทมเพลตสำหรับ Mail Merge

  • เปิดเอกสารของคุณหรือสร้างเอกสารใหม่ใน MS Word
  • วางเคอร์เซอร์ในตำแหน่งที่คุณต้องการเพิ่มเขตข้อมูลผสาน
  • จากเมนูแทรก เลือกตัวเลือกฟิลด์
  • จากรายการชื่อเขตข้อมูล เลือก MergeField
  • ป้อนชื่อสำหรับฟิลด์ผสานใน ชื่อฟิลด์ แล้วกด ตกลง
  • บันทึกเอกสาร

ต่อไปนี้เป็นภาพหน้าจอของเอกสาร sample template

เทมเพลตจดหมายเวียน

.NET Mail Merge API - การติดตั้ง

Aspose.Words for .NET สามารถดาวน์โหลดหรือติดตั้งได้ด้วยวิธีต่อไปนี้:

ทำจดหมายเวียนในเอกสาร Word โดยใช้ C#

เมื่อคุณมีเทมเพลตพร้อมแล้ว คุณสามารถเรียกใช้ Mail Merge เพื่อสร้างเอกสารได้ ต่อไปนี้เป็นขั้นตอนในการดำเนินการจดหมายเวียนบนแม่แบบที่กล่าวถึงข้างต้น

  • โหลดเอกสารเทมเพลตโดยใช้คลาส Document
  • ตั้งค่าตัวเลือกจดหมายเวียนที่จำเป็น เช่น Document.MailMerge.TrimWhitespaces
  • ดำเนินการจดหมายเวียนโดยใช้เมธอด Document.MailMerge.Execute() และส่งแหล่งข้อมูลเป็นพารามิเตอร์
  • บันทึกเอกสารที่สร้างขึ้นโดยใช้เมธอด Document.Save(String)

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีเรียกใช้ MS Word Mail Merge โดยใช้อาร์เรย์ของค่าในภาษา C#

// สำหรับตัวอย่างและไฟล์ข้อมูลทั้งหมด โปรดไปที่ https://github.com/aspose-words/Aspose.Words-for-.NET
// เส้นทางไปยังไดเร็กทอรีเอกสาร
string dataDir = RunExamples.GetDataDir_MailMergeAndReporting(); 
// เปิดเอกสารที่มีอยู่
Document doc = new Document(dataDir + "MailMerge.ExecuteArray.doc");

// ตัดค่าจดหมายเวียนที่ต่อท้ายและช่องว่างนำหน้า
doc.MailMerge.TrimWhitespaces = false;

// กรอกข้อมูลในฟิลด์ในเอกสารด้วยข้อมูลผู้ใช้
doc.MailMerge.Execute(
    new string[] { "FullName", "Company", "Address", "Address2", "City" },
    new object[] { "James Bond", "MI5 Headquarters", "Milbank", "", "London" });

dataDir = dataDir + "MailMerge.ExecuteArray_out.doc";
// ส่งเอกสารในรูปแบบ Word ไปยังเบราว์เซอร์ไคลเอ็นต์พร้อมตัวเลือกในการบันทึกลงดิสก์หรือเปิดในเบราว์เซอร์ปัจจุบัน
doc.Save(dataDir);

เอกสาร Word หลังจากจดหมายเวียน

ดำเนินการจดหมายเวียนใน C #

ดำเนินการจดหมายเวียนโดยใช้แหล่งข้อมูล XML ใน C

ไฟล์ XML ถูกใช้อย่างแพร่หลายเพื่อเก็บข้อมูลนำเข้า/ส่งออก Aspose.Words for .NET ยังสนับสนุน XML เป็นแหล่งข้อมูลสำหรับจดหมายเวียนอีกด้วย เพียงอ่าน XML ลงในวัตถุ DataSet และเรียกใช้ Mail Merge ต่อไปนี้เป็นตัวอย่างไฟล์ XML ที่เราจะใช้

<customers>
<customer Name="John Ben Jan" ID="1" Domain="History" City="Boston"/>
<customer Name="Lisa Lane" ID="2" Domain="Chemistry" City="LA"/>
<customer Name="Dagomir Zits" ID="3" Domain="Heraldry" City="Milwaukee"/>
<customer Name="Sara Careira Santy" ID="4" Domain="IT" City="Miami"/>
</customers>

ตัวอย่างโค้ดต่อไปนี้ดึงข้อมูลจากแหล่งข้อมูล XML และดำเนินการจดหมายเวียนโดยใช้ C#

// สำหรับตัวอย่างและไฟล์ข้อมูลทั้งหมด โปรดไปที่ https://github.com/aspose-words/Aspose.Words-for-.NET
// เส้นทางไปยังไดเร็กทอรีเอกสาร
string dataDir = RunExamples.GetDataDir_MailMergeAndReporting(); 

// สร้างชุดข้อมูลและอ่าน XML
DataSet customersDs = new DataSet();
customersDs.ReadXml(dataDir + "Customers.xml");

string fileName = "TestFile XML.doc";
// เปิดเอกสารเทมเพลต
Document doc = new Document(dataDir + fileName);

// ดำเนินการจดหมายเวียนเพื่อเติมเทมเพลตด้วยข้อมูลจาก XML โดยใช้ DataTable
doc.MailMerge.Execute(customersDs.Tables["Customer"]);

dataDir = dataDir + RunExamples.GetOutputFilePath(fileName);
// บันทึกเอกสารผลลัพธ์
doc.Save(dataDir);

ด้านล่างนี้คือ Mail Merge เทมเพลต ที่จะเติมข้อมูล XML

เทมเพลตจดหมายเวียนสำหรับ XML

ต่อไปนี้คือหน้า 1 ของเอกสาร Word ที่เป็นผลลัพธ์ที่เราได้รับหลังจากเรียกใช้ Mail Merge

ดำเนินการจดหมายเวียนด้วย XML ใน C#

การจัดรูปแบบฟิลด์ผสานแบบกำหนดเอง

Aspose.Words for .NET ให้คุณควบคุม Mail Merge ได้มากขึ้นในระหว่างการดำเนินการ คุณสมบัติ MailMerge.FieldMergingCallback ช่วยให้คุณสามารถปรับแต่ง Mail Merge เมื่อพบฟิลด์ผสานใดๆ MailMerge.FieldMergingCallback ยอมรับคลาสที่ใช้เมธอด IFieldMergingCallback.FieldMerging และ IFieldMergingCallback.ImageFieldMerging

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีปรับแต่งการดำเนินการจดหมายเวียนและนำการจัดรูปแบบไปใช้กับเซลล์ภายใน เทมเพลตนี้

// สำหรับตัวอย่างและไฟล์ข้อมูลทั้งหมด โปรดไปที่ https://github.com/aspose-words/Aspose.Words-for-.NET
// เส้นทางไปยังไดเร็กทอรีเอกสาร
string dataDir = RunExamples.GetDataDir_MailMergeAndReporting(); 
Document doc = new Document(dataDir + "MailMerge.AlternatingRows.doc");

// เพิ่มตัวจัดการสำหรับเหตุการณ์ MergeField
doc.MailMerge.FieldMergingCallback = new HandleMergeFieldAlternatingRows();

// ดำเนินการจดหมายเวียนกับภูมิภาค
DataTable dataTable = GetSuppliersDataTable();
doc.MailMerge.ExecuteWithRegions(dataTable);
dataDir = dataDir + "MailMerge.AlternatingRows_out.doc";
doc.Save(dataDir);

ต่อไปนี้เป็นการดำเนินการของคลาส HandleMergeFieldAlternatingRows

// สำหรับตัวอย่างและไฟล์ข้อมูลทั้งหมด โปรดไปที่ https://github.com/aspose-words/Aspose.Words-for-.NET
private class HandleMergeFieldAlternatingRows : IFieldMergingCallback
{
    ///<summary>
    /// เรียกทุกฟิลด์ผสานที่พบในเอกสาร
    /// เราสามารถส่งคืนข้อมูลบางส่วนไปยังเครื่องมือจดหมายเวียนหรือทำบางสิ่งได้
    /// อื่น ๆ กับเอกสาร ในกรณีนี้ เราแก้ไขการจัดรูปแบบเซลล์
    ///</summary>
    void IFieldMergingCallback.FieldMerging(FieldMergingArgs e)
    {
        if (mBuilder == null)
            mBuilder = new DocumentBuilder(e.Document);

        // วิธีนี้ทำให้เราจับจุดเริ่มต้นของแถวใหม่
        if (e.FieldName.Equals("CompanyName"))
        {
            // เลือกสีโดยขึ้นอยู่กับว่าหมายเลขแถวเป็นเลขคู่หรือเลขคี่
            Color rowColor;
            if (IsOdd(mRowIdx))
                rowColor = Color.FromArgb(213, 227, 235);
            else
                rowColor = Color.FromArgb(242, 242, 242);

            // ขณะนี้ยังไม่มีวิธีตั้งค่าคุณสมบัติเซลล์สำหรับทั้งแถว
            // ดังนั้นเราต้องวนซ้ำทุกเซลล์ในแถว
           for (int colIdx = 0; colIdx < 4; colIdx++)
            {
                mBuilder.MoveToCell(0, mRowIdx, colIdx, 0);
                mBuilder.CellFormat.Shading.BackgroundPatternColor = rowColor;
            }

            mRowIdx++;
        }
    }

    void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs args)
    {
        // ไม่ทำอะไร.
    }

    private DocumentBuilder mBuilder;
    private int mRowIdx;
}     
///<summary>
/// คืนค่าจริงหากค่าเป็นเลขคี่ เท็จถ้าค่าเป็นเลขคู่
///</summary>
private static bool IsOdd(int value)
{
    // รหัสมีความซับซ้อนเล็กน้อย แต่การแปลงเป็น VB อัตโนมัติไม่ทำงาน
    return ((value / 2) * 2).Equals(value);
}      
///<summary>
/// สร้าง DataTable และกรอกข้อมูล
/// ในชีวิตจริง DataTable นี้ควรเติมจากฐานข้อมูล
///</summary>
private static DataTable GetSuppliersDataTable()
{
    DataTable dataTable = new DataTable("Suppliers");
    dataTable.Columns.Add("CompanyName");
    dataTable.Columns.Add("ContactName");
   for (int i = 0; i < 10; i++)
    {
        DataRow datarow = dataTable.NewRow();
        dataTable.Rows.Add(datarow);
        datarow[0] = "Company " + i.ToString();
        datarow[1] = "Contact " + i.ToString();
    }
    return dataTable;
}

จดหมายเวียนกับภูมิภาคโดยใช้ C

อาจมีกรณีที่คุณต้องการเติมและทำซ้ำพื้นที่เฉพาะในเอกสาร Word สำหรับกรณีดังกล่าว คุณสามารถใช้จดหมายเวียนกับภูมิภาคได้ ในการสร้างภูมิภาค คุณต้องระบุจุดเริ่มต้นและจุดสิ้นสุดของภูมิภาค จากนั้น Mail Megre จะทำซ้ำภูมิภาคนั้นสำหรับแต่ละระเบียนในแหล่งข้อมูล ตัวอย่างเช่น เทมเพลตต่อไปนี้มีสองภูมิภาค ได้แก่ Orders และ OrderDetails ที่มีฟิลด์ผสาน «TableStart:Orders», «TableEnd:Orders» และ «TableStart:OrderDetails», «TableEnd:OrderDetails» ตามลำดับ

จดหมายเวียนกับภูมิภาค

ต่อไปนี้คือตัวอย่างโค้ดที่ใช้ Mail Megre ในภูมิภาคสำหรับ เทมเพลต ที่กล่าวถึงข้างต้น

// สำหรับตัวอย่างและไฟล์ข้อมูลทั้งหมด โปรดไปที่ https://github.com/aspose-words/Aspose.Words-for-.NET
// เส้นทางไปยังไดเร็กทอรีเอกสาร
string dataDir = RunExamples.GetDataDir_MailMergeAndReporting();
string fileName = "MailMerge.ExecuteWithRegions.doc";
Document doc = new Document(dataDir + fileName);
 
// ใช้ DataTable เป็นแหล่งข้อมูล
int orderId = 10444;
DataTable orderTable = GetTestOrder(orderId);
doc.MailMerge.ExecuteWithRegions(orderTable);
 
// แทนที่จะใช้ DataTable คุณสามารถสร้าง DataView สำหรับการเรียงลำดับหรือตัวกรองแบบกำหนดเอง จากนั้นจึงทำจดหมายเวียน
DataView orderDetailsView = new DataView(GetTestOrderDetails(orderId));
orderDetailsView.Sort = "ExtendedPrice DESC";
 
// ดำเนินการดำเนินการจดหมายเวียน
doc.MailMerge.ExecuteWithRegions(orderDetailsView);
 
// บันทึกเอกสารที่ผสาน
dataDir = dataDir + RunExamples.GetOutputFilePath(fileName);
doc.Save(dataDir);

ต่อไปนี้เป็นวิธีการอ่านข้อมูลจากฐานข้อมูล

// สำหรับตัวอย่างและไฟล์ข้อมูลทั้งหมด โปรดไปที่ https://github.com/aspose-words/Aspose.Words-for-.NET
private static DataTable GetTestOrder(int orderId)
{
    DataTable table = ExecuteDataTable(string.Format(
        "SELECT * FROM AsposeWordOrders WHERE OrderId = {0}", orderId));
    table.TableName = "Orders";
    return table;
}
private static DataTable GetTestOrderDetails(int orderId)
{
    DataTable table = ExecuteDataTable(string.Format(
        "SELECT * FROM AsposeWordOrderDetails WHERE OrderId = {0} ORDER BY ProductID", orderId));
    table.TableName = "OrderDetails";
    return table;
}
///<summary>
/// ฟังก์ชันยูทิลิตี้ที่สร้างการเชื่อมต่อ คำสั่ง 
/// ดำเนินการคำสั่งและส่งกลับผลลัพธ์ใน DataTable
///</summary>
private static DataTable ExecuteDataTable(string commandText)
{
    // เปิดการเชื่อมต่อฐานข้อมูล
    string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
        RunExamples.GetDataDir_Database() + "Northwind.mdb";
    OleDbConnection conn = new OleDbConnection(connString);
    conn.Open();

    // สร้างและดำเนินการคำสั่ง
    OleDbCommand cmd = new OleDbCommand(commandText, conn);
    OleDbDataAdapter da = new OleDbDataAdapter(cmd);
    DataTable table = new DataTable();
    da.Fill(table);

    // ปิดฐานข้อมูล
    conn.Close();

    return table;
}

ภูมิภาคจดหมายเวียนที่ซ้อนกัน

บ่อยครั้งที่ข้อมูลที่เรามีในแหล่งข้อมูลมาในรูปแบบของความสัมพันธ์ ตัวอย่างเช่น ตาราง “Order” จะมีความสัมพันธ์แบบหนึ่ง-ต่อ-many กับ “OrderDetails” ที่จะเก็บบันทึกรายการในคำสั่งซื้อ เพื่อจัดการกับความสัมพันธ์ระหว่างแม่และลูกดังกล่าว จะใช้จดหมายเวียนที่ซ้อนกัน ต่อไปนี้คือตัวอย่าง เทมเพลตใบแจ้งหนี้ ที่เหมาะกับสถานการณ์นี้

แม่แบบจดหมายเวียนกับภูมิภาค

ต่อไปนี้คือแหล่งข้อมูล XML ตัวอย่างที่เราจะใช้สำหรับ Mail Merge ที่ซ้อนกัน

<?xml version="1.0" encoding="utf-8"?>
<Orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="OrdersSchema.xsd">
  <Order>
    <Number>23</Number>
    <Address>Nelson Street</Address>
    <Suburb>Howick</Suburb>
    <City>Auckland</City>
    <Phonenumber>543 1234</Phonenumber>
    <Date>03/01/2010</Date>
    <Total>14.00</Total>
    <Item>
      <Name>BBQ Chicken Pizza</Name>
      <Price>6.00</Price>
      <Quantity>1</Quantity>
      <ItemTotal>6.00</ItemTotal>
    </Item>
    <Item>
      <Name>1.5 Litre Coke</Name>
      <Price>4.00</Price>
      <Quantity>2</Quantity>
      <ItemTotal>8.00</ItemTotal>
    </Item>
  </Order>
  <Order>
    <Number>10</Number>
    <Address>Parkville Avenue</Address>
    <Suburb>Pakuranga</Suburb>
    <City>Auckland</City>
    <Phonenumber>548 7342</Phonenumber>
    <Date>05/03/2010</Date>
    <Total>6.00</Total>
    <Item>
      <Name>Hawaiian Pizza</Name>
      <Price>4.00</Price>
      <Quantity>1</Quantity>
      <ItemTotal>4.00</ItemTotal>
    </Item>
    <Item>
      <Name>Fries</Name>
      <Price>1.00</Price>
      <Quantity>2</Quantity>
      <ItemTotal>2.00</ItemTotal>
    </Item>
  </Order>
</Orders>

โดยที่ OrderSchema.xsd สำหรับ XML นี้คือ:

<?xml version="1.0" encoding ="utf-8"?>
<xs:schema id="OrdersSchema"  xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="Orders">
 <xs:complexType>
 <xs:sequence>
  <xs:element name="Order">
  <xs:complexType>
  <xs:sequence>
  <xs:element name="Number"/>
  <xs:element name="Address"/>
  <xs:element name="Suburb"/>
  <xs:element name="City"/>
  <xs:element name="Phonenumber">
  <xs:element name="Date"/>
  <xs:element name="Total"/>
  <xs:element name="Item">
   <xs:complexType>
   <xs:sequence>
   <xs:element name="Name"/>
   <xs:element name="Price"/>
   <xs:element name="Quantity"/>
   <xs:element name="ItemTotal"/>
   </xs:sequence>
  </xs:complexType>
  </xs:element>
  </xs:sequence>
  </xs:complexType>
 </xs:element>
 </xs:sequence>
 </xs:complexType>
 </xs:element>
</xs:schema>

ตัวอย่างโค้ดต่อไปนี้ใช้เพื่อเรียกใช้ Mail Merge ที่ซ้อนกันโดยใช้ C#

// สำหรับตัวอย่างและไฟล์ข้อมูลทั้งหมด โปรดไปที่ https://github.com/aspose-words/Aspose.Words-for-.NET
// เส้นทางไปยังไดเร็กทอรีเอกสาร
string dataDir = RunExamples.GetDataDir_MailMergeAndReporting(); 
	 
// สร้างชุดข้อมูลและอ่าน XML
DataSet pizzaDs = new DataSet();
	 
// Datatable.TableNames และ DataSet.Relations ถูกกำหนดโดยนัยโดย .NET ผ่าน ReadXml
pizzaDs.ReadXml(dataDir + "CustomerData.xml");
string fileName = "Invoice Template.doc";

// เปิดเอกสารเทมเพลต
Document doc = new Document(dataDir + fileName);
	 
// ตัดค่าจดหมายเวียนที่ต่อท้ายและช่องว่างนำหน้า
doc.MailMerge.TrimWhitespaces = false;
	 
// ดำเนินการจดหมายเวียนที่ซ้อนกับภูมิภาค
doc.MailMerge.ExecuteWithRegions(pizzaDs);
dataDir = dataDir + RunExamples.GetOutputFilePath(fileName);

// บันทึกผลลัพธ์ไปยังไฟล์
doc.Save(dataDir);

Debug.Assert(doc.MailMerge.GetFieldNames().Length == 0, "There was a problem with mail merge");
Console.WriteLine("\nMail merge performed with nested data successfully.\nFile saved at " + dataDir);

เอกสาร Word หลังจากจดหมายเวียน

ด้านล่างคือหน้าแรกของเอกสาร Word ที่เป็นผลลัพธ์หลังจากเรียกใช้ Mail Merge

เอกสาร Word หลังจากจดหมายเวียน

บทสรุป

Aspose.Words for .NET เป็น API ของ Mail Merge ที่มีคุณลักษณะหลากหลาย ซึ่งให้คุณลักษณะ Mail Merge แบบมาตรฐานและแบบขยายทั้งหมดสำหรับแอปพลิเคชัน .NET ภายในโค้ดไม่กี่บรรทัด คุณสามารถสร้างรายงานอย่างง่ายหรือซับซ้อนจากแหล่งข้อมูลประเภทต่างๆ ได้อย่างไร้รอยต่อ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ .NET Mail Merge API ได้จาก เอกสารประกอบ หากต้องการเรียนรู้เกี่ยวกับ Aspose.Words for .NET ให้เริ่มต้นด้วย คำแนะนำสำหรับนักพัฒนา และ GitHub ตัวอย่างโค้ด

ลองใช้ Aspose.Words for .NET ฟรี

คุณสามารถรับใบอนุญาตชั่วคราวได้ฟรีเพื่อลองใช้ Aspose.Words for .NET โดยไม่มีข้อจำกัดใดๆ รับใบอนุญาตชั่วคราวของคุณตอนนี้.

ดูสิ่งนี้ด้วย