В статье разберу рекомендации, как уменьшить размер пакета разработки, если в прикладном коде используются сторонние библиотеки, которые поставляются в составе платформы Sungero, то есть уже имеются в bin-каталогах сервисов Directum RX.
Начнем с поставленной задачи.
Необходимо загрузить Общероссийский классификатор занятий (ОКЗ) в одноименный справочник в Directum RX. ОКЗ хранится в Excel-файле. Механизм загрузки должен запускаться клиентскими средствами без использования утилит.
Есть два варианта решения:
Я не претендую на инновацию, потому как подобные обертки есть в коробочном решении, например, Sungero.AsposeExtensions.dll в сторонних библиотеках модуля Sungero.Docflow. Просто мне кажется, использование таких оберток имеют ряд плюсов, поэтому родилась идея написать статью-инструкцию как это использовать в своих проектах.
Минусы использования первого варианта:
Плюсы использования второго варианта:
Создаем проект в Visual Studio, выбираем шаблон проекта.
public class RowRCO
{
public int NumberRow;
public string Code;
public string ControlNumber;
public string NameGroup;
}
public class GetDataFromExcel
{
public static List<RowRCO> GetExcelRows(Stream inputStream, int nrowstart)
{
var result = new List<RowRCO>();
using (var document = SpreadsheetDocument.Open(inputStream, false))
{
var workbookPart = document.WorkbookPart;
var stringTablePart = workbookPart.GetPartsOfType<SharedStringTablePart>().First();
var stringTable = stringTablePart.SharedStringTable;
var worksheetPart = workbookPart.WorksheetParts.First();
var sheet = worksheetPart.Worksheet;
var cells = sheet.Descendants<Cell>();
var rows = sheet.Descendants<Row>();
var maxElements = rows.First().Elements<Cell>().Count();
//определим количество строк
int counRows = GetCountRows(rows, nrowstart, stringTable);
int irow = 1;
foreach (var row in rows)
{
if (irow < nrowstart) { irow++; continue; }
var columnsValue = GetColumnsValue(row, stringTable);
var element = new RowRCO()
{
NumberRow = irow,
Code = GetValueCell(columnsValue, 0),
ControlNumber = GetValueCell(columnsValue, 1),
NameGroup = GetValueCell(columnsValue, 2)
};
result.Add(element);
irow++;
if (irow >= counRows + nrowstart)
break;
}
}
return result;
}
}
Logger.Debug("LoadingRCO: Начало импорта ОКЗ");
List<Armadoc.OpenXMLExtensions.RowRCO> dataFromExcel;
try
{
using (var inputStream = new System.IO.MemoryStream())
{
document.LastVersion.Body.Read().CopyTo(inputStream);
dataFromExcel = Armadoc.OpenXMLExtensions.GetDataFromExcel.GetExcelRows(inputStream, document.NumberStartImport.Value);
}
}
catch (Exception ex)
{
Logger.ErrorFormat("LoadingRCO: Ошибка при получении данных: {0}", ex.ToString());
throw AppliedCodeException.Create(string.Format("Ошибка при получении данных: {0}", ex.Message));
}
В конкретном примере обертка получилась размером 7,5 КБ, что значительно меньше размера 5,74 МБ библиотеки DocumentFormat.OpenXml.dll. Также отмечу, что размер пакета будет зависеть от области действия сторонней сборки. Например, если выбрать «Только сервер», то размер пакета примерно увеличиться на 5,74 МБ, а если выбрать «Клиент и сервер», то размер пакета будет увеличен уже на 11,48 МБ. В нашем же случае при использовании обертки пакет будет увеличен на 7,5 КБ и 15 КБ для «Только сервер» и «Клиент и сервер» соответственно.
Ну тут скорей вопрос к разработчикам DDS - почему не пробрасываются и так доступные библиотеки платформы в область видимости. Благо в новых версиях (4.6+) стали хотя бы в изолированные области х пробрасывать.
Авторизуйтесь, чтобы написать комментарий