Создание пустых документов Open XML (Office 2007)

Автор: Topol Воскресенье, Май 6th, 2012 Нет комментариев

Рубрика: Операционные системы

Создание документов Open XML с использованием шаблона поможет упростить вашу работу и учесть изменения вида и предназначения документа, без изменения кода. Но в некоторых случаях вам понадобится создание пустого документа Open XML, без использования каких-либо шаблонов.

Следующие два поста помогут вам в создании пустых документов Open XML:

Пример программы CreatDOCX
Этот пост покажет в виде примера очень простую программу по созданию документа Office Open XML. Исходный код программы можно получить перейдя по следующей ссылке.

Синтаксис по использованию программы CreatDOCX показан справа. Это программа с командной строкой, использующей следующие два аргумента: имя создаваемого файла и текст, который нужно занести в файл. Программа создает выходной файл, используя .Net  API. Полученный документ может быть открыт с помощью Microsoft Office, но для создания документа Office не требуется.

Давайте взглянем, что же кроется под “капюшоном”. Первое на что стоит обратить – namespace, использующийся для markup документа:

Код:
string WordprocessingML = «http://schemas.openxmlformats.org/wordprocessingml/2006/3/main»;

Это namespace для WordprocessingML, использующийся в главной части тела(“start part”) документа. Далее мы создаем XML документ с структурой документа WordprocessingML(документ, тело, отступ и т.д.) вложенный в этом:

Код:
// create the start part, set up the nested structure …
XmlDocument xmlStartPart = new XmlDocument();
XmlElement tagDocument = xmlStartPart.CreateElement( «w:document» , WordprocessingML );
xmlStartPart.AppendChild( tagDocument );
XmlElement tagBody = xmlStartPart.CreateElement( «w:body» , WordprocessingML );
tagDocument.AppendChild( tagBody );
XmlElement tagParagraph = xmlStartPart.CreateElement( «w:p» , WordprocessingML );
tagBody.AppendChild( tagParagraph );
XmlElement tagRun = xmlStartPart.CreateElement( «w:r» , WordprocessingML );
tagParagraph.AppendChild( tagRun );
XmlElement tagText = xmlStartPart.CreateElement( «w:t» , WordprocessingML );
tagRun.AppendChild( tagText );

// insert text into the start part, as a «Text» node …
XmlNode nodeText = xmlStartPart.CreateNode(XmlNodeType.Text, «w:t», WordprocessingML);
nodeText.Value = BodyText;
tagText.AppendChild(nodeText);

Теперь, когда мы создали XML(“start part”) для документа, мы всего лишь нуждаемся в создании пакета(с API), добавив вступительную часть и задействовав совместимость.(Каждай чать должна иметь совместимость):

Код:
// create a new package (Open XML document) …
Package pkgOutputDoc = null;
pkgOutputDoc = Package.Open( fileName , FileMode.Create , FileAccess.ReadWrite );

// save the main document part (document.xml) …
Uri uri = new Uri( «/word/document.xml» , UriKind.Relative );
PackagePart partDocumentXML = pkgOutputDoc.CreatePart( uri,
«application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml» );
StreamWriter streamStartPart = new StreamWriter( partDocumentXML.GetStream( FileMode.Create , FileAccess.Write ) );
xmlStartPart.Save( streamStartPart );
streamStartPart.Close();
pkgOutputDoc.Flush();

// create the relationship part, close the document …
pkgOutputDoc.CreateRelationship(uri, TargetMode.Internal,
«http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument», «rId1″);
pkgOutputDoc.Flush();
pkgOutputDoc.Close();

Это все, что нам было нужно, данный код произведет документ DOCX, который можно будет просмотреть в Word 2007 или в др. программе для просмотра файлов Open XML. Заметьте, что для создания DOCX не обязательно нужно иметь Office 2007.

Пример программы CreatXlsx.
Данный пример является простым консольным приложением, использующим в качестве первого аргумента имя создаваемого файла, сопровождаемое рядом величин, которые будут записаны в ячейки. Величины, которые будут записаны в ячейки должны быть одного из следующих типов: integer или string.

Указанный документ создан и величины записаны в данный документ. Получившаяся крупноформатная таблица является документов Open XML, может быть открыт с помощью Excel 2007, как показано ниже.

