• <menu id="w2i4a"></menu>
  • logo Aspose.Words使用教程

    文檔首頁>>Aspose.Words使用教程>>Word處理控件Aspose.Words功能演示:使用C#或VB.NET在Word文檔中進行郵件合并

    Word處理控件Aspose.Words功能演示:使用C?;騐B.NET在Word文檔中進行郵件合并


    在許多情況下,使用PDF文檔時,您需要進行更改:復制,粘貼,拖放特定的PDF內(nèi)容,例如文本,圖像,表格和圖表。只要您要處理文檔的一小部分,就可以在同一PDF文件中手動執(zhí)行這些選項。但是,如果您想在更復雜的情況下執(zhí)行編輯選項,例如創(chuàng)建數(shù)字簽名,合并多個PDF文檔或重新處理PDF文件中的所有文本,該怎么辦?

    Aspose.Words for .NET是功能豐富且功能強大的Word API,它提供了所有基本以及擴展的MS Word Mail Merge功能。它使您可以在Windows窗體,ASP.NET Web應(yīng)用程序或任何.NET / .NET Core應(yīng)用程序中生成信函,信封,報告,發(fā)票和其他類型的文檔。

    在本文中,將展示如何在不使用MS Word或Office Interop的情況下使用C#或VB.NET執(zhí)行MS Word郵件合并。本文由以下部分組成:

    • 使用C#在Word文檔中執(zhí)行郵件合并
    • 使用XML數(shù)據(jù)源的郵件合并
    • 合并字段的自定義格式
    • 區(qū)域合并郵件
    • 嵌套郵件合并區(qū)域

    >>Aspose.Words for .NET已經(jīng)更新至v20.7,Aspose.Words for .Net更新至新版本v20.7,添加了新節(jié)點以處理多節(jié)結(jié)構(gòu)化文檔標簽,改進了SmartArt冷渲染的性能,RevisionOptions類擴展了新的屬性,點擊下方按鈕下載最新版。

    點擊下載最新版Aspose.Words for .NET

    郵件合并是自動生成報告,信件,信封,發(fā)票和其他類型的文檔的方式。MS Word中的郵件合并允許您創(chuàng)建包含合并字段的模板文檔,然后使用數(shù)據(jù)源中的記錄填充這些字段。要了解郵件合并,假設(shè)您必須向十個不同的人發(fā)送一封信,并且僅姓名和地址字段將被更新。在這種情況下,只需創(chuàng)建字母的模板,然后通過使用數(shù)據(jù)源填充名稱和地址合并字段來動態(tài)生成字母。

    可以從任何數(shù)據(jù)源(例如XML,JSON或數(shù)據(jù)庫)中獲取郵件合并的數(shù)據(jù)。就Aspose.Words for .NET而言,可以使用ADO.NET支持的任何數(shù)據(jù)源??梢詫?shù)據(jù)加載到DataSet,DataTable,DataView或值數(shù)組中。

    郵件合并模板是包含合并字段的文檔。執(zhí)行“郵件合并”時,這些字段然后用數(shù)據(jù)源中的數(shù)據(jù)填充。模板文檔不需要是模板格式,可以是DOC / DOCX文檔。這是您可以為郵件合并準備模板的方法。

    • 在MS Word中打開您的文檔或創(chuàng)建一個新文檔。
    • 將光標放在要添加合并字段的位置。
    • 插入 菜單中選擇 字段 選項。
    • 字段名稱 列表中,選擇 MergeField。
    • 字段名稱中為合并字段輸入名稱,然后按 確定。
    • 保存文檔。

    以下是示例模板文檔的屏幕截圖。

    Word處理控件Aspose.Words功能演示:使用C?;騐B.NET在Word文檔中進行郵件合并

    使用C#在Word文檔中執(zhí)行郵件合并

    準備好模板后,可以執(zhí)行郵件合并以生成文檔。以下是在上述模板上執(zhí)行郵件合并的步驟。

    • 使用Document類加載模板文檔。
    • 設(shè)置必需的郵件合并選項,例如Document.MailMerge.TrimWhitespaces。
    • 使用Document.MailMerge.Execute()方法執(zhí)行郵件合并,并將數(shù)據(jù)源作為參數(shù)傳遞。
    • 使用Document.Save(String)方法保存生成的文檔。

    下面的代碼示例演示如何使用C#中的值數(shù)組執(zhí)行MS Word郵件合并。

    // The path to the documents directory.
    string dataDir = RunExamples.GetDataDir_MailMergeAndReporting(); 
    // Open an existing document.
    Document doc = new Document(dataDir + "MailMerge.ExecuteArray.doc");
    
    // Trim trailing and leading whitespaces mail merge values
    doc.MailMerge.TrimWhitespaces = false;
    
    // Fill the fields in the document with user data.
    doc.MailMerge.Execute(
        new string[] { "FullName", "Company", "Address", "Address2", "City" },
        new object[] { "James Bond", "MI5 Headquarters", "Milbank", "", "London" });
    
    dataDir = dataDir + "MailMerge.ExecuteArray_out.doc";
    // Send the document in Word format to the client browser with an option to save to disk or open inside the current browser.
    doc.Save(dataDir);

    郵件合并后的Word文檔

    Word處理控件Aspose.Words功能演示:使用C?;騐B.NET在Word文檔中進行郵件合并

    使用C#中的XML數(shù)據(jù)源執(zhí)行郵件合并

    XML文件被廣泛用于保存以及導入/導出數(shù)據(jù)。Aspose.Words for .NET還支持XML作為郵件合并的數(shù)據(jù)源。只需將XML讀入DataSet對象并執(zhí)行郵件合并。以下是我們將要使用的示例XML文件。

    下面的代碼示例從XML數(shù)據(jù)源獲取數(shù)據(jù),并使用C#執(zhí)行郵件合并。

    // The path to the documents directory.
    string dataDir = RunExamples.GetDataDir_MailMergeAndReporting(); 
    
    // Create the Dataset and read the XML.
    DataSet customersDs = new DataSet();
    customersDs.ReadXml(dataDir + "Customers.xml");
    
    string fileName = "TestFile XML.doc";
    // Open a template document.
    Document doc = new Document(dataDir + fileName);
    
    // Execute mail merge to fill the template with data from XML using DataTable.
    doc.MailMerge.Execute(customersDs.Tables["Customer"]);
    
    dataDir = dataDir + RunExamples.GetOutputFilePath(fileName);
    // Save the output document.
    doc.Save(dataDir);

    以下是將用XML數(shù)據(jù)填充的郵件合并模板。

    Word處理控件Aspose.Words功能演示:使用C?;騐B.NET在Word文檔中進行郵件合并

    以下是執(zhí)行郵件合并后得到的Word文檔的第1頁。

    Word處理控件Aspose.Words功能演示:使用C?;騐B.NET在Word文檔中進行郵件合并

    合并字段的自定義格式

    .NET的Aspose.Words使您在執(zhí)行過程中對“郵件合并”有更多控制。該MailMerge.FieldMergingCallback屬性允許您遇到任何合并域時自定義郵件合并。MailMerge.FieldMergingCallback接受實現(xiàn)IFieldMergingCallback.FieldMerging和IFieldMergingCallback.ImageFieldMerging方法的類。

    下面的代碼示例演示如何自定義“郵件合并”操作并將格式應(yīng)用于此模板中的單元格。

    // The path to the documents directory.
    string dataDir = RunExamples.GetDataDir_MailMergeAndReporting(); 
    Document doc = new Document(dataDir + "MailMerge.AlternatingRows.doc");
    
    // Add a handler for the MergeField event.
    doc.MailMerge.FieldMergingCallback = new HandleMergeFieldAlternatingRows();
    
    // Execute mail merge with regions.
    DataTable dataTable = GetSuppliersDataTable();
    doc.MailMerge.ExecuteWithRegions(dataTable);
    dataDir = dataDir + "MailMerge.AlternatingRows_out.doc";
    doc.Save(dataDir);

    以下是HandleMergeFieldAlternatingRows類的實現(xiàn)。

    private class HandleMergeFieldAlternatingRows : IFieldMergingCallback
    {
        ////// Called for every merge field encountered in the document.
        /// We can either return some data to the mail merge engine or do something
        /// Else with the document. In this case we modify cell formatting.
        ///void IFieldMergingCallback.FieldMerging(FieldMergingArgs e)
        {
            if (mBuilder == null)
                mBuilder = new DocumentBuilder(e.Document);
    
            // This way we catch the beginning of a new row.
            if (e.FieldName.Equals("CompanyName"))
            {
                // Select the color depending on whether the row number is even or odd.
                Color rowColor;
                if (IsOdd(mRowIdx))
                    rowColor = Color.FromArgb(213, 227, 235);
                else
                    rowColor = Color.FromArgb(242, 242, 242);
    
                // There is no way to set cell properties for the whole row at the moment,
                // So we have to iterate over all cells in the row.
                for (int colIdx = 0; colIdx < 4; colIdx++) { mBuilder.MoveToCell(0, mRowIdx, colIdx, 0); mBuilder.CellFormat.Shading.BackgroundPatternColor = rowColor; } mRowIdx++; } } void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs args) { // Do nothing. } private DocumentBuilder mBuilder; private int mRowIdx; } ////// Returns true if the value is odd; false if the value is even. ///private static bool IsOdd(int value) { // The code is a bit complex, but otherwise automatic conversion to VB does not work. return ((value / 2) * 2).Equals(value); } ////// Create DataTable and fill it with data. /// In real life this DataTable should be filled from a database. ///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#將郵件與區(qū)域合并

    在某些情況下,您需要填充并重復Word文檔中的特定區(qū)域。在這種情況下,可以對區(qū)域使用郵件合并。若要創(chuàng)建區(qū)域,您需要指定區(qū)域的開始和結(jié)束,然后Mail Megre將為數(shù)據(jù)源中的每個記錄重復該區(qū)域。例如,以下模板包含兩個區(qū)域,分別是Orders和OrderDetails,它們具有合并字段?TableStart:Orders?,?TableEnd:Orders?和?TableStart:OrderDetails?,?TableEnd:OrderDetails?。

    Word處理控件Aspose.Words功能演示:使用C?;騐B.NET在Word文檔中進行郵件合并

    以下是在上述模板的區(qū)域上執(zhí)行Mail Megre的代碼示例。

    // The path to the documents directory.
    string dataDir = RunExamples.GetDataDir_MailMergeAndReporting();
    string fileName = "MailMerge.ExecuteWithRegions.doc";
    Document doc = new Document(dataDir + fileName);
     
    // Use DataTable as a data source.
    int orderId = 10444;
    DataTable orderTable = GetTestOrder(orderId);
    doc.MailMerge.ExecuteWithRegions(orderTable);
     
    // Instead of using DataTable, you can create a DataView for custom sort or filter and then mail merge.
    DataView orderDetailsView = new DataView(GetTestOrderDetails(orderId));
    orderDetailsView.Sort = "ExtendedPrice DESC";
     
    // Execute the mail merge operation.
    doc.MailMerge.ExecuteWithRegions(orderDetailsView);
     
    // Save the merged document.
    dataDir = dataDir + RunExamples.GetOutputFilePath(fileName);
    doc.Save(dataDir);

    以下是從數(shù)據(jù)庫讀取數(shù)據(jù)的方法。

    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;
    }
    ////// Utility function that creates a connection, command, 
    /// Executes the command and return the result in a DataTable.
    ///private static DataTable ExecuteDataTable(string commandText)
    {
        // Open the database connection.
        string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
            RunExamples.GetDataDir_Database() + "Northwind.mdb";
        OleDbConnection conn = new OleDbConnection(connString);
        conn.Open();
    
        // Create and execute a command.
        OleDbCommand cmd = new OleDbCommand(commandText, conn);
        OleDbDataAdapter da = new OleDbDataAdapter(cmd);
        DataTable table = new DataTable();
        da.Fill(table);
    
        // Close the database.
        conn.Close();
    
        return table;
    }

    嵌套郵件合并區(qū)域

    通常,我們在數(shù)據(jù)源中擁有的數(shù)據(jù)以關(guān)系的形式出現(xiàn)。例如,表“ Order”將與“ OrderDetails”具有一對多關(guān)系,該關(guān)系將保留訂單中的項目記錄。為了處理此類父子關(guān)系,使用了嵌套的郵件合并。以下是非常適合這種情況的示例發(fā)票模板。

    Word處理控件Aspose.Words功能演示:使用C?;騐B.NET在Word文檔中進行郵件合并

    以下是將用于嵌套郵件合并的示例XML數(shù)據(jù)源。


    而此XML 的OrderSchema.xsd為:


    下面的代碼示例用于使用C#執(zhí)行嵌套的郵件合并。

    // The path to the documents directory.
    string dataDir = RunExamples.GetDataDir_MailMergeAndReporting(); 
                
    // Create the Dataset and read the XML.
    DataSet pizzaDs = new DataSet();
    
    // Note: The Datatable.TableNames and the DataSet.Relations are defined implicitly by .NET through ReadXml.
    // To see examples of how to set up relations manually check the corresponding documentation of this sample
    pizzaDs.ReadXml(dataDir + "CustomerData.xml");
    
    string fileName = "Invoice Template.doc";
    // Open the template document.
    Document doc = new Document(dataDir + fileName);
    
    // Trim trailing and leading whitespaces mail merge values
    doc.MailMerge.TrimWhitespaces = false;
    
    // Execute the nested mail merge with regions
    doc.MailMerge.ExecuteWithRegions(pizzaDs);
    
    dataDir = dataDir + RunExamples.GetOutputFilePath(fileName);
    // Save the output to file
    doc.Save(dataDir);

    郵件合并后的Word文檔。下面是執(zhí)行郵件合并后生成的Word文檔的第一頁。

    Word處理控件Aspose.Words功能演示:使用C?;騐B.NET在Word文檔中進行郵件合并

    還想要更多嗎?您可以點擊閱讀
    【2020 · Aspose最新資源整合】,查找需要的教程資源。如果您有任何疑問或需求,請隨時加入Aspose技術(shù)交流群(642018183),我們很高興為您提供查詢和咨詢。
    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();