Опрос
Вы участвуете в программе Windows Insider?
Популярные новости
Обсуждаемые новости

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

Напечатать страницу
02.08.2006 20:17 | lexa

Создание документов 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.

Источник: http://openxmldeveloper.org/
Перевод: lexa

Комментарии

Комментариев нет...
Для возможности комментировать войдите в 1 клик через

По теме

Акции MSFT
420.55 0.00
Акции торгуются с 17:30 до 00:00 по Москве
Все права принадлежат © ms insider @thevista.ru, 2022
Сайт является источником уникальной информации о семействе операционных систем Windows и других продуктах Microsoft. Перепечатка материалов возможна только с разрешения редакции.
Работает на WMS 2.34 (Страница создана за 0.076 секунд (Общее время SQL: 0.061 секунд - SQL запросов: 53 - Среднее время SQL: 0.00115 секунд))
Top.Mail.Ru