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