ExecuteWithRegions

ExecuteWithRegions(IMailMergeDataSource)

Выполняет слияние почты из пользовательского источника данных с регионами слияния почты.

public void ExecuteWithRegions(IMailMergeDataSource dataSource)
ПараметрТипОписание
dataSourceIMailMergeDataSourceОбъект, реализующий пользовательский интерфейс источника данных слияния почты.

Примечания

Используйте этот метод для заполнения полей слияния почты в документе значениями из любого пользовательского источника данных, такого как XML-файл или коллекции бизнес-объектов. Вам нужно написать собственный класс your , реализующийIMailMergeDataSource интерфейс.

Вы можете использовать этот метод только тогда, когдаIsBidiTextSupportedOnUpdate являетсяЛОЖЬ, то есть вам не нужна совместимость с языками с письмом справа налево (например, арабским или ивритом).

Примеры

Показывает, как использовать регионы слияния почты для выполнения вложенного слияния почты.

public void CustomDataSource()
{
    Document doc = new Document();
    DocumentBuilder builder = new DocumentBuilder(doc);

    // Обычно поля MERGEFIELD содержат имя столбца источника данных слияния почты.
    // Вместо этого мы можем использовать префиксы «TableStart:» и «TableEnd:» для начала/окончания региона слияния почты.
    // Каждый регион будет принадлежать таблице с именем, которое соответствует строке сразу после двоеточия префикса.
    builder.InsertField(" MERGEFIELD TableStart:Customers");

    // Эти поля MERGEFIELD находятся внутри области слияния почты таблицы «Клиенты».
    // Когда мы выполняем слияние почты, это поле будет получать данные из строк в источнике данных с именем «Клиенты».
    builder.Write("Full name:\t");
    builder.InsertField(" MERGEFIELD FullName ");
    builder.Write("\nAddress:\t");
    builder.InsertField(" MERGEFIELD Address ");
    builder.Write("\nOrders:\n");

    // Создайте вторую область слияния почты внутри внешней области для источника данных с именем «Заказы».
    // Записи данных «Заказы» имеют отношение «многие к одному» с источником данных «Клиенты».
    builder.InsertField(" MERGEFIELD TableStart:Orders");

    builder.Write("\tItem name:\t");
    builder.InsertField(" MERGEFIELD Name ");
    builder.Write("\n\tQuantity:\t");
    builder.InsertField(" MERGEFIELD Quantity ");
    builder.InsertParagraph();

    builder.InsertField(" MERGEFIELD TableEnd:Orders");
    builder.InsertField(" MERGEFIELD TableEnd:Customers");

    // Создаем связанные данные с именами, соответствующими именам наших регионов слияния почты.
    CustomerList customers = new CustomerList();
    customers.Add(new Customer("Thomas Hardy", "120 Hanover Sq., London"));
    customers.Add(new Customer("Paolo Accorti", "Via Monte Bianco 34, Torino"));

    customers[0].Orders.Add(new Order("Rugby World Cup Cap", 2));
    customers[0].Orders.Add(new Order("Rugby World Cup Ball", 1));
    customers[1].Orders.Add(new Order("Rugby World Cup Guide", 1));

    // Чтобы слить почту из вашего источника данных, мы должны обернуть ее в объект, реализующий интерфейс IMailMergeDataSource.
    CustomerMailMergeDataSource customersDataSource = new CustomerMailMergeDataSource(customers);

    doc.MailMerge.ExecuteWithRegions(customersDataSource);

    doc.Save(ArtifactsDir + "NestedMailMergeCustom.CustomDataSource.docx");
}

/// <summary>
/// Пример класса «объект данных» в вашем приложении.
/// </summary>
public class Customer
{
    public Customer(string aFullName, string anAddress)
    {
        FullName = aFullName;
        Address = anAddress;
        Orders = new List<Order>();
    }

    public string FullName { get; set; }
    public string Address { get; set; }
    public List<Order> Orders { get; set; }
}