Краткий обзор кода
В CreatXlsx всего пять методов, которые обеспечивают основные функциональные возможности:
- Main – обрабатывает аргументы командной строки, вызывающие CreatEmptyXlsx для имени файла и WriteCell для каждой величины, которая будет записана.
- CreatEmptyXlsx – создает пустую крупноформатную таблицу Open XML.
- WriteCell – вызывает соответствующий метод XLInset*, основанный на определении типа величины, являющейся integer или string.
- XLInsetNumberIntoCell – вставляет число.
- XLInsetStringIntoCell – вставляет строку.

Метод CreatEmptyXlsx
Сначала мы устанавливаем константы для namespace и типов, которые понадобятся:

Код:
const string spreadsheetML =
@»http://schemas.openxmlformats.org/spreadsheetml/2006/5/main»;
const string relationSchema =
@»http://schemas.openxmlformats.org/officeDocument/2006/relationships»;
const string workbookContentType =
@»application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml»;
const string worksheetContentType =
@»application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml»;
const string stylesheetContentType =
@»application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml»;
const string stringsContentType =
@»application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml»

Затем мы создаем минимальные части, необходимые нам для определения структуры документа SpreadsheetML. В памяти они создаются как объекты XmlDocument:

Код:
// create the workbook «start part»
XmlDocument xmlStartPart = new XmlDocument();
… add tags and attributes

// create the worksheet
XmlDocument xmlWorksheet = new XmlDocument();
… add tags and attributes

// create the style sheet
XmlDocument xmlStylesheet = new XmlDocument();
… add tags and attributes

// create the shared-strings table (with no entries in it)
XmlDocument xmlStrings = new XmlDocument();
… add tags and attributes

Теперь создадим сам пакет. Мы также создадим временную пустую часть, которая удалит все по окончанию. Вот код:

Код:
// create the package (i.e., the document container)
Package pkgOutputDoc = null;
pkgOutputDoc = Package.Open(fileName, FileMode.Create, FileAccess.ReadWrite);

// save a temporary part to create the default application/xml content type
Uri uriDefaultContentType = new Uri(«/default.xml», UriKind.Relative);
PackagePart partTemp = pkgOutputDoc.CreatePart(uriDefaultContentType, «application/xml»);

Теперь мы напишем части для пакета. Для начала мы сохраним “start part”:

Код:
// save the main document part (workbook.xml)
Uri uriStartPart = new Uri(«/xl/workbook.xml», UriKind.Relative);
PackagePart partWorkbookXML = pkgOutputDoc.CreatePart(uriStartPart, workbookContentType );
StreamWriter streamStartPart =
new StreamWriter(partWorkbookXML.GetStream(FileMode.Create, FileAccess.Write));
xmlStartPart.Save(streamStartPart);
streamStartPart.Close();
pkgOutputDoc.Flush();

Затем мы делаем тоже самое и для WorkSheet, StyleSheet и таблицы SharidStrings. Далее мы создаем совместимость для объединения всего и удаляем временную часть, созданную для установки типа по умолчанию и закрытия документа:

Код:
// create the relationship parts
pkgOutputDoc.CreateRelationship(uriStartPart,
TargetMode.Internal, relationSchema+»/officeDocument», «rId1″);
partWorkbookXML.CreateRelationship(uriWorksheet,
TargetMode.Internal, relationSchema + «/worksheet», «rId1″);
partWorkbookXML.CreateRelationship(uriStylesheet,
TargetMode.Internal, relationSchema + «/styles», «rId2″);
partWorkbookXML.CreateRelationship(uriStrings,
TargetMode.Internal, relationSchema + «/sharedStrings», «rId3″);

// remove the temporary part that created the default xml content type
pkgOutputDoc.DeletePart(uriDefaultContentType);

// close the document
pkgOutputDoc.Flush();
pkgOutputDoc.Close();

В данных постах вам предоставляются образцы и информация о том, как они работают. Образцы написаны на C#, но я постарался тщательно описать все детали, чтобы вы смогли создать тоже самое на любой другой платформе.

Скоро я начну собирать примеры о PresentationML, а так же мы будем публиковать другие примеры кода, но в настоящее время я опубликовал только два поста, если кто-либо захочет ими воспользоваться для создания Open XML.

Источник: thevista.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты