.NET / Быстрое создание и чтение документов MS Office 2007/2010 из 1С: Предприятие 8

в 7:51, , рубрики: .net, .net 4.0, 1c 8.2, 1c:предприятие, net framework, open xml, openxml, openxml sdk, метки: , , , , , , ,

.NET / Быстрое создание и чтение документов MS Office 2007/2010 из 1С: Предприятие 8
Метод позволяет быстро создавать и читать документы Word, Excel и PowerPoint напрямую из 1С: Предприятие 8 без установленного Microsoft Office 2007/2010. Скорость создания документов в несколько раз выше, чем традиционное создание через COM/OLE. Статья продолжает серию примеров применения на практике 1С.Net: Предприятие. В статье используется разработка Open XML SDK. Для работы примера необходимы установленные .Net framework 4.0 и Elisy .Net Bridge 4.0.3 и выше. Пример, сопровождаемый статью, написан для 1С: Предприятие 8.2.13.
Стандарт Office Open Xml

Формат Office Open XML (Open Xml) – это формат XML-файлов, помещенных в zip-архив для представления текстовых документов и документов электронных таблиц, диаграмм, презентаций. Компания Microsoft выступила одним из спонсоров сертификации этого стандарта в 2005 году. Результирующий стандарт ISO/IEC 29500:2008 в четырех частях был опубликован в ноябре 2008 года. Начиная с Microsoft Office 2007, формат Office Open Xml стал основным форматом для представления файлов Word, Excel и PowerPoint. Данный формат поддерживают многие аналогичные популярные системы, такие как: OpenOffice, KOffice, Google Docs, WordPerfect и др.
Для программного доступа Microsoft выпустила .Net-библиотеку, включив ее в Open Xml SDK (текущая версия 2.0). Таким образом, Open Xml SDK является альтернативным программным доступом к созданию и чтению документов MS Office. Основным методом программного доступа к файлам Excel, Word и PowerPoint из 1С: Предприятие всегда оставался доступ через COM/OLE.
Описание примера

Пример состоит из внешний обработки для 1С: Предприятие 8.2.13, состоящей из управляемой формы и макета. Пример написан, чтобы показать создание простого docx-документа. Форма содержит 2 элемента управления: поле для ввода пути к файлу docx и кнопку «Создать», а также строковое свойство ПутьКФайлу, привязанное к полю ввода пути.
В обработку в качестве макета вложена.Net-сборка DocumentFormat.OpenXml.dll большого размера (5Мбайт) из проекта Open Xml SDK. Эта сборка заключает в себе огромную функциональность. Точное количество собранных в нее классов неизвестно, но ориентировочно библиотека состоит из порядка 70 пространств имен в среднем по 50 классов в каждом. То есть получается, что вся функциональность реализована через 3500 классов.
Открытие формы сопровождается вызовом обработчика события ПриОткрытии:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьВнешнююКомпоненту("Elisy.NetBridge4");
AddIn = New("AddIn.ElisyNetBridge4");
net = AddIn.GetNet();
//net = Новый COMОбъект("Elisy.NetBridge4");

if (net.Version.CompareTo(net.New("System.Version", "4.0.3.0")) < 0) then
Message("Требуется версия Elisy .Net Bridge 4.0.3.0 и выше");
return;
endif;

Макет = ПолучитьМакет("DocumentFormat_OpenXml_dll");
ДвоичныеДанные = Base64String(Макет);
assemblyBytes = net.CallStatic("System.Convert", "FromBase64String", ДвоичныеДанные);
net.CallStatic("System.Reflection.Assembly", "Load", assemblyBytes);

КонецПроцедуры

Событие инициализирует внешний компонент Elisy .Net Bridge, проверяет его версию: версия должна быть не ниже 4.0.3. В более старых версиях .Net Bridge нет возможности вызова универсальных методов, поэтому с ними работать пример не будет.
Далее из макета извлекается вложенная сборка DocumentFormat.OpenXml.dll, переводится в Base64-кодировку, чтобы .Net framework смог воспринять массив байт. Из Base64-формата сборка превращается в массив .Net-байт, который загружается через вызов Assembly.Load.
В примере для простоты макет-сборка передается на клиент, который осуществляет ее загрузку локально. В реальной базе может стать нереальной передача 5 мегабайтной сборки по сети от сервера многим клиентам. В этом случае обработку выгрузки документов следует перевести на сервер 1С.
За создание документа Word отвечает процедура СоздатьФайл, которая вызывает вспомогательные функции GenerateExtendedFilePropertiesPart1 и GenerateMainDocumentPart1.
&НаКлиенте
Процедура СоздатьФайл(Команда)

parent = net.CallStatic("DocumentFormat.OpenXml.Packaging.WordprocessingDocument", "Create", ПутьКФайлу, net.New("DocumentFormat.OpenXml.WordprocessingDocumentType").Document);

extendedFilePropertiesPart1 = parent.AddNewPart(net.T("DocumentFormat.OpenXml.Packaging.ExtendedFilePropertiesPart"), "rId3");
GenerateExtendedFilePropertiesPart1().Save(extendedFilePropertiesPart1);

mainDocumentPart1 = parent.AddMainDocumentPart();
GenerateMainDocumentPart1().Save(mainDocumentPart1);

parent.Dispose();

КонецПроцедуры

