Поделиться через


Вставьте таблицу в текстовый документ

В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для программной вставки таблицы в текстовый документ.

Получение объекта WordprocessingDocument

Чтобы открыть существующий документ, создайте WordprocessingDocument экземпляр класса, как показано в следующей using инструкции. В той же инструкции откройте текстовый файл по указанному пути к файлу с помощью Open метода с логическим параметром , чтобы true включить редактирование документа.

using (WordprocessingDocument doc = WordprocessingDocument.Open(fileName, true))

В версии 3.0.0+ Close() метод был удален в пользу использования инструкции using. Это гарантирует, что Dispose() метод автоматически вызывается при достижении закрывающей фигурной скобки. Блок, следующий за инструкцией using, создает область для объекта, создаваемого или именуемого в инструкции using. WordprocessingDocument Так как класс в пакете SDK open XML автоматически сохраняет и закрывает объект в рамках его IDisposable реализации, а так как Dispose() вызывается автоматически при выходе из блока, не нужно явно вызывать Save() или Dispose() до тех пор, пока вы используете инструкцию using .

Структура таблицы

Базовая структура WordProcessingML документа состоит из document элементов и body , за которыми следует один или несколько элементов уровня блока, таких как p, который представляет абзац. Абзац содержит один или несколько r элементов. Элемент r представляет поток — область текста с общим набором свойств, например для форматирования. Выполнение содержит один или несколько t элементов. Элемент t содержит диапазон текста. Документ может содержать таблицу, как показано в этом примере. Таблица — это набор абзацев (и других элементов уровня блока), размещенных в строках и столбцах. Таблицы в WordprocessingML определяются с помощью tbl элемента , который аналогичен тегу таблицы HTML. Рассмотрим пустую таблицу с одной ячейкой (т. е. таблицу с одной строкой, одним столбцом) и границами с одной точкой со всех сторон. Эта таблица представлена следующим WordprocessingML сегментом разметки.

    <w:tbl>
      <w:tblPr>
        <w:tblW w:w="5000" w:type="pct"/>
        <w:tblBorders>
          <w:top w:val="single" w:sz="4" w:space="0" w:color="auto"/>
          <w:left w:val="single" w:sz="4" w:space="0" w:color="auto"/>
          <w:bottom w:val="single" w:sz="4" w:space="0" w:color="auto"/>
          <w:right w:val="single" w:sz="4" w:space="0" w:color="auto"/>
        </w:tblBorders>
      </w:tblPr>
      <w:tblGrid>
        <w:gridCol w:w="10296"/>
      </w:tblGrid>
      <w:tr>
        <w:tc>
          <w:tcPr>
            <w:tcW w:w="0" w:type="auto"/>
          </w:tcPr>
          <w:p/>
        </w:tc>
      </w:tr>
    </w:tbl>

В этой таблице указываются свойства для всей таблицы, равные 100 % ширины страницы с помощью tblW элемента, набор границ таблицы с помощью tblBorders элемента, сетка таблицы, которая определяет набор общих вертикальных ребер в таблице с помощью tblGrid элемента и одну строку таблицы с помощью tr элемента .

Механизм работы примера кода

В примере кода после открытия документа в инструкции using создается новый Table объект . Затем вы создаете TableProperties объект и указываете сведения о его границе. Класс TableProperties содержит перегруженный конструктор TableProperties() , который принимает params массив типа OpenXmlElement. Код использует этот конструктор для создания экземпляра объекта с BorderType объектами для каждой TableProperties границы, создавая каждый BorderType экземпляр и указывая его значение с помощью инициализаторов объектов. После создания экземпляра добавьте объект в TableProperties таблицу.

// Create an empty table.
Table table = new Table();

// Create a TableProperties object and specify its border information.
TableProperties tblProp = new TableProperties(
    new TableBorders(
        new TopBorder()
        {
            Val =
            new EnumValue<BorderValues>(BorderValues.Dashed),
            Size = 24
        },
        new BottomBorder()
        {
            Val =
            new EnumValue<BorderValues>(BorderValues.Dashed),
            Size = 24
        },
        new LeftBorder()
        {
            Val =
            new EnumValue<BorderValues>(BorderValues.Dashed),
            Size = 24
        },
        new RightBorder()
        {
            Val =
            new EnumValue<BorderValues>(BorderValues.Dashed),
            Size = 24
        },
        new InsideHorizontalBorder()
        {
            Val =
            new EnumValue<BorderValues>(BorderValues.Dashed),
            Size = 24
        },
        new InsideVerticalBorder()
        {
            Val =
            new EnumValue<BorderValues>(BorderValues.Dashed),
            Size = 24
        }
    )
);

// Append the TableProperties object to the empty table.
table.AppendChild<TableProperties>(tblProp);

