Alterar texto em uma tabela de documento de processamento de texto
Este tópico mostra como utilizar o SDK Open XML para o Office para alterar programaticamente o texto numa tabela num documento de processamento de palavras existente.
Abrir o Documento Existente
Para abrir um documento existente, instanciar a WordprocessingDocument classe conforme mostrado na seguinte using
instrução. Na mesma instrução, abra o ficheiro de processamento de palavras no especificado filepath
através do Open
método , com o parâmetro Booleano definido como para true
ativar a edição do documento.
using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
Com a v3.0.0+ o Close() método foi removido a favor de depender da instrução using.
Garante que o Dispose() método é chamado automaticamente quando a chaveta de fecho é atingida. O bloco que segue a instrução using estabelece um âmbito para o objeto que é criado ou nomeado na instrução using. Uma vez que a WordprocessingDocument classe no SDK Open XML guarda e fecha automaticamente o objeto como parte da respetiva IDisposable implementação e porque Dispose() é automaticamente chamada quando sai do bloco, não tem de chamar Save() explicitamente ou Dispose() desde que utilize uma using
instrução.
A Estrutura de uma Tabela
A estrutura de documentos básica de um WordProcessingML
documento consiste nos document
elementos e body
, seguidos por um ou mais elementos de nível de bloco, como p
, que representa um parágrafo. Um parágrafo contém um ou mais r
elementos. Significa r
execução, que é uma região de texto com um conjunto comum de propriedades, como formatação. Uma execução contém um ou mais t
elementos. O t
elemento contém um intervalo de texto.
O documento pode conter uma tabela como neste exemplo. A table
é um conjunto de parágrafos (e outros conteúdos ao nível do bloco) dispostos em rows
e columns
. As tabelas no WordprocessingML
são definidas através do tbl
elemento , que é análogo à etiqueta de tabela HTML. Considere uma tabela de uma célula vazia (ou seja, uma tabela com uma linha e uma coluna) e limites de 1 ponto em todos os lados. Esta tabela é representada pelo seguinte WordprocessingML
exemplo de código.
<w:tbl>
<w:tblPr>
<w:tblW w:w="5000" w:type="pct"/>
<w:tblBorders>
<w:top w:val="single" w:sz="4" w:space="0" w:color="auto"/>
<w:left w:val="single" w:sz="4 w:space="0" w:color="auto"/>
<w:bottom w:val="single" w:sz="4" w:space="0" w:color="auto"/>
<w:right w:val="single" w:sz="4" w:space="0" w:color="auto"/>
</w:tblBorders>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="10296"/>
</w:tblGrid>
<w:tr>
<w:tc>
<w:tcPr>
<w:tcW w:w="0" w:type="auto"/>
</w:tcPr>
<w:p/>
</w:tc>
</w:tr>
</w:tbl>
Esta tabela especifica propriedades ao nível da tabela de 100% da largura da página com o tblW
elemento , um conjunto de limites de tabela com o tblBorders
elemento , a grelha da tabela, que define um conjunto de arestas verticais partilhadas dentro da tabela com o tblGrid
elemento e uma única linha de tabela com o tr
elemento .
Como funciona o código de exemplo
No código de exemplo, depois de abrir o documento na using
instrução , localize a primeira tabela no documento. Em seguida, localize a segunda linha na tabela ao encontrar a linha cujo índice é 1. Em seguida, localize a terceira célula nessa linha cujo índice é 2, conforme mostrado no exemplo de código seguinte.
// Find the first table in the document.
Table table = doc.MainDocumentPart.Document.Body.Elements<Table>().First();
// Find the second row in the table.
TableRow row = table.Elements<TableRow>().ElementAt(1);
// Find the third cell in the row.
TableCell cell = row.Elements<TableCell>().ElementAt(2);
Depois de localizar a célula de destino, localize a primeira execução no primeiro parágrafo da célula e substitua o texto pelo texto transmitido. O seguinte exemplo de código mostra estas ações.
// Find the first paragraph in the table cell.
Paragraph p = cell.Elements<Paragraph>().First();
// Find the first run in the paragraph.
Run r = p.Elements<Run>().First();
// Set the text for the run.
Text t = r.Elements<Text>().First();
t.Text = txt;
Alterar Texto numa Célula numa Tabela
O seguinte exemplo de código mostra como alterar o texto na célula da tabela especificada num documento de processamento de palavras. O exemplo de código espera que o documento, cujo nome de ficheiro e caminho são transmitidos como um argumento para o ChangeTextInCell
método, contenha uma tabela.
O exemplo de código também espera que a tabela tenha, pelo menos, duas linhas e três colunas e que a tabela contenha texto na célula localizada na segunda linha e na posição da terceira coluna. Quando chama o ChangeTextInCell
método no programa, o texto na célula na localização especificada será substituído pelo texto que transmitir como segundo argumento para o ChangeTextInCell
método .
Algum texto | Algum texto | Algum texto |
---|---|---|
Algum texto | Algum texto | O texto do segundo argumento |
Código de exemplo
O ChangeTextInCell
método altera o texto na segunda linha e a terceira coluna da primeira tabela encontrada no ficheiro. Pode chamá-lo ao transmitir um caminho completo para o ficheiro como o primeiro parâmetro e o texto a utilizar como segundo parâmetro. Por exemplo, a chamada seguinte ao ChangeTextInCell
método altera o texto na célula especificada para "O texto do exemplo da API".
ChangeTextInCell(args[0], args[1]);
Segue-se o exemplo de código completo.
// Change the text in a table in a word processing document.
static void ChangeTextInCell(string filePath, string txt)
{
// Use the file name and path passed in as an argument to
// open an existing document.
using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
{
if (doc.MainDocumentPart is null || doc.MainDocumentPart.Document.Body is null)
{
throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}
// Find the first table in the document.
Table table = doc.MainDocumentPart.Document.Body.Elements<Table>().First();
// Find the second row in the table.
TableRow row = table.Elements<TableRow>().ElementAt(1);
// Find the third cell in the row.
TableCell cell = row.Elements<TableCell>().ElementAt(2);
// Find the first paragraph in the table cell.
Paragraph p = cell.Elements<Paragraph>().First();
// Find the first run in the paragraph.
Run r = p.Elements<Run>().First();
// Set the text for the run.
Text t = r.Elements<Text>().First();
t.Text = txt;
}
}
Confira também
Open XML SDK class library reference (Referência da biblioteca de classes SDK Open XML)
Como: Alterar Texto numa Tabela num Documento de Processamento de Word
LINQ (Consulta Integrada à Linguagem)