Compartilhar via


Adicionar tabelas a documentos de processamento de texto

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

Método AddTable

Você pode usar o método AddTable para adicionar uma tabela simples a um documento de processamento de palavras. O método AddTable aceita dois parâmetros, indicando o seguinte:

  • O nome do documento a ser modificado (cadeia de caracteres).

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

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

Chamar o método AddTable

O método AddTable modifica o documento que você especifica, adicionando uma tabela que contém as informações na matriz bidimensional que você fornece. Para chamar o método, passe os dois valores de parâmetro, conforme mostrado no código a seguir.

    const string fileName = @"C:\Users\Public\Documents\AddTable.docx";
    AddTable(fileName, new string[,] 
        { { "Texas", "TX" }, 
        { "California", "CA" }, 
        { "New York", "NY" }, 
        { "Massachusetts", "MA" } }
        );

Como o código funciona

O código a seguir começa abrindo o documento, usando o método WordprocessingDocument.Open e indicando que o documento deve estar aberto para acesso de leitura/gravação (o valor final do parâmetro verdadeiro ). Em seguida, o código recupera uma referência ao elemento raiz da parte do documento main, usando a propriedade Document do MainDocumentPart do documento de processamento de palavras.

    using (var document = WordprocessingDocument.Open(fileName, true))
    {
        var doc = document.MainDocumentPart.Document;
        // Code removed here…
    }

Criar o objeto de tabela e definir suas propriedades

Antes de inserir uma tabela em um documento, você deve criar o objeto Table e definir suas propriedades. Para definir as propriedades de uma tabela, você cria e fornece valores para um objeto TableProperties . A classe TableProperties fornece muitas propriedades orientadas à tabela, como Sombreamento, TableBorders, TableCaption, TableCellSpacing, TableJustification e muito mais. O método de exemplo inclui o código a seguir.

    Table table = new Table();

    TableProperties props = new TableProperties(
        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 classe TableProperties permite que você especifique quantos elementos filho quiser (assim como o construtor XElement ). Nesse caso, o código cria elementos filho TopBorder, BottomBorder, LeftBorder, RightBorder, InsideHorizontalBorder e InsideVerticalBorder , cada um descrevendo um dos elementos de borda para a tabela. Para cada elemento, o código define as propriedades Val e Size como parte da chamada do construtor. Definir o tamanho é simples, mas definir a propriedade Val requer um pouco mais de esforço: essa propriedade, para este objeto específico, representa o estilo de borda e você deve defini-la como um valor enumerado. Para fazer isso, crie uma instância do tipo genérico EnumValue<T> , passando o tipo de borda específico (Único como parâmetro para o construtor. Depois que o código definir todo o valor da borda da tabela que ele precisa definir, ele chama o método AppendChild<T> da tabela, indicando que o tipo genérico é [TableProperties](/dotnet/api/ ocumentformat.openxml.wordprocessing.tableproperties)— ou seja, ele está acrescentando uma instância da classe TableProperties , usando os adereços variáveis como o valor.

Preencher a tabela com dados

Dada essa tabela e suas propriedades, agora é hora de preencher a tabela com dados. O procedimento de exemplo itera primeiro por meio de todas as linhas de dados na matriz de cadeias de caracteres especificadas, criando uma nova instância TableRow para cada linha de dados. O código a seguir deixa de fora os detalhes do preenchimento da linha com dados, mas mostra como você cria e acrescenta a linha à tabela:

    for (var i = 0; i <= data.GetUpperBound(0); i++)
    {
        var tr = new TableRow();
        // Code removed here…
        table.Append(tr);
    }

Para cada linha, o código itera por meio de todas as colunas na matriz de cadeias de caracteres especificadas. Para cada coluna, o código cria um novo objeto TableCell , preenche-o com dados e acrescenta-o à linha. O código a seguir deixa de fora os detalhes do preenchimento de cada célula com dados, mas mostra como você cria e acrescenta a coluna à tabela:

    for (var j = 0; j <= data.GetUpperBound(1); j++)
    {
        var tc = new TableCell();
        // Code removed here…
        tr.Append(tc);
    }

Em seguida, o código faz o seguinte:

  • Cria um novo objeto Text que contém um valor da matriz de cadeias de caracteres.
  • Passa o objeto Text para o construtor para um novo objeto Run .
  • Passa o objeto Executar para o construtor para um novo objeto Paragraph .
  • Passa o objeto Parágrafo para o método Appendda célula.

Em outras palavras, o código a seguir acrescenta o texto ao novo objeto TableCell .

    tc.Append(new Paragraph(new Run(new Text(data[i, j]))));

Em seguida, o código acrescenta um novo objeto TableCellProperties à célula. Este objeto TableCellProperties , como o objeto TableProperties que você já viu, pode aceitar tantos objetos em seu construtor quanto quiser fornecer. Nesse caso, o código passa apenas um novo objeto TableCellWidth , com sua propriedade Type definida como Auto (para que a tabela dimensione automaticamente a largura de cada coluna).

    // Assume you want columns that are automatically sized.
    tc.Append(new TableCellProperties(
        new TableCellWidth { Type = TableWidthUnitValues.Auto }));

Concluir

O código a seguir é concluído acrescentando a tabela ao corpo do documento e salvando o documento.

    doc.Body.Append(table);
    doc.Save();

Código de exemplo

A seguir está o exemplo de código AddTable completo em C# e Visual Basic.

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

AddTable(args[0], args[1]);

// Take the data from a two-dimensional array and build a table at the 
// end of the supplied document.
static void AddTable(string fileName, string json)
{
    // read the data from the json file
    var data = System.Text.Json.JsonSerializer.Deserialize<string[][]>(json);

    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.Length; i++)
            {
                var tr = new TableRow();
                for (var j = 0; j < data[i].Length; 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);
            doc.Save();
        }
    }
}