Шаблон экспорта, Настройка с использованием C#


В Comindware Platform помимо стандартной выгрузки отчётов предусмотрен экспорт данных с использованием скриптов на C#. Этот вариант позволяет более гибко настроить параметры экспортируемого файла, например, с дополнительной фильтрацией или заменой информации, либо с форматированным выводом атрибутов-коллекций.

Шаблон документа в формате .xls

Рассмотрим решение следующей задачи: написать скрипт, который формирует Excel-файл, в котором каждый элемент коллекции располагается в отдельной строчке (по умолчанию все элементы коллекции перечисляются в одной строчке через пробел).

  1. Для начала создайте шаблон экспорта по типу:

Пример excel шаблона экспорта

Пример excel шаблона экспорта

&=data.свойство_класса (Свойства класса — структура подготовки данных, которые определяются в С# скрипте)

Формат ячеек в Excel

В Excel-файле обязательно укажите подходящий формат полей, иначе данные выгрузятся некорректно. Для чисел используйте числовой формат, для дат и времени — формат даты.

Поля «Клиент», «Контактное лицо», «Телефон» и «Email» будут заполняться из атрибутов записей шаблона «Клиенты». Поле «Договор» — коллекция в шаблоне записей «Клиенты», поле «Статус» — справочник статусов в отдельном шаблоне.

  1. Добавьте созданный шаблон экспорта в текущий шаблон записи (в данном случае, «Клиенты»):

Расположение раздела «Шаблоны экспорта»

Расположение раздела «Шаблоны экспорта»
  1. В этом же шаблоне записи автоматически добавится кнопка с операцией «Экспорт записи»:

Автоматически созданная кнопка

Автоматически созданная кнопка

Перейдите на вкладку «Скрипт» в свойствах этой кнопки и добавьте следующий код:

using System; 
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Comindware.Data.Entity;
using Comindware.TeamNetwork.Api.Data.UserCommands;
using Aspose.Cells;
using Aspose.Cells.Pivot;

class Script
{
public static UserCommandResult Main(UserCommandContext userCommandContext)
{
var objectsData = Api.TeamNetwork.ObjectService.ListWithAlias("Clients"); // Системное имя ШЗ "Клиенты"
var dataToExport = new List<MainData>();
foreach (var objectDict in objectsData)
{
var ContractDataInIds = getterListSTR("Contracts_collection", objectDict); // Атрибут-коллекция в ШЗ "Клиенты"
if(ContractDataInIds.Count == 0) {ContractDataInIds.Add("tempID");}
var ContractDataInList = new List<ContractData>();
foreach (var ContractDataInId in ContractDataInIds)
{
var ContractDataInData = GetData(ContractDataInId);

var Status_Id = getterSTR("Status", ContractDataInData); // Атрибут-ссылка в ШЗ "Договоры"
var Status_Data = GetData(Status_Id);

var ContractDataInT = new ContractData
{
Name = getterSTR("Title", ContractDataInData), // Атрибут "Статус" в ШЗ "Договоры"
Date = getterDT("Date", ContractDataInData), // Атрибут "Дата" в ШЗ "Договоры"
Total = getterDC("Total", ContractDataInData), // Атрибут "Сумма" в ШЗ "Договоры"
Status = getterSTR("Title", Status_Data) // Атрибут "Название" в ШЗ "Статусы договора"
};
ContractDataInList.Add(ContractDataInT);
}

var Data_ = new MainData
{
Client = getterSTR("Title", objectDict), // Атрибут "Название" в ШЗ "Клиенты"
Contact = getterSTR("Contact", objectDict), // Атрибут "Контактное лицо" в ШЗ "Клиенты"
Phone = getterSTR("Phone", objectDict), // Атрибут "Телефон" в ШЗ "Клиенты"
Email = getterSTR("Email", objectDict), // Атрибут "Email" в ШЗ "Клиенты"
Contract = ContractDataInList
};
dataToExport.Add(Data_);
}

var content = Api.TeamNetwork.ObjectAppExportService.ExecuteExcelExportTemplate(userCommandContext.DocumentTemplateId, dataToExport);
var result = new UserCommandResult
{
Success = true,
Commited = true,
ResultType = UserCommandResultType.File,
File = new UserCommandFileResult()
{
Name = "Excel_Data.xlsx",
Type = "Excel",
Content = content
},
Messages = new[]
{
new UserCommandMessage
{
Severity = SeverityLevel.Normal,
Text = "Файл сформирован"
}
}
};
return result;
}

public static Decimal getterDC(string key, IDictionary<string, object> dictionary = null)
{
if (dictionary == null || key == null)
{
return 0;
}
var stringValue = getterSTR(key, dictionary);
if (stringValue != null && Decimal.TryParse(stringValue, out var result))
{
return result;
}
else
{
return 0;
}
}

public static DateTime? getterDT(string key, IDictionary<string, object> dictionary = null)
{
if (dictionary == null || key == null)
{
return null;
}
var stringValue = getterSTR(key, dictionary);
if (stringValue != null && DateTime.TryParse(stringValue, out var result))
{
return result.AddHours(5);
}
else
{
return null;
}
}

public static string getterSTR(string key, IDictionary<string, object> dictionary = null)
{
if (dictionary == null || key == null)
{
return null;
}
if (dictionary.TryGetValue(key, out var result))
{
if (result == null) return null;
return result.ToString();
}
else
{
return null;
}
}

public static IList<string> getterListSTR(string key, IDictionary<string, object> dictionary = null)
{
var result = new List<string>();
if (dictionary != null && key != null)
{
if (dictionary.TryGetValue(key, out var objectData))
{
var objectDataArray = objectData as object[];
foreach (var singlObject in objectDataArray)
{
if (singlObject == null) continue;
result.Add(singlObject.ToString());
}
}
}
return result;
}

public static IDictionary<string, object> GetData(string objectId = null)
{
if (objectId == null || objectId.Contains("account") || objectId == "tempID")
{
return null;
}
var container = Api.TeamNetwork.ObjectAppService.GetByObject(objectId);
var result = Api.TeamNetwork.ObjectService.GetWithAlias(container.Alias, objectId);
return result;
}
}

[Serializable]
public class MainData
{
public string Client { get; set; }
public string Contact { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
public List<ContractData> Contract { get; set; }
}

[Serializable]
public class ContractData
{
public string Name { get; set; }
public decimal Total { get; set; }
public DateTime? Date { get; set; }
public string Status { get; set; }
}

Здесь:

В скрипте используются системные имена шаблонов и атрибутов из примера. Замените их на значения из вашего приложения.

Значение Описание
Clients Системное имя шаблона записи «Клиенты».
Contracts_collection Системное имя атрибута-коллекции в шаблоне записи «Клиенты».
Status Системное имя атрибута типа «Запись» в шаблоне записи «Договоры».
Title Системное имя атрибута «Название» в шаблонах «Клиенты», «Договоры» и «Статусы договора».
Date Системное имя атрибута «Дата» в шаблоне записи «Договоры».
Total Системное имя атрибута «Сумма» в шаблоне записи «Договоры».
Contact Системное имя атрибута «Контактное лицо» в шаблоне записи «Клиенты».
Phone Системное имя атрибута «Телефон» в шаблоне записи «Клиенты».
Email Системное имя атрибута «Email» в шаблоне записи «Клиенты».

Как выглядят данные в продукте:

Таблица со списком клиентов

Таблица со списком клиентов

Результат выгрузки:

Excel файл

Excel файл

Шаблон документа в формате .doc

По такой же логике настраиваем выгрузку  Шаблона экспорта в формате Word.

Отличием здесь будет немного иное написание самого шаблона, а также C# скрипта.

Пример word шаблона экспорта

Пример word шаблона экспорта

C# скрипт:

using System; 
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text.RegularExpressions;
using Comindware.Data.Entity;
using Comindware.Platform.Api.Data;
using Comindware.TeamNetwork.Api.Data.UserCommands;
using System.IO;
using System.Data;

class Script
{
public static UserCommandResult Main(UserCommandContext userCommandContext, Comindware.Entities entities)
{
var objectsData = Api.TeamNetwork.ObjectService.ListWithAlias("Clients"); // Системное имя ШЗ "Клиенты"
List<MainData> Data_ = new List<MainData>();
foreach (var objectDict in objectsData)
{
var ContractDataInIds = getterListSTR("Contracts_collection", objectDict); // Атрибут-коллекция в ШЗ "Клиенты"
if(ContractDataInIds.Count == 0) {ContractDataInIds.Add("tempID");}
bool first_element = true;
foreach (var ContractDataInId in ContractDataInIds)
{
var ContractDataInData = GetData(ContractDataInId);

var Status_Id = getterSTR("Status", ContractDataInData); // Атрибут-ссылка в ШЗ "Договоры"
var Status_Data = GetData(Status_Id);

if(first_element == true)
{
first_element = false;
var temp = new MainData
{
Client = getterSTR("Title", objectDict), // Атрибут "Название" в ШЗ "Клиенты"
Contact = getterSTR("Contact", objectDict), // Атрибут "Контактное лицо" в ШЗ "Клиенты"
Phone = getterSTR("Phone", objectDict), // Атрибут "Телефон" в ШЗ "Клиенты"
Email = getterSTR("Email", objectDict), // Атрибут "Email" в ШЗ "Клиенты"

Name = getterSTR("Title", ContractDataInData), // Атрибут "Статус" в ШЗ "Договоры"
Date = getterDT("Date", ContractDataInData), // Атрибут "Дата" в ШЗ "Договоры"
Total = getterDC("Total", ContractDataInData), // Атрибут "Сумма" в ШЗ "Договоры"
Status = getterSTR("Title", Status_Data) // Атрибут "Название" в ШЗ "Статусы договора"
};
Data_.Add(temp);
}
else
{
var temp = new MainData
{
Name = getterSTR("Title", ContractDataInData), // Атрибут "Статус" в ШЗ "Договоры"
Date = getterDT("Date", ContractDataInData), // Атрибут "Дата" в ШЗ "Договоры"
Total = getterDC("Total", ContractDataInData), // Атрибут "Сумма" в ШЗ "Договоры"
Status = getterSTR("Title", Status_Data) // Атрибут "Название" в ШЗ "Статусы договора"
};
Data_.Add(temp);
}
}
}

var dataToExport = new RESULT
{
MainData_ = Data_
};

var content = Api.TeamNetwork.ObjectAppExportService.ExecuteWordExportTemplate(userCommandContext.DocumentTemplateId,dataToExport,false);

var result = new UserCommandResult
{
Success = true,
Commited = true,
File = new UserCommandFileResult()
{
Content = content,
Name = "Word_Data.doc",
Type = "Word"
},
ResultType = UserCommandResultType.Notificate,
Messages = new[]
{
new UserCommandMessage
{
Severity = SeverityLevel.Normal,
Text = "Документ сформирован"
}
}
};
return result;
}

public static Decimal getterDC(string key, IDictionary<string, object> dictionary = null)
{
if (dictionary == null || key == null)
{
return 0;
}
var stringValue = getterSTR(key, dictionary);
if (stringValue != null && Decimal.TryParse(stringValue, out var result))
{
return result;
}
else
{
return 0;
}
}

public static DateTime? getterDT(string key, IDictionary<string, object> dictionary = null)
{
if (dictionary == null || key == null)
{
return null;
}
var stringValue = getterSTR(key, dictionary);
if (stringValue != null && DateTime.TryParse(stringValue, out var result))
{
return result.AddHours(5);
}
else
{
return null;
}
}

public static string getterSTR(string key, IDictionary<string, object> dictionary = null)
{
if (dictionary == null || key == null)
{
return null;
}
if (dictionary.TryGetValue(key, out var result))
{
if (result == null) return null;
return result.ToString();
}
else
{
return null;
}
}

public static IList<string> getterListSTR(string key, IDictionary<string, object> dictionary = null)
{
var result = new List<string>();
if (dictionary != null && key != null)
{
if (dictionary.TryGetValue(key, out var objectData))
{
var objectDataArray = objectData as object[];
foreach (var singlObject in objectDataArray)
{
if (singlObject == null) continue;
result.Add(singlObject.ToString());
}
}
}
return result;
}

public static IDictionary<string, object> GetData(string objectId = null)
{
if (objectId == null || objectId.Contains("account") || objectId == "tempID")
{
return null;
}
var container = Api.TeamNetwork.ObjectAppService.GetByObject(objectId);
var result = Api.TeamNetwork.ObjectService.GetWithAlias(container.Alias, objectId);
return result;
}
}

[Serializable]
public class MainData
{
public string Client { get; set; }
public string Contact { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
public string Name { get; set; }
public decimal Total { get; set; }
public DateTime? Date { get; set; }
public string Status { get; set; }
}

public class RESULT
{
public List<MainData> MainData_ { get; set; }
}

Результат выгрузки:

Файл в формате Word

Файл в формате Word
К началу


Номер Статьи: 4793
Размещено: Tue, Dec 14, 2021
Последнее обновление: Sat, Jun 20, 2026

Online URL: https://kb.comindware.ru/article/shablon-eksporta-nastrojka-s-ispolzovaniem-c-4793.html