65.9K
CodeProject 正在变化。 阅读更多。
Home

云中的邮件合并:使用 Aspose.Words for Cloud

starIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

1.00/5 (1投票)

2013年7月11日

CPOL

6分钟阅读

viewsIcon

28594

downloadIcon

307

云中的邮件合并:使用 Aspose.Words for Cloud

邮件合并

邮件合并通常用于创建信函,这也是本示例的目的。FloRelief 是一个虚构的洪水救助慈善机构,它有一个在线页面,销售食品、滤水器、帐篷和急救包的捐赠,以帮助受洪水影响的人们。您可以为朋友购买捐赠。(为了便于理解此场景中的不同角色,“赠送者”是指购买捐赠的人,“受赠者”是指接收捐赠的人。)这是一个在线服务,但赠送者可以选择向受赠者发送一封信来告知他们捐赠事宜。他们提供纸质选项,因为有些人更喜欢信件而非电子邮件——他们觉得信件更正式,价值也更高。

赠送者在线输入信息

  • 礼品详情:捐赠的金额,如何联系受赠者。
  • 受赠者信息:受赠者的姓名和地址。
  • 赠送者信息:赠送者自己的姓名。(在实际应用中,还会收集账单和发票地址以及信用卡详细信息。)

如果赠送者选择发送信件,应用程序将获取礼品详情、受赠者信息和赠送者姓名,将它们合并到一个 Microsoft Word 模板中,并将生成的信件保存到磁盘。到一天结束时,志愿者会打印新文件,将信件装入信封并发出去。

实现这一点有很多方法。传统的方法是构建一个应用程序,该应用程序驻留在服务器上,收集数据,将其放入数据库,然后每天一次对最近的捐赠执行邮件合并。

FloRelief 的方法并非如此。相反,他们使用云 API 在提交表单时执行邮件合并。(详细信息还会保存到数据库中以供管理,但这部分过程不包含在此示例中。)

尝试 Aspose.Words for Cloud.

应用程序概述

我编写了一个简单的 Web 应用程序,它会启动一个网页,让赠送者选择一个或多个礼品,是否发送信件,并输入一些基本的用户数据。为了保持简单,本示例不包括收集或验证付款信息、登录或真实应用程序将具备的任何后台管理。它完全专注于收集受赠者、赠送者和礼品信息以及进行邮件合并的过程。

从用户的角度来看,这发生在:

  1. 用户输入自己和受赠者的详细信息。
  2. 选择发送信件。
  3. 选择一个或多个礼品。
  4. 在页面底部的表格中检查礼品。
  5. 点击 **捐赠**。

在后台,开发人员已完成:

  1. 将 Microsoft Word 模板上传到 Aspose for Cloud。
  2. 创建收集赠送者、受赠者和礼品信息的网页
  3. 在 Aspose for Cloud 上创建新应用,并使用 ID 和密钥对 API 请求进行身份验证。
  4. 编写应用程序。

应用程序

  1. 在网页上生成选定产品的表格。
  2. 收集表单数据。
  3. 将表单数据转换为用于邮件合并的 XML。
  4. 设置文件名、输出路径和输出格式。
  5. 执行邮件合并。
  6. 保存生成的文档。

除第一部分外,所有内容对用户都是隐藏的。

本示例使用 C#、Microsoft Visual Studio、Aspose.Words for Cloud .NET SDK 和 JSON 编写。要访问完整示例,请 [下载项目]。

注意:要运行示例,您需要 Aspose.Words for Cloud 的 App ID 和密钥。这些是特定于应用程序的,因此创建 Aspose for Cloud 应用的第一步是创建一个新应用,并从您的 Aspose for Cloud 帐户获取其 ID 和密钥值。发送到 Aspose for Cloud 的每个请求都必须使用私钥进行签名,以确保只有授权应用程序才能访问 API。

运行邮件合并

邮件合并有多个方面:Microsoft Word 模板、HTML 页面以及执行合并的代码。

Microsoft Word 模板