/// <summary>
/// Пример типизированной коллекции, содержащей ваши объекты "данных".
/// </summary>
public class CustomerList : ArrayList
{
    public new Customer this[int index]
    {
        get { return (Customer) base[index]; }
        set { base[index] = value; }
    }
}

/// <summary>
/// Пример дочернего класса объекта данных в вашем приложении.
/// </summary>
public class Order
{
    public Order(string oName, int oQuantity)
    {
        Name = oName;
        Quantity = oQuantity;
    }

    public string Name { get; set; }
    public int Quantity { get; set; }
}

/// <summary>
 /// Пользовательский источник данных слияния почты, который вы реализуете, чтобы разрешить Aspose.Words
/// для отправки данных слияния из ваших объектов Customer в документы Microsoft Word.
/// </summary>
public class CustomerMailMergeDataSource : IMailMergeDataSource
{
    public CustomerMailMergeDataSource(CustomerList customers)
    {
        mCustomers = customers;

        // Когда мы инициализируем источник данных, его позиция должна находиться перед первой записью.
        mRecordIndex = -1;
    }

    /// <summary>
    /// Имя источника данных. Используется Aspose.Words только при выполнении слияния почты с повторяющимися регионами.
    /// </summary>
    public string TableName
    {
        get { return "Customers"; }
    }

    /// <summary>
    /// Aspose.Words вызывает этот метод, чтобы получить значение для каждого поля данных.
    /// </summary>
    public bool GetValue(string fieldName, out object fieldValue)
    {
        switch (fieldName)
        {
            case "FullName":
                fieldValue = mCustomers[mRecordIndex].FullName;
                return true;
            case "Address":
                fieldValue = mCustomers[mRecordIndex].Address;
                return true;
            case "Order":
                fieldValue = mCustomers[mRecordIndex].Orders;
                return true;
            default:
                // Возвращаем «false» механизму слияния почты Aspose.Words, чтобы обозначить
                // что мы не смогли найти поле с таким именем.
                fieldValue = null;
                return false;
        }
    }

    /// <summary>
    /// Стандартная реализация перехода к следующей записи в коллекции.
    /// </summary>
    public bool MoveNext()
    {
        if (!IsEof)
            mRecordIndex++;

        return !IsEof;
    }

    public IMailMergeDataSource GetChildDataSource(string tableName)
    {
        switch (tableName)
        {
            // Получаем дочерний источник данных, имя которого соответствует региону слияния почты, использующему его столбцы.
            case "Orders":
                return new OrderMailMergeDataSource(mCustomers[mRecordIndex].Orders);
            default:
                return null;
        }
    }

    private bool IsEof
    {
        get { return (mRecordIndex >= mCustomers.Count); }
    }

    private readonly CustomerList mCustomers;
    private int mRecordIndex;
}

public class OrderMailMergeDataSource : IMailMergeDataSource
{
    public OrderMailMergeDataSource(List<Order> orders)
    {
        mOrders = orders;

        // Когда мы инициализируем источник данных, его позиция должна находиться перед первой записью.
        mRecordIndex = -1;
    }

    /// <summary>
    /// Имя источника данных. Используется Aspose.Words только при выполнении слияния почты с повторяющимися регионами.
    /// </summary>
    public string TableName
    {
        get { return "Orders"; }
    }

    /// <summary>
    /// Aspose.Words вызывает этот метод, чтобы получить значение для каждого поля данных.
    /// </summary>
    public bool GetValue(string fieldName, out object fieldValue)
    {
        switch (fieldName)
        {
            case "Name":
                fieldValue = mOrders[mRecordIndex].Name;
                return true;
            case "Quantity":
                fieldValue = mOrders[mRecordIndex].Quantity;
                return true;
            default:
                // Возвращаем «false» механизму слияния почты Aspose.Words, чтобы обозначить
                // что мы не смогли найти поле с таким именем.
                fieldValue = null;
                return false;
        }
    }

