GetDataSource
Содержание
[
Скрывать
]IMailMergeDataSourceRoot.GetDataSource method
Механизм слияния почты Aspose.Words вызывает этот метод, когда обнаруживает начало области слияния почты верхнего уровня.
public IMailMergeDataSource GetDataSource(string tableName)
Параметр | Тип | Описание |
---|---|---|
tableName | String | Имя региона слияния почты, указанное в шаблоне документа. Без учета регистра. |
Возвращаемое значение
Объект источника данных, который обеспечит доступ к записям данных указанной таблицы.
Примечания
Когда движки слияния почты Aspose.Words заполняют документ данными и сталкиваются с MERGEFIELD TableStart:TableName, , он вызываетGetDataSource
на этом объекте. Ваша реализация должна возвращать новый объект источника данных. Aspose.Words будет использовать возвращенный источник данных для заполнения области слияния почты.
Если источник данных (таблица) с указанным именем не существует, ваша реализация должна вернутьнулевой
.
Примеры
Выполняет слияние почты из пользовательского источника данных с основными и подробными данными.
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;
}
Смотрите также
- interface IMailMergeDataSource
- interface IMailMergeDataSourceRoot
- пространство имен Aspose.Words.MailMerging
- сборка Aspose.Words