使用 Aspose.Words for Cloud 执行邮件合并有多种方法。在此,我使用了区域。在模板中,我定义了两个区域,使用 <<TableStart:NAME>><<TableEnd:NAME >> 标签。这些区域是 Charity(信函正文)和 Gift(列出赠送者已选择的捐赠的表格)。

图 1:信函模板。

网页

网页列出了不同的礼品,并允许用户选择它们。在顶部,用户输入赠送者和受赠者的详细信息。

图 2:输入字段

礼品列在中间。共有六种不同的选项,每种都带有描述、图片和价格。

在页面底部,动态生成一个列出选定礼品的表格。

图 4:选择礼品后,用户点击捐赠。

Default.aspx.cs 文件

Default.aspx.cs 文件包含主要应用程序逻辑。它生成一个选定礼品的表格,创建用于邮件合并的 XML,并包含应用程序 ID 和密钥的原始值。(在下面的代码中,它们已被 NNNN 值替换。)

它执行邮件合并并保存文件。执行邮件合并的代码包含在此部分中:

try
            {
                Aspose.Cloud.Words.MailMerge mailMerge = new Aspose.Cloud.Words.MailMerge();
                mailMerge.ExecuteMailMergewithRegions("CharityTemplate.docx", 
                    xml, Aspose.Cloud.Words.SaveFormat.Docx, Server.MapPath("Letters") +
                    "\\" + txtDonorName.Text + ".docx", "", true);
            }
            catch (Exception ex)
            {
                Session["errorMessage"] = ex.Message;
            }
 
        }

在此,应用程序设置新的邮件合并,并定义模板文档、数据源、输出格式、输出路径和文件名。它调用 MailMerge,如下所述。

输入——合并数据——是根据用户在表单中输入的数据构建的。

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
 
namespace FloRelief
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                CreateTable();
                GridView2.DataSource = (Session["Data"] as DataTable);
                GridView2.DataBind();
            }
        }
 
        protected void btnDonate_Click(object sender, EventArgs e)
        {
            string xml =
                        @"<root>
                            <Charity>
                              <Date>" + DateTime.Today + @"</Date>
                              <Giver>" + txtGiverName.Text + @"</Giver>
                              <Donor>" + txtDonorName.Text + @"</Donor>
                              <DonorAddress>" + txtDonorAddress.Text + @"</DonorAddress>
                         ";
            foreach (DataRow row in (Session["Data"] as DataTable).Rows)
            {
                xml = xml +
 
                        @"          
                              <Gift>
                                <GiftName>" + row["Gift"] + @"</GiftName>
                                <GiftValue>" + row["Value"] + @"</GiftValue>
                              </Gift>
                         ";
            }
            xml = xml +
                        @"
                            </Charity>
                          </root>";
 
            Aspose.Cloud.Common.AsposeCloudApp.AppSID = "NNNNN”
            Aspose.Cloud.Common.AsposeCloudApp.AppKey = "NNNNN";
 
            Aspose.Cloud.Common.Product.BaseProductUri = "http://api.aspose.com/v1.1";
 
            try
            {
                Aspose.Cloud.Words.MailMerge mailMerge = new Aspose.Cloud.Words.MailMerge();
                mailMerge.ExecuteMailMergewithRegions("CharityTemplate.docx", xml, 
                    Aspose.Cloud.Words.SaveFormat.Docx, Server.MapPath("Letters") + 
                    "\\" + txtDonorName.Text + ".docx", "", true);
            }
            catch (Exception ex)
            {
                Session["errorMessage"] = ex.Message;
            }
 
        }
 
        protected void CartButton_Click(object sender, EventArgs e)
        {
            string giftName = (sender as Button).Attributes["GiftName"];
            string giftValue = (sender as Button).Attributes["GiftValue"];
            (Session["Data"] as DataTable).Rows.Add(giftName, giftValue);
            GridView2.DataSource = (DataTable)Session["Data"];
 
            GridView2.DataBind();
        }
 
        public void CreateTable()
        {
            DataTable table = new DataTable();
            DataColumn column = new DataColumn("Gift", typeof(String));
            table.Columns.Add(column);
            column = new DataColumn("Value", typeof(String));
            table.Columns.Add(column);
            // table.Rows.Add("as", "50");
            Session.Add("Data", table);
        }
 
    }
}