    /// <summary>
    /// Стандартная реализация перехода к следующей записи в коллекции.
    /// </summary>
    public bool MoveNext()
    {
        if (!IsEof)
            mRecordIndex++;

        return !IsEof;
    }

    /// <summary>
    /// Возвращаем значение null, поскольку у нас нет дочерних элементов для объектов такого типа.
    /// </summary>
    public IMailMergeDataSource GetChildDataSource(string tableName)
    {
        return null;
    }

    private bool IsEof
    {
        get { return (mRecordIndex >= mOrders.Count); }
    }

    private readonly List<Order> mOrders;
    private int mRecordIndex;
}

Смотрите также


ExecuteWithRegions(IMailMergeDataSourceRoot)

Выполняет слияние почты из пользовательского источника данных с регионами слияния почты.

public void ExecuteWithRegions(IMailMergeDataSourceRoot dataSourceRoot)
ПараметрТипОписание
dataSourceRootIMailMergeDataSourceRootОбъект, реализующий корневой интерфейс пользовательского источника данных слияния почты.

Примечания

Используйте этот метод для заполнения полей слияния почты в документе значениями из любого пользовательского источника данных, такого как XML-файл или коллекции бизнес-объектов. Вам нужно написать свои собственные классы , реализующиеIMailMergeDataSourceRoot иIMailMergeDataSource интерфейсы.

Вы можете использовать этот метод только тогда, когдаIsBidiTextSupportedOnUpdate являетсяЛОЖЬ, то есть вам не нужна совместимость с языками с письмом справа налево (например, арабским или ивритом).

Примеры

Выполняет слияние почты из пользовательского источника данных с основными и подробными данными.

public void CustomDataSourceRoot()
{
    // Создайте документ с двумя регионами слияния почты с именами «Вашингтон» и «Сиэтл».
    string[] mailMergeRegions = { "Vancouver", "Seattle" };
    Document doc = CreateSourceDocumentWithMailMergeRegions(mailMergeRegions);

    // Создаем два источника данных для слияния почты.
    EmployeeList employeesWashingtonBranch = new EmployeeList();
    employeesWashingtonBranch.Add(new Employee("John Doe", "Sales"));
    employeesWashingtonBranch.Add(new Employee("Jane Doe", "Management"));

    EmployeeList employeesSeattleBranch = new EmployeeList();
    employeesSeattleBranch.Add(new Employee("John Cardholder", "Management"));
    employeesSeattleBranch.Add(new Employee("Joe Bloggs", "Sales"));

    // Регистрируем наши источники данных по имени в корне источника данных.
    // Если мы собираемся использовать этот корень источника данных при слиянии почты с регионами,
    // зарегистрированное имя каждого источника должно совпадать с именем существующего региона слияния почты в исходном документе слияния почты.
    DataSourceRoot sourceRoot = new DataSourceRoot();
    sourceRoot.RegisterSource(mailMergeRegions[0], new EmployeeListMailMergeSource(employeesWashingtonBranch));
    sourceRoot.RegisterSource(mailMergeRegions[1], new EmployeeListMailMergeSource(employeesSeattleBranch));

    // Поскольку у нас есть последовательные регионы слияния почты, обычно нам приходится выполнять два слияния почты.
    // Однако один источник слияния почты с корнем данных может заполнять несколько регионов
    // если в корне есть таблицы с соответствующими именами/именами столбцов.
    doc.MailMerge.ExecuteWithRegions(sourceRoot);

    doc.Save(ArtifactsDir + "MailMergeCustom.CustomDataSourceRoot.docx");
}

/// <summary>
/// Создайте документ, содержащий последовательные регионы слияния почты с именами, указанными во входном массиве,
/// для таблицы данных сотрудников.
/// </summary>
private static Document CreateSourceDocumentWithMailMergeRegions(string[] regions)
{
    Document doc = new Document();
    DocumentBuilder builder = new DocumentBuilder(doc);

    foreach (string s in regions)
    {
        builder.Writeln("\n" + s + " branch: ");
        builder.InsertField(" MERGEFIELD TableStart:" + s);
        builder.InsertField(" MERGEFIELD FullName");
        builder.Write(", ");
        builder.InsertField(" MERGEFIELD Department");
        builder.InsertField(" MERGEFIELD TableEnd:" + s);
    }

    return doc;
}

