Office Open XML (OOXML, DOCX, XLSX, PPTX) — серия форматов файлов для хранения электронных документов для офисных приложений — в частности, Microsoft Office. Достаточно продолжительное время, чтобы создать или отредактировать документ, например, Microsoft Word в своем приложении, нам приходилось использовать COM (Component Object Model). Используя эту модель, мы абстрагируемся от формата файла и используем такие объекты как Range, Table и так далее для работы с содержимым документа. При этом, мы взаимодействуем не просто с некоторым объектом в памяти, а с COM-объектом. Поэтому возникает необходимость завершать все процессы после окончания работы программы иначе мы получаем множество проблем и самая простая из них — «зависший» в памяти процесс того же MS Word. Ещё одним «подводным камнем» использования COM является то, что для использования объектной модели MS Office мы должны иметь установленный офисный пакет на компьютере пользователя, что не всегда возможно, особенно сейчас, когда госструктуры, предприятия, да и обычные пользователи всё чаще используют бесплатный софт с открытым исходным кодом. В таких условиях полагаться на то, что мы 100% сможем воспользоваться COM MS Office на компьютере пользователя нельзя и приходится искать обходные пути того, как создать или отредактировать документ. Одним из решений этой проблемы является использование Open XML SDK.
Office Open XML (также неофициально известный как OOXML, OpenXML) — это сжатый формат файлов на основе XML, разработанный компанией Microsoft для представления электронных таблиц, диаграмм, презентаций и текстовых документов.
Из чего состоит файл DOCX
Чтобы понять с чем мы будем иметь дело, создадим новый документ Microsoft Office Word, в который добавим всего одну строку «Hello World»
Теперь изменим расширение файла .docx на .zip и откроем полученный архив. В итоге мы увидим следующую структуру документа:
Внутри папок располагаются xml-файлы с различной служебной информацией по документу. Непосредственно, содержимое нашего документа расположено в файле \word\doucument.xml. Если открыть этот файл в любом текстовом редакторе, то мы увидим следующую его структуру:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex"
<--Тут множество пространств имен-->>
<w:body>
<w:p w14:paraId="4DC972FA" w14:textId="6348078F" w:rsidR="004578CF" w:rsidRPr="00533C1C" w:rsidRDefault="00533C1C">
<w:r>
<w:rPr>
<w:lang w:val="en-US"/>
</w:rPr>
<w:t>Hello World</w:t>
</w:r>
</w:p>
<w:sectPr w:rsidR="004578CF" w:rsidRPr="00533C1C">
<w:pgSz w:w="11906" w:h="16838"/>
<w:pgMar w:top="1134" w:right="850" w:bottom="1134" w:left="1701" w:header="708" w:footer="708" w:gutter="0"/>
<w:cols w:space="708"/>
<w:docGrid w:linePitch="360"/>
</w:sectPr>
</w:body>
</w:document>
Из представленного выше кода убрана часть с подключаемыми пространствами имен. Главное, на что стоит обратить внимание — это то, что, по сути, наш документ — это обычный XML-документ, который мы можем открывать в любом текстовом редакторе или в своем приложении, изменять его содержимое, сохранять и т.д. Таким образом, мы не зависим от того есть ли на компьютере пользователя установленный MS Office или нет — мы можем работать с документом в DOCX также, как с обычным XML-документом. Для удобства работы с документами в формате Open XML мы можем использовать различные пакеты, однако здесь мы будем рассматривать работу только с одним из них — DocumentFormat.OpenXml.
Пакет DocumentFormat.OpenXml
DocumentFormat.OpenXml — это библиотека от Microsoft, предназначенная для работы с документами Word, Excel и PowerPoint. Библиотека отличается высокой скоростью работы и заметно облегчает нам работу с офисными документами, но, при этом, не избавляет нас от необходимости знания самого формата Open XML.
Воспользуемся этой библиотекой и попробуем создать точно такой же документ, как мы создавали выше, используя MS Word. Для этого создадим новое консольное приложение C# и добавим в проект пакет DocumentFormat.OpenXml
Теперь изменим файл Program.cs следующим образом:
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
namespace OpenDocumentPocessor
{
internal class Program
{
static void Main(string[] args)
{
using WordprocessingDocument doc = WordprocessingDocument.Create("hello.docx", DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
MainDocumentPart mainPart = doc.AddMainDocumentPart();
mainPart.Document = new Document();
Body body = mainPart.Document.AppendChild(new Body());
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text("Hello World"));
}
}
}
здесь DocumentFormat.OpenXml.Packaging и DocumentFormat.OpenXml.Wordprocessing — пространства имен из библиотеки DocumentFormat.OpenXml, содержащие необходимые для работы объекты. Для работы с Word мы должны каким-либо образом создать объект типа WordprocessingDocument:
using WordprocessingDocument doc = WordprocessingDocument.Create("hello.docx", DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
В данном случае, мы создаем новый документ Word. Также, мы можем открывать уже существующие документы Word, считывать данные документа из потока и так далее. Все эти операции мы рассмотрим в дальнейшем. Далее стоит обратить внимание на то как создается структура документа Word
Основная структура документа состоит из следующих XML-элементов:
document— Корневой элемент основной части документа, который определяет основную структуру документа.body— Контейнер для сбора структур блочного уровня, составляющих документ.p— абзац.r— прогон в абзаце.t— фрагмент текста.
Именно такую структуру мы и воспроизводим в нашем коде:
создаем основную часть документа:
MainDocumentPart mainPart = doc.AddMainDocumentPart();
определяем основную структуру документа:
mainPart.Document = new Document();
создаем тело документа:
Body body = mainPart.Document.AppendChild(new Body());
в тело документа последовательно добавляем параграф, прогон и текст:
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text("Hello World"));
После этого рядом с exe-файлом нашего приложения появится новый документ с именем hello.docx, содержащий всего одну строку текста, как и на рисунке выше.
Этот простой пример демонстрирует то, каким образом нам в дальнейшем предстоит работать с документами Office. Здесь мы должны полностью воспроизводить структуру документа, используя подходы аналогичные тем, как при работе с XML.
Естественно, что DocumentFormat.OpenXml не ограничивается обычным добавлением текста в документы. Это достаточно большая библиотека с множеством возможностей, которые нам ещё предстоит рассмотреть в рамках этого руководства.
Итого
Office Open XML (OOXML, DOCX, XLSX, PPTX) — серия форматов файлов для хранения электронных документов для офисных приложений. Для работы с этим форматом в .NET/C# мы можем использовать различные пакеты, основной из которых — это DocumentFormat.OpenXml. Для работы с DocumentFormat.OpenXml мы должны знать структуру документа, чтобы правильно его создавать.


