Добавить таблицы в текстовые документы
В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для программного добавления таблицы в текстовый документ. Он содержит пример AddTable
метода для иллюстрации этой задачи.
Метод AddTable
С помощью AddTable
метода можно добавить простую таблицу в текстовый документ. Метод AddTable
принимает два параметра, указывающие на следующее:
Имя изменяемого документа (строковое значение).
Двумерных массив строк, вставляемый в документ в виде таблицы.
static void AddTable(string fileName, string[,] data)
Вызов метода AddTable
Метод AddTable
изменяет указанный документ, добавляя таблицу, содержащую сведения в предоставленном двумерном массиве. Чтобы вызвать метод, передайте значения двух параметров, как показано в следующем примере кода:
string fileName = args[0];
AddTable(fileName, new string[,] {
{ "Hawaii", "HI" },
{ "California", "CA" },
{ "New York", "NY" },
{ "Massachusetts", "MA" }
});
Принцип работы кода
Следующий код начинается с открытия документа с помощью Open метода и указания, что документ должен быть открыт для чтения и записи (конечное true
значение параметра). Далее код извлекает ссылку на корневой элемент части документа main, используя Document свойствоMainDocumentPart объекта word processing document.
using (var document = WordprocessingDocument.Open(fileName, true))
{
if (document.MainDocumentPart is null || document.MainDocumentPart.Document.Body is null)
{
throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}
var doc = document.MainDocumentPart.Document;
Создание объекта таблицы и задание его свойств
Прежде чем вставить таблицу в документ, необходимо создать Table объект и задать его свойства. Чтобы задать свойства таблицы, необходимо создать и указать значения для TableProperties объекта . Класс TableProperties
предоставляет множество табличных свойств, таких как Shading, TableBorders, TableCaption, TableCellProperties, TableJustificationи т. д. Метод, приведенный в качестве примера, имеет следующий код:
Table table = new();
TableProperties props = new(
new TableBorders(
new TopBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new BottomBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new LeftBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new RightBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new InsideHorizontalBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new InsideVerticalBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
}));
table.AppendChild<TableProperties>(props);
Конструктор класса TableProperties
позволяет указать любое количество дочерних элементов (как конструктор XElement ). В этом случае код создает TopBorderдочерние элементы , BottomBorder, LeftBorder, RightBorder, InsideHorizontalBorderи InsideVerticalBorder , каждый из которых описывает один из пограничных элементов таблицы. Для каждого элемента код задает Val
свойства и Size
как часть вызова конструктора. Задать размер несложно, но для задания Val
свойства требуется немного больше усилий: это свойство для данного конкретного объекта представляет стиль границы, и необходимо задать для него перечисленное значение. Для этого создайте экземпляр универсального EnumValue<T> типа, передав конструктору конкретный тип границы (BorderValues) в качестве параметра. После того как код задал все значения границы таблицы, которые ему нужно задать, он вызывает AppendChild метод таблицы, указывая, что универсальный тип является TableProperties , т. е. добавляет экземпляр TableProperties
класса, используя переменную props
в качестве значения.
Заполнение таблицы данными
После создания таблицы и ее свойств необходимо заполнить таблицу данными. Пример процедуры сначала выполняет итерацию по всем строкам данных в указанном массиве строк, создавая новый TableRow экземпляр для каждой строки данных. В следующем коде показано, как создать и добавить строку в таблицу. Затем для каждого столбца код создает новый TableCell объект, заполняет его данными и добавляет его в строку.
Затем код выполняет следующие действия:
- Создает новый Text объект, содержащий значение из массива строк.
- Передает Text объект конструктору для нового Run объекта.
- Передает Run объект конструктору для нового Paragraph объекта.
- Передает Paragraph объект методу Append ячейки.
Затем код добавляет новый TableCellProperties объект в ячейку. Этот TableCellProperties
объект, как и TableProperties
объект, который вы уже видели, может принимать столько объектов в конструкторе, сколько нужно предоставить. В этом случае код передает только новый TableCellWidth объект с его Type свойством , равным TableWidthUnitValues (чтобы таблица автоматически устанавливала ширину каждого столбца).
for (var i = 0; i < data.GetUpperBound(0); i++)
{
var tr = new TableRow();
for (var j = 0; j < data.GetUpperBound(1); j++)
{
var tc = new TableCell();
tc.Append(new Paragraph(new Run(new Text(data[i, j]))));
// Assume you want columns that are automatically sized.
tc.Append(new TableCellProperties(
new TableCellWidth { Type = TableWidthUnitValues.Auto }));
tr.Append(tc);
}
table.Append(tr);
}
Завершить
Следующий код завершается добавлением таблицы в тело документа и сохранением документа.
doc.Body.Append(table);
Пример кода
Далее приведен полный пример кода AddTable на C# и Visual Basic.
static void AddTable(string fileName, string[,] data)
{
if (data is not null)
{
using (var document = WordprocessingDocument.Open(fileName, true))
{
if (document.MainDocumentPart is null || document.MainDocumentPart.Document.Body is null)
{
throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}
var doc = document.MainDocumentPart.Document;
Table table = new();
TableProperties props = new(
new TableBorders(
new TopBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new BottomBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new LeftBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new RightBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new InsideHorizontalBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new InsideVerticalBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
}));
table.AppendChild<TableProperties>(props);
for (var i = 0; i < data.GetUpperBound(0); i++)
{
var tr = new TableRow();
for (var j = 0; j < data.GetUpperBound(1); j++)
{
var tc = new TableCell();
tc.Append(new Paragraph(new Run(new Text(data[i, j]))));
// Assume you want columns that are automatically sized.
tc.Append(new TableCellProperties(
new TableCellWidth { Type = TableWidthUnitValues.Auto }));
tr.Append(tc);
}
table.Append(tr);
}
doc.Body.Append(table);
}
}
}