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