/// <summary>
/// Пример класса «объект данных» в вашем приложении.
/// </summary>
private class Employee
{
    public Employee(string aFullName, string aDepartment)
    {
        FullName = aFullName;
        Department = aDepartment;
    }

    public string FullName { get; }
    public string Department { get; }
}

/// <summary>
/// Пример типизированной коллекции, содержащей ваши объекты "данных".
/// </summary>
private class EmployeeList : ArrayList
{
    public new Employee this[int index]
    {
        get { return (Employee)base[index]; }
        set { base[index] = value; }
    }
}

/// <summary>
/// Корень источника данных, который можно передать непосредственно в слияние почты, которое может регистрироваться и содержать множество дочерних источников данных.
/// Все эти источники должны реализовывать IMailMergeDataSource, регистрироваться и различаться по имени.
/// который соответствует региону слияния почты, который будет читать соответствующие данные.
/// </summary>
private class DataSourceRoot : IMailMergeDataSourceRoot
{
    public IMailMergeDataSource GetDataSource(string tableName)
    {
        EmployeeListMailMergeSource source = mSources[tableName];
        source.Reset();
        return mSources[tableName];
    }

    public void RegisterSource(string sourceName, EmployeeListMailMergeSource source)
    {
        mSources.Add(sourceName, source);
    }

    private readonly Dictionary<string, EmployeeListMailMergeSource> mSources = new Dictionary<string, EmployeeListMailMergeSource>();
}

/// <summary>
/// Пользовательский источник данных слияния почты.
/// </summary>
private class EmployeeListMailMergeSource : IMailMergeDataSource
{
    public EmployeeListMailMergeSource(EmployeeList employees)
    {
        mEmployees = employees;
        mRecordIndex = -1;
    }

    /// <summary>
    /// Стандартная реализация перехода к следующей записи в коллекции.
    /// </summary>
    public bool MoveNext()
    {
        if (!IsEof)
            mRecordIndex++;

        return !IsEof;
    }

    private bool IsEof
    {
        get { return (mRecordIndex >= mEmployees.Count); }
    }

    public void Reset()
    {
        mRecordIndex = -1;
    }

    /// <summary>
    /// Имя источника данных. Используется Aspose.Words только при выполнении слияния почты с повторяющимися регионами.
    /// </summary>
    public string TableName
    {
        get { return "Employees"; }
    }

    /// <summary>
    /// Aspose.Words вызывает этот метод, чтобы получить значение для каждого поля данных.
    /// </summary>
    public bool GetValue(string fieldName, out object fieldValue)
    {
        switch (fieldName)
        {
            case "FullName":
                fieldValue = mEmployees[mRecordIndex].FullName;
                return true;
            case "Department":
                fieldValue = mEmployees[mRecordIndex].Department;
                return true;
            default:
                // Возвращаем «false» механизму слияния почты Aspose.Words, чтобы обозначить
                // что мы не смогли найти поле с таким именем.
                fieldValue = null;
                return false;
        }
    }

    /// <summary>
    /// Дочерние источники данных предназначены для вложенных слияний почты.
    /// </summary>
    public IMailMergeDataSource GetChildDataSource(string tableName)
    {
        throw new System.NotImplementedException();
    }

    private readonly EmployeeList mEmployees;
    private int mRecordIndex;
}

Смотрите также


ExecuteWithRegions(DataSet)

Выполняет слияние почты изНабор данных в документ с регионами слияния почты.

public void ExecuteWithRegions(DataSet dataSet)
ПараметрТипОписание
dataSetDataSetНабор данных который содержит данные для вставки в поля слияния почты.

Примечания

