Откройте текстовый документ из потока
В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для программного открытия Word обработки документа из потока.
Открытие документа из потока
Если у вас есть приложение, например приложение SharePoint, которое работает с документами, использующими потоковые входные и выходные данные, и вы хотите использовать пакет SDK Open XML для работы с одним из документов, это легко сделать. Это особенно верно, если документ существует и его можно открыть с помощью пакета SDK Open XML. Однако предположим, что документ является открытым потоком в том месте кода, где необходимо использовать пакет SDK для работы с ним? Этот сценарий описывается в этом разделе. Пример метода в примере кода принимает открытый поток в качестве параметра, а затем добавляет текст в документ за потоком с помощью пакета SDK Open XML.
Создание объекта WordprocessingDocument
В пакете SDK WordprocessingDocument Open XML класс представляет пакет документов Word. Чтобы работать с документом Word, сначала создайте экземпляр WordprocessingDocument класса из документа, а затем работайте с этим экземпляром. После создания экземпляра класса можно получить доступ к основной части документа, которая содержит текст. Каждый пакет Open XML состоит из нескольких частей. Как минимум, объект должен содержать main часть документа, WordprocessingDocument которая выступает в качестве контейнера для main текста документа. Пакет также может содержать дополнительные части. Обратите внимание, что в документе Word текст в части документа main представлен в пакете в виде XML с помощью WordprocessingML
разметки.
Чтобы создать экземпляр класса из документа, вызовите Open(Stream, Boolean) метод . Предоставляется несколько Open
методов, каждый из которых имеет разную сигнатуру. В примере кода в этом разделе используется Open
метод с сигнатурой, требующей двух параметров. Первый параметр принимает ссылку на поток, из которого требуется открыть документ. Второй параметр — или true
false
и указывает, открыт ли поток для редактирования.
В следующем примере кода вызывается Open
метод .
// Open a WordProcessingDocument based on a stream.
using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(stream, true))
{
Структура документа WordProcessingML
Базовая структура WordProcessingML
документа состоит из document
элементов и body
, за которыми следует один или несколько элементов уровня блока, таких как p
, который представляет абзац. Абзац содержит один или несколько r
элементов. Представляет r
собой область текста с общим набором свойств, таких как форматирование. Выполнение содержит один или несколько t
элементов. Элемент t
содержит диапазон текста. В следующем примере кода показана разметка WordprocessingML
для документа, содержащего текст "Пример текста".
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:r>
<w:t>Example text.</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
С помощью пакета SDK Open XML можно создавать структуру документа и содержимое с помощью строго типизированных классов, соответствующих WordprocessingML
элементам. Эти классы находятся в пространстве имен. В следующей таблице перечислены имена классов, которые соответствуют document
элементам , body
, p
, r
и t
.
Элемент WordprocessingML | Класс пакета SDK Open XML | Описание |
---|---|---|
<document/> |
Document | Корневой элемент основной части документа. |
<body/> |
Body | Контейнер для структур уровня блокировки, таких как абзацы, таблицы, примечания и других элементов, описанных в спецификации ISO/IEC 29500. |
<p/> |
Paragraph | Абзац. |
<r/> |
Run | Прогон. |
<t/> |
Text | Диапазон текста. |
Дополнительные сведения об общей структуре частей и элементов документа WordprocessingML см. в разделе Структура документа WordprocessingML.
Механизм работы примера кода
После открытия пакета документа Word в основную часть документа можно добавить текст. Чтобы получить доступ к тексту части документа main, необходимо назначить ссылку на текст документа, как показано в следующем сегменте кода.
// Assign a reference to the document body.
MainDocumentPart mainDocumentPart = wordprocessingDocument.MainDocumentPart ?? wordprocessingDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());
При доступе к тексту части документа main добавьте текст, добавив экземпляры Paragraphклассов , Runи Text . При этом создается необходимая WordprocessingML
разметка. В приведенном ниже примере кода добавляются абзац, пробег и текст.
// Add new text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text(txt));
Пример кода
Приведенный здесь пример OpenAndAddToWordprocessingStream
метода можно использовать для открытия документа Word из уже открытого потока и добавления текста с помощью пакета SDK Open XML. Для вызова этого метода передайте ссылку на открытый поток в качестве первого параметра, а текст в качестве второго параметра. Например, в следующем примере кода открывается файл, указанный в первом аргументе, и в него добавляется текст из второго аргумента.
string filePath = args[0];
string txt = args[1];
using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
{
OpenAndAddToWordprocessingStream(fileStream, txt);
}
Примечание.
Обратите внимание, что OpenAddAddToWordprocessingStream
метод не закрывает передаваемый ему поток. Вызывающий код должен сделать это путем упаковки вызова метода в using
оператор или явного вызова Dispose.
Ниже приведен полный пример кода на языках C# и Visual Basic.
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System.IO;
static void OpenAndAddToWordprocessingStream(Stream stream, string txt)
{
// Open a WordProcessingDocument based on a stream.
using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(stream, true))
{
// Assign a reference to the document body.
MainDocumentPart mainDocumentPart = wordprocessingDocument.MainDocumentPart ?? wordprocessingDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());
// Add new text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text(txt));
}
// Caller must close the stream.
}