В коде создается строка таблицы. В этом разделе кода широко используются перегруженные Append методы, классы которых являются производными от OpenXmlElement наследуемых. Методы Append позволяют добавить один элемент или часть XML-дерева в конец списка дочерних элементов данного родительского элемента. Затем код создает TableCell объект , который представляет отдельную ячейку таблицы и задает свойство width ячейки таблицы с помощью TableCellProperties объекта, а содержимое ячейки ("Hello, Мир!") с помощью Text объекта . В схеме Open XML Wordprocessing элемент абзаца (<p\>) содержит элементы выполнения (<r\>), которые, в свою очередь, содержат текстовые элементы (<t\>). Чтобы вставить текст в ячейку таблицы с помощью API, необходимо создать Paragraph объект, содержащий Run объект , содержащий Text объект , содержащий текст, который нужно вставить в ячейку. Затем к объекту Paragraph добавляется TableCell объект . При этом создается нужная структура XML для вставки текста в ячейку. TableCell Затем добавляется к объекту TableRow .

// Create a row.
TableRow tr = new TableRow();

// Create a cell.
TableCell tc1 = new TableCell();

// Specify the width property of the table cell.
tc1.Append(new TableCellProperties(
    new TableCellWidth() { Type = TableWidthUnitValues.Dxa, Width = "2400" }));

// Specify the table cell content.
tc1.Append(new Paragraph(new Run(new Text("some text"))));

// Append the table cell to the table row.
tr.Append(tc1);

Затем в коде создается вторая ячейка таблицы. Последний раздел кода создает другую ячейку таблицы с помощью перегруженного TableCell конструктора TableCell(String) , который принимает OuterXml свойство существующего TableCell объекта в качестве единственного аргумента. После создания второй ячейки таблицы код добавляет к , добавляет TableRow к объекту Table, а к объекту DocumentTable .TableRowTableCell

// Create a second table cell by copying the OuterXml value of the first table cell.
TableCell tc2 = new TableCell(tc1.OuterXml);

// Append the table cell to the table row.
tr.Append(tc2);

// Append the table row to the table.
table.Append(tr);

if (doc.MainDocumentPart is null || doc.MainDocumentPart.Document.Body is null)
{
    throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}

// Append the table to the document.
doc.MainDocumentPart.Document.Body.Append(table);

Пример кода

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

string filePath = args[0];

CreateTable(filePath);

После запуска программы проверьте файл, чтобы увидеть вставленную таблицу.

Ниже приведен полный пример кода на языках C# и Visual Basic.

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;


// Insert a table into a word processing document.
static void CreateTable(string fileName)
{
    // Use the file name and path passed in as an argument 
    // to open an existing Word document.

    using (WordprocessingDocument doc = WordprocessingDocument.Open(fileName, true))
    {
        // Create an empty table.
        Table table = new Table();

        // Create a TableProperties object and specify its border information.
        TableProperties tblProp = new TableProperties(
            new TableBorders(
                new TopBorder()
                {
                    Val =
                    new EnumValue<BorderValues>(BorderValues.Dashed),
                    Size = 24
                },
                new BottomBorder()
                {
                    Val =
                    new EnumValue<BorderValues>(BorderValues.Dashed),
                    Size = 24
                },
                new LeftBorder()
                {
                    Val =
                    new EnumValue<BorderValues>(BorderValues.Dashed),
                    Size = 24
                },
                new RightBorder()
                {
                    Val =
                    new EnumValue<BorderValues>(BorderValues.Dashed),
                    Size = 24
                },
                new InsideHorizontalBorder()
                {
                    Val =
                    new EnumValue<BorderValues>(BorderValues.Dashed),
                    Size = 24
                },
                new InsideVerticalBorder()
                {
                    Val =
                    new EnumValue<BorderValues>(BorderValues.Dashed),
                    Size = 24
                }
            )
        );

        // Append the TableProperties object to the empty table.
        table.AppendChild<TableProperties>(tblProp);

        // Create a row.
        TableRow tr = new TableRow();

        // Create a cell.
        TableCell tc1 = new TableCell();

        // Specify the width property of the table cell.
        tc1.Append(new TableCellProperties(
            new TableCellWidth() { Type = TableWidthUnitValues.Dxa, Width = "2400" }));

        // Specify the table cell content.
        tc1.Append(new Paragraph(new Run(new Text("some text"))));

        // Append the table cell to the table row.
        tr.Append(tc1);

        // Create a second table cell by copying the OuterXml value of the first table cell.
        TableCell tc2 = new TableCell(tc1.OuterXml);

        // Append the table cell to the table row.
        tr.Append(tc2);

        // Append the table row to the table.
        table.Append(tr);

        if (doc.MainDocumentPart is null || doc.MainDocumentPart.Document.Body is null)
        {
            throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
        }

        // Append the table to the document.
        doc.MainDocumentPart.Document.Body.Append(table);
    }
}