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


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

В этом разделе показано, как использовать классы в пакете 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);
        }
    }
}

См. также