Используйте этот метод для выполнения слияния почты из одной или нескольких таблиц в повторяющиеся области слияния mail в документе. Области слияния почты внутри документа будут динамически увеличиваться, чтобы разместить записи в соответствующих таблицах.

Каждый стол вНабор данных должно иметь имя.

В документе должны быть определены области слияния почты с именами, которые ссылаются на table вНабор данных.

Чтобы указать в документе регион слияния почты, вам необходимо вставить два поля слияния почты , чтобы отметить начало и конец региона слияния почты.

Все содержимое документа, включенное в область слияния почты, будет автоматически повторяться для каждой записи вТаблица данных.

Чтобы отметить начало региона слияния почты, вставьте MERGEFIELD с именем TableStart:MyTable, , где MyTable соответствует одному из имен таблиц в вашемНабор данных.

Чтобы отметить конец региона слияния почты, вставьте еще одно поле MERGEFIELD с именем TableEnd:MyTable.

Чтобы вставить MERGEFIELD в Word, используйте команду Insert/Field и выберите MergeField, затем введите имя поля.

ТаблеСтарт иКонец таблицы поля должны находиться в одном разделе вашего документа.

Если используется внутри таблицы,ТаблеСтарт иКонец таблицы должно находиться внутри одной строки таблицы.

Области слияния почты в документе должны быть правильно сформированы (всегда должна быть пара match ТаблеСтарт иКонец таблицы объединить поля с одинаковым именем таблицы).

Примеры

Показывает, как выполнить вложенное слияние почты с двумя областями слияния и двумя таблицами данных.

public void ExecuteWithRegionsNested()
{
    Document doc = new Document();
    DocumentBuilder builder = new DocumentBuilder(doc);

    // Обычно поля MERGEFIELD содержат имя столбца источника данных слияния почты.
    // Вместо этого мы можем использовать префиксы «TableStart:» и «TableEnd:» для начала/окончания региона слияния почты.
    // Каждый регион будет принадлежать таблице с именем, которое соответствует строке сразу после двоеточия префикса.
    builder.InsertField(" MERGEFIELD TableStart:Customers");

    // Это поле MERGEFIELD находится внутри области слияния почты таблицы «Клиенты».
    // Когда мы выполняем слияние почты, это поле будет получать данные из строк в источнике данных с именем «Клиенты».
    builder.Write("Orders for ");
    builder.InsertField(" MERGEFIELD CustomerName");
    builder.Write(":");

    // Создаем заголовки столбцов для таблицы, которая будет содержать значения из второй внутренней области.
    builder.StartTable();
    builder.InsertCell();
    builder.Write("Item");
    builder.InsertCell();
    builder.Write("Quantity");
    builder.EndRow();

    // Создайте вторую область слияния почты внутри внешней области для таблицы с именем «Заказы».
    // Таблица «Заказы» имеет отношение «многие к одному» с таблицей «Клиенты» в столбце «CustomerID».
    builder.InsertCell();
    builder.InsertField(" MERGEFIELD TableStart:Orders");
    builder.InsertField(" MERGEFIELD ItemName");
    builder.InsertCell();
    builder.InsertField(" MERGEFIELD Quantity");

    // Завершаем внутреннюю область, а затем завершаем внешнюю область. Открытие и закрытие региона слияния почты должно
    // происходит в той же строке таблицы.
    builder.InsertField(" MERGEFIELD TableEnd:Orders");
    builder.EndTable();

    builder.InsertField(" MERGEFIELD TableEnd:Customers");

    // Создайте набор данных, содержащий две таблицы с необходимыми именами и связями.
    // Каждый документ слияния для каждой строки таблицы «Клиенты» внешнего региона слияния будет выполнять слияние почты в таблице «Заказы».
    // В каждом документе слияния будут отображаться все строки последней таблицы, значения столбца «CustomerID» которых соответствуют текущей строке таблицы «Клиенты».
    DataSet customersAndOrders = CreateDataSet();
    doc.MailMerge.ExecuteWithRegions(customersAndOrders);

    doc.Save(ArtifactsDir + "MailMerge.ExecuteWithRegionsNested.docx");
}