MailMerge.cs 文件

简而言之,MailMerge 代码:

  1. 引用必要的类,包括 Aspose.Cloud.Common
  2. 构建并签名 URI 以验证 API 调用。
  3. 获取响应流。

下面是完整的 MailMerge.cs 文件。您会注意到它在向 API 发送请求时构建并签名 URI。

using System;
using System.Collections.Generic;
using System.Text;
using Aspose.Cloud.Common;
using System.IO;
using System.Xml.Serialization;
using System.Xml;
using System.Xml.XPath;
 
namespace Aspose.Cloud.Words
{
    public class MailMerge
    {
        /// <summary>
        /// Execute mail merge with regions.
        /// </summary>
        /// <param name="FileName"></param>
        /// <param name="strXML"></param>
        /// <param name="saveformat"></param>
        /// <param name="output"></param>
        /// <param name="documentFolder"></param>
        /// <param name="deleteFromStorage"></param>
        public void ExecuteMailMergewithRegions(string FileName, string strXML, SaveFormat saveformat, string output,
            string documentFolder , bool deleteFromStorage)
        {
            try
            {
                //build URI to get Image
                string strURI = Product.BaseProductUri + "/words/" + FileName + "/executeMailMerge?withRegions=true" +
                    (documentFolder == "" ? "" : "&folder=" + documentFolder);
 
                string signedURI = Utils.Sign(strURI);
 
                string outputFileName = null;
 
                using (Stream responseStream = Utils.ProcessCommand(signedURI, "POST", strXML, "xml"))
                {
                    string strResponse = null;
 
                    using (StreamReader reader = new StreamReader(responseStream))
                    {
                        //further process JSON response
                        strResponse = reader.ReadToEnd();
                    }
 
                    using (MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(strResponse)))
                    {
                        XPathDocument xPathDoc = new XPathDocument(ms);
                        XPathNavigator navigator = xPathDoc.CreateNavigator();
 
                        //get File Name
                        XPathNodeIterator nodes = navigator.Select("/SaaSposeResponse/Document/FileName");
                        nodes.MoveNext();
                        outputFileName = nodes.Current.InnerXml;
                        //build URI
                        strURI = Product.BaseProductUri + "/words/" + outputFileName;
                        strURI += "?format=" + saveformat + (documentFolder == "" ? "" : "&folder=" + documentFolder);
                    }
                }
                //sign URI
                signedURI = Utils.Sign(strURI);
 
                //get response stream
                using (Stream responseStream = Utils.ProcessCommand(signedURI, "GET"))
                {
                    using (Stream fileStream = System.IO.File.OpenWrite(output))
                    {
                        Utils.CopyStream(responseStream, fileStream);
                    }
                }
 
                if (deleteFromStorage)
                {
                    signedURI = Utils.Sign(Product.BaseProductUri + "/storage/file/" +
                        (documentFolder == "" ? outputFileName : documentFolder + "/" + outputFileName));
                    Utils.ProcessCommand(signedURI, "DELETE");
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
 
    }
}

完成的邮件合并

输出文件的格式与模板相同,但包含在网页上输入的数据。

图 5:合并后的文档。

摘要

云 API 可用于多种任务。本示例展示了如何从 Web 应用程序执行邮件合并。该过程结构清晰且相对简单:创建数据源,将其发送到 API,然后将其合并到模板中以生成新文档。

Aspose.Words for Cloud 提供了简单而强大的工具,用于在云中进行文档管理和操作。例如,一个允许邮件合并的 API 可以轻松地集成 Web 应用程序和文档管理。

如果您想尝试一下,请创建一个帐户并开始免费试用。 尝试 Aspose.Words for Cloud

© . All rights reserved.