Вставьте таблицу в текстовый документ
В этом разделе показано, как использовать классы в пакете 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
.TableRow
TableCell
// 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);
}
}