Здесь создается файл из реквизита ПутьКФайлу через вызов статического метода WordprocessingDocument.Create. (Если необходима загрузка, то за загрузку файла отвечает еще один статический метод WordprocessingDocument.Open). Заполняются свойства файла в функции формы GenerateExtendedFilePropertiesPart1. И создаются непосредственно элементы документа в функции GenerateMainDocumentPart1. В общем приближении создание элементов документа выглядит так:
body = net.New("DocumentFormat.OpenXml.Wordprocessing.Body",
net.New("DocumentFormat.OpenXml.Wordprocessing.Paragraph",
net.New("DocumentFormat.OpenXml.Wordprocessing.ParagraphProperties",
net.New("DocumentFormat.OpenXml.Wordprocessing.SuppressAutoHyphens"),
spacingBetweenLines.CloneNode(true),
indentation.CloneNode(true),
justificationCenter.CloneNode(true)
),
net.New("DocumentFormat.OpenXml.Wordprocessing.Run",
net.New("DocumentFormat.OpenXml.Wordprocessing.RunProperties",
runFonts.CloneNode(true),
net.New("DocumentFormat.OpenXml.Wordprocessing.Bold"),
net.New("DocumentFormat.OpenXml.Wordprocessing.BoldComplexScript")
),
net.New("DocumentFormat.OpenXml.Wordprocessing.Text", "Office Open XML")
)
),
net.New("DocumentFormat.OpenXml.Wordprocessing.Paragraph",
net.New("DocumentFormat.OpenXml.Wordprocessing.ParagraphProperties",
net.New("DocumentFormat.OpenXml.Wordprocessing.SuppressAutoHyphens"),
justificationBoth.CloneNode(true)

Полный код можно посмотреть в самой внешней обработке-примере. Здесь же необходимо отметить, что таким образом строится иерархия элементов:
Body
Paragraph
ParagraphProperties
SuppressAutoHyphens
SpacingBetweenLines
Indentation
JustificationCenter
Run
RunProperties
RunFonts
Bold
BoldComplexScript
Text
Paragraph
ParagraphProperties
SuppressAutoHyphens
SpacingBetweenLines
Indentation
JustificationCenter
Run
RunProperties
RunFonts
Bold
BoldComplexScript
Text

Это простейшая структура. В более сложных решениях могут быть использованы таблицы, рисунки, гиперссылки и другие элементы.
В результате работы примера получится простой документ Word 2007:
Дальнейшее изучение

Есть огромное количество элементов, которые отвечают за построение Open Xml-документов. Только для документов Word их около 900. А иерархия элементов, из которых состоят документы Microsoft Office 2007/2010, может быть очень разветвленной. Как же во всем этом ориентироваться?
В Open Xml SDK были включены утилиты для сравнения Open Xml-файлов, просмотрщик классов и Document Reflector — генератор C#-кода на основе документов.
Самым полезным инструментом является Document Reflector. Он позволяет открыть документ и, кликнув на элемент Package, получить полный код на языке C#. Несмотря на некоторую избыточность, этот код позволит ориентироваться в том, как программно организовать создание документа. Внешне код, полученный через утилиту Documet Reflector, будет выглядеть так:
private static Document GenerateMainDocumentPart1()
{
var element =
new Document(
new Body(
new Paragraph(
new ParagraphProperties(
new SuppressAutoHyphens(),
new SpacingBetweenLines(){ Line = 240, LineRule = LineSpacingRuleValues.Auto },
new Indentation(){ Left = 709, Hanging = (UInt64Value)425UL },
new Justification(){ Val = JustificationValues.Center },
new ParagraphMarkRunProperties(
new RunFonts(){ Ascii = "Arial", HighAnsi = "Arial", ComplexScript = "Arial" },
new Bold(),
new BoldComplexScript(),
new NoProof())),
new Run(
new RunProperties(
new RunFonts(){ Ascii = "Arial", HighAnsi = "Arial", ComplexScript = "Arial" },
new Bold(),
new BoldComplexScript()),
new Text("Заголовок")
){ RsidRunProperties = "00887420" },
new Run(
new RunProperties(
new RunFonts(){ Ascii = "Arial", HighAnsi = "Arial", ComplexScript = "Arial" },
new Bold(),
new BoldComplexScript(),

Заключение

Предложенный метод создания документов Word, Excel и PowerPoint является альтернативным методом программного создания и чтения документов Microsoft Office 2007/2010. Метод дает более производительные результаты по сравнению с генерацией документов через COM/OLE. Есть данные о 10-кратном увеличении производительности при генерации некоторых видов документов. Вторым отличительным моментом является то, что на компьютере не требуется устанавливать дорогостоящий продукт MS Office. По трудоемкости метод не сложнее генерации документов через COM/OLE. Формат Open Xml достаточно распространен и поддерживается многими современными системами.
К статье прилагается пример, наглядно демонстрирующий генерацию простейшего docx-документа. Пример создан на базе 1С версии 8.2, но может быть повторен на более старой версии 8.1. В пример зашита библиотека из проекта Open Xml SDK.
Пример может быть переделан или доработан следующим образом. «Тяжелая» в 5 Мбайт сборка может быть помещена в глобальное хранилище сборок или локально на диск. В этом случае не нужно будет двойное преобразование из base64 в массив байт при инициализации.
Пример может быть доработан и на уровне генерации макета. Код генерации макета может быть вынесен из 1С кода и оставлен в виде C# (результат работы утилиты Document Reflector). Такой подход тоже возможен, так как 1C.Net: Предприятие позволяет компилировать код C# «на лету». Но в зависимости от реализации может потребоваться организация дополнительного домена приложений, чтобы вовремя освобождать память после генерации документа.
Еще один вариант получения макета – это вложение docx- или xlsx-файла в макет и загрузка его через соответствующие статические методы. Таким образом можно получить объект-шаблон и обращаться ко всем его методам и свойствам из 1С: Предприятие.
Дополнительные сведения можно найти здесь:
Общие сведения о формате Office Open Xml на английском

Описание проекта Office Xml SDK

Генерируем OfficeOpenXML-документы за 5 минут

Создание отчётов при помощи Open XML Format SDK

CreateOpenXml.epf (1.87 mb)

  1. В.Соболев:

    Нет ссылки на CreateOpenXml.epf. Можете мне обработку на почту vswork2@mail.ru прислать (или ссылку на обработку)? Большое спасибо.

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js