Compartilhar via


Adicionar tabelas a documentos de processamento de texto

Este tópico mostra como utilizar as classes no SDK Open XML para o Office para adicionar programaticamente uma tabela a um documento de processamento de palavras. Contém um método de exemplo AddTable para ilustrar esta tarefa.

AddTable method (Método AddTable)

Pode utilizar o AddTable método para adicionar uma tabela simples a um documento de processamento de palavras. O AddTable método aceita dois parâmetros, que indicam o seguinte:

  • O nome do documento a modificar (cadeia).

  • Uma matriz bidimensional de cadeias para inserir no documento como uma tabela.

static void AddTable(string fileName, string[,] data)

Chamar o método AddTable

O AddTable método modifica o documento que especificar, adicionando uma tabela que contém as informações na matriz bidimensional que fornecer. Para chamar o método , transmita ambos os valores dos parâmetros, conforme mostrado no código seguinte.

string fileName = args[0];

AddTable(fileName, new string[,] {
    { "Hawaii", "HI" },
    { "California", "CA" },
    { "New York", "NY" },
    { "Massachusetts", "MA" }
});

Como funciona o código

O código seguinte começa por abrir o documento, utilizando o Open método e indicando que o documento deve estar aberto para acesso de leitura/escrita (o valor final true do parâmetro). Em seguida, o código obtém uma referência ao elemento raiz da parte do documento main, utilizando a Document propriedade daMainDocumentPart palavra documento de processamento.

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;

Criar o objeto de tabela e definir as respetivas propriedades

Antes de poder inserir uma tabela num documento, tem de criar o objeto e definir as Table respetivas propriedades. Para definir as propriedades de uma tabela, crie e forneça valores para um TableProperties objeto. A TableProperties classe fornece muitas propriedades orientadas para tabelas, como Shading, TableBorders, TableCaption, TableCellProperties, , TableJustificatione muito mais. O método de exemplo inclui o seguinte código.

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);

O construtor da TableProperties classe permite-lhe especificar o número de elementos subordinados que quiser (tal como o XElement construtor). Neste caso, o código cria TopBorderelementos , BottomBorder, LeftBorder, RightBorder, InsideHorizontalBordere InsideVerticalBorder subordinados, cada um descrevendo um dos elementos de limite da tabela. Para cada elemento, o código define as Val propriedades e Size como parte da chamada do construtor. Definir o tamanho é simples, mas definir a Val propriedade requer um pouco mais de esforço: esta propriedade, para este objeto específico, representa o estilo de limite e tem de defini-lo para um valor enumerado. Para tal, crie uma instância do EnumValue<T> tipo genérico, transmitindo o tipo de limite específico (BorderValues) como um parâmetro para o construtor. Assim que o código tiver definido todo o valor de limite da tabela que precisa de definir, chama o AppendChild método da tabela, indicando que o tipo genérico é TableProperties , ou seja, está a acrescentar uma instância da TableProperties classe, utilizando a variável props como o valor.

Preencher a tabela com dados

Tendo em conta essa tabela e as respetivas propriedades, está na altura de preencher a tabela com dados. O procedimento de exemplo itera primeiro todas as linhas de dados na matriz de cadeias que especificou, criando uma nova TableRow instância para cada linha de dados. O código seguinte mostra como criar e acrescentar a linha à tabela. Em seguida, para cada coluna, o código cria um novo TableCell objeto, preenche-o com dados e acrescenta-o à linha.

Em seguida, o código faz o seguinte:

  • Cria um novo Text objeto que contém um valor da matriz de cadeias.
  • Passa o Text objeto para o construtor para um novo Run objeto.
  • Passa o Run objeto para o construtor para um novo Paragraph objeto.
  • Transmite o Paragraph objeto ao Append método da célula.

Em seguida, o código acrescenta um novo TableCellProperties objeto à célula. Este TableCellProperties objeto, tal como o TableProperties objeto que já viu, pode aceitar o número de objetos existentes no construtor que quiser fornecer. Neste caso, o código transmite apenas um novo TableCellWidth objeto, com a respetiva Type propriedade definida como (para TableWidthUnitValues que a tabela dimensione automaticamente a largura de cada coluna).

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);
}

Concluir

O código seguinte termina ao acrescentar a tabela ao corpo do documento e, em seguida, ao guardar o documento.

doc.Body.Append(table);

Código de exemplo

Segue-se o exemplo completo de código AddTable em C# e 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);
        }
    }
}

Confira também