/// <summary>
/// Создает набор данных, который имеет две таблицы данных с именами «Клиенты» и «Заказы» с отношением «один ко многим» в столбце «КлиентКод».
/// </summary>
private static DataSet CreateDataSet()
{
    DataTable tableCustomers = new DataTable("Customers");
    tableCustomers.Columns.Add("CustomerID");
    tableCustomers.Columns.Add("CustomerName");
    tableCustomers.Rows.Add(new object[] { 1, "John Doe" });
    tableCustomers.Rows.Add(new object[] { 2, "Jane Doe" });

    DataTable tableOrders = new DataTable("Orders");
    tableOrders.Columns.Add("CustomerID");
    tableOrders.Columns.Add("ItemName");
    tableOrders.Columns.Add("Quantity");
    tableOrders.Rows.Add(new object[] { 1, "Hawaiian", 2 });
    tableOrders.Rows.Add(new object[] { 2, "Pepperoni", 1 });
    tableOrders.Rows.Add(new object[] { 2, "Chicago", 1 });

    DataSet dataSet = new DataSet();
    dataSet.Tables.Add(tableCustomers);
    dataSet.Tables.Add(tableOrders);
    dataSet.Relations.Add(tableCustomers.Columns["CustomerID"], tableOrders.Columns["CustomerID"]);

    return dataSet;
}

Смотрите также


ExecuteWithRegions(DataTable)

Выполняет слияние почты изТаблица данных в документ с регионами слияния почты.

public void ExecuteWithRegions(DataTable dataTable)
ПараметрТипОписание
dataTableDataTableИсточник данных для операции слияния почты. Таблица must имеет свойTableName набор свойств.

Примечания

В документе должен быть определен регион слияния почты с именем, соответствующим .TableName.

Если в документе определены другие регионы слияния почты, они остаются нетронутыми. Это позволяет выполнять несколько операций слияния почты.

Примеры

Демонстрирует, как форматировать ячейки во время слияния почты.

public void AlternatingRows()
{
    Document doc = new Document(MyDir + "Mail merge destination - Northwind suppliers.docx");

    doc.MailMerge.FieldMergingCallback = new HandleMergeFieldAlternatingRows();

    DataTable dataTable = GetSuppliersDataTable();
    doc.MailMerge.ExecuteWithRegions(dataTable);

    doc.Save(ArtifactsDir + "MailMergeEvent.AlternatingRows.docx");
}

/// <summary>
/// Форматирует строки таблицы во время слияния почты, чтобы чередовать два цвета в нечетных/четных строках.
/// </summary>
private class HandleMergeFieldAlternatingRows : IFieldMergingCallback
{
    /// <summary>
    /// Вызывается, когда слияние почты объединяет данные в MERGEFIELD.
    /// </summary>
    void IFieldMergingCallback.FieldMerging(FieldMergingArgs args)
    {
        if (mBuilder == null)
            mBuilder = new DocumentBuilder(args.Document);

        // Это верно, если мы находимся в первом столбце, что означает, что мы перешли на новую строку.
        if (args.FieldName == "CompanyName")
        {
            Color rowColor = IsOdd(mRowIdx) ? Color.FromArgb(213, 227, 235) : 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>
/// Функция, необходимая для автопортирования Visual Basic, которая возвращает четность переданного числа.
/// </summary>
private static bool IsOdd(int value)
{
    return (value / 2 * 2).Equals(value);
}

/// <summary>
/// Создает источник данных слияния почты.
/// </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;
        datarow[1] = "Contact " + i;
    }

    return dataTable;
}

Показывает, как использовать регионы для выполнения двух отдельных слияний почты в одном документе.

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

// Если мы хотим выполнить два последовательных слияния почты в одном документе, беря данные из двух таблиц
// связаны друг с другом каким-либо образом, мы можем разделить почтовые слияния по регионам.
// Обычно поля MERGEFIELD содержат имя столбца источника данных слияния почты.
// Вместо этого мы можем использовать префиксы «TableStart:» и «TableEnd:» для начала/окончания региона слияния почты.
// Каждый регион будет принадлежать таблице с именем, которое соответствует строке сразу после двоеточия префикса.
// Эти регионы являются отдельными для несвязанных данных, но могут быть вложенными для иерархических данных.
builder.Writeln("\tCities: ");
builder.InsertField(" MERGEFIELD TableStart:Cities");
builder.InsertField(" MERGEFIELD Name");
builder.InsertField(" MERGEFIELD TableEnd:Cities");
builder.InsertParagraph();

// Оба поля MERGEFIELD относятся к одному и тому же имени столбца, но значения для каждого будут взяты из разных таблиц данных.
builder.Writeln("\tFruit: ");
builder.InsertField(" MERGEFIELD TableStart:Fruit");
builder.InsertField(" MERGEFIELD Name");
builder.InsertField(" MERGEFIELD TableEnd:Fruit");

// Создаем две несвязанные таблицы данных.
DataTable tableCities = new DataTable("Cities");
tableCities.Columns.Add("Name");
tableCities.Rows.Add(new object[] { "Washington" });
tableCities.Rows.Add(new object[] { "London" });
tableCities.Rows.Add(new object[] { "New York" });

DataTable tableFruit = new DataTable("Fruit");
tableFruit.Columns.Add("Name");
tableFruit.Rows.Add(new object[] { "Cherry" });
tableFruit.Rows.Add(new object[] { "Apple" });
tableFruit.Rows.Add(new object[] { "Watermelon" });
tableFruit.Rows.Add(new object[] { "Banana" });

// Нам нужно будет запустить одно слияние почты для каждой таблицы. Первое слияние почты заполнит поля MERGEFIELD.
// в диапазоне «Города», оставляя поля диапазона «Фрукты» незаполненными.
doc.MailMerge.ExecuteWithRegions(tableCities);

// Запускаем второе слияние для таблицы "Fruit", используя представление данных
// для сортировки строк в порядке возрастания в столбце «Имя» перед объединением.
DataView dv = new DataView(tableFruit);
dv.Sort = "Name ASC";
doc.MailMerge.ExecuteWithRegions(dv);

doc.Save(ArtifactsDir + "MailMerge.ExecuteWithRegionsConcurrent.docx");

Смотрите также


ExecuteWithRegions(DataView)

Выполняет слияние почты изПросмотр данных в документ с регионами слияния почты.

public void ExecuteWithRegions(DataView dataView)
ПараметрТипОписание
dataViewDataViewИсточник данных для операции слияния почты. Исходная таблица Просмотр данных должен иметь своеИмяТаблицы набор свойств.

Примечания

Этот метод полезен, если вы извлекаете данные вТаблица данных но тогда необходимо применить фильтр или сортировку перед слиянием почты.

В документе должен быть определен регион слияния почты с именем, соответствующим .DataView.Table.TableName.

Если в документе определены другие регионы слияния почты, они остаются нетронутыми. Это позволяет выполнять несколько операций слияния почты.

Примеры

Показывает, как использовать регионы для выполнения двух отдельных слияний почты в одном документе.

Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

// Если мы хотим выполнить два последовательных слияния почты в одном документе, беря данные из двух таблиц
// связаны друг с другом каким-либо образом, мы можем разделить почтовые слияния по регионам.
// Обычно поля MERGEFIELD содержат имя столбца источника данных слияния почты.
// Вместо этого мы можем использовать префиксы «TableStart:» и «TableEnd:» для начала/окончания региона слияния почты.
// Каждый регион будет принадлежать таблице с именем, которое соответствует строке сразу после двоеточия префикса.
// Эти регионы являются отдельными для несвязанных данных, но могут быть вложенными для иерархических данных.
builder.Writeln("\tCities: ");
builder.InsertField(" MERGEFIELD TableStart:Cities");
builder.InsertField(" MERGEFIELD Name");
builder.InsertField(" MERGEFIELD TableEnd:Cities");
builder.InsertParagraph();

// Оба поля MERGEFIELD относятся к одному и тому же имени столбца, но значения для каждого будут взяты из разных таблиц данных.
builder.Writeln("\tFruit: ");
builder.InsertField(" MERGEFIELD TableStart:Fruit");
builder.InsertField(" MERGEFIELD Name");
builder.InsertField(" MERGEFIELD TableEnd:Fruit");

// Создаем две несвязанные таблицы данных.
DataTable tableCities = new DataTable("Cities");
tableCities.Columns.Add("Name");
tableCities.Rows.Add(new object[] { "Washington" });
tableCities.Rows.Add(new object[] { "London" });
tableCities.Rows.Add(new object[] { "New York" });

DataTable tableFruit = new DataTable("Fruit");
tableFruit.Columns.Add("Name");
tableFruit.Rows.Add(new object[] { "Cherry" });
tableFruit.Rows.Add(new object[] { "Apple" });
tableFruit.Rows.Add(new object[] { "Watermelon" });
tableFruit.Rows.Add(new object[] { "Banana" });

// Нам нужно будет запустить одно слияние почты для каждой таблицы. Первое слияние почты заполнит поля MERGEFIELD.
// в диапазоне «Города», оставляя поля диапазона «Фрукты» незаполненными.
doc.MailMerge.ExecuteWithRegions(tableCities);

// Запускаем второе слияние для таблицы "Fruit", используя представление данных
// для сортировки строк в порядке возрастания в столбце «Имя» перед объединением.
DataView dv = new DataView(tableFruit);
dv.Sort = "Name ASC";
doc.MailMerge.ExecuteWithRegions(dv);

doc.Save(ArtifactsDir + "MailMerge.ExecuteWithRegionsConcurrent.docx");

Смотрите также


ExecuteWithRegions(IDataReader, string)

Выполняет слияние почты изИдатаридер в документ с регионами слияния почты.

public void ExecuteWithRegions(IDataReader dataReader, string tableName)
ПараметрТипОписание
dataReaderIDataReaderИсточник записей данных для слияния почты, напримерОлеДбDataReader илиSqlDataReader.
tableNameStringИмя региона слияния почты в заполняемом документе.

Примечания

Вы можете пройтиSqlDataReader илиОлеДбDataReaderобъект в метод this в качестве параметра, поскольку они оба реализовалиИдатаридер интерфейс.

Примеры

Показывает, как вставлять в отчет изображения, хранящиеся в BLOB-поле базы данных.

public void ImageFromBlob()
{
    Document doc = new Document(MyDir + "Mail merge destination - Northwind employees.docx");

    doc.MailMerge.FieldMergingCallback = new HandleMergeImageFieldFromBlob();

    string connString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={DatabaseDir + "Northwind.accdb"};";
    string query = "SELECT FirstName, LastName, Title, Address, City, Region, Country, PhotoBLOB FROM Employees";

    using (OleDbConnection conn = new OleDbConnection(connString))
    {
        conn.Open();

        // Открытие устройства чтения данных, которое должно находиться в режиме одновременного чтения всех записей.
        OleDbCommand cmd = new OleDbCommand(query, conn);
        IDataReader dataReader = cmd.ExecuteReader();

        doc.MailMerge.ExecuteWithRegions(dataReader, "Employees");
    }

    doc.Save(ArtifactsDir + "MailMergeEvent.ImageFromBlob.docx");
}

private class HandleMergeImageFieldFromBlob : IFieldMergingCallback
{
    void IFieldMergingCallback.FieldMerging(FieldMergingArgs args)
    {
        // Ничего не делать.
    }

    /// <summary>
    /// Это вызывается, когда слияние почты обнаруживает в документе MERGEFIELD с тегом «Image:» в его имени.
    /// </summary>
    void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs e)
    {
        MemoryStream imageStream = new MemoryStream((byte[])e.FieldValue);
        e.ImageStream = imageStream;
    }
}

Смотрите также