Share via


Cambiar el texto de una tabla de un documento de procesamiento de texto

En este tema se muestra cómo usar el SDK de Open XML para Office para cambiar mediante programación el texto de una tabla de un documento de procesamiento de texto existente.

Apertura del documento existente

Para abrir un documento existente, cree una instancia de la clase WordprocessingDocument como se muestra en la siguiente instrucción using. En la misma instrucción, abra el archivo de procesamiento de texto en la ruta de archivo especificada mediante el método Open , con el parámetro booleano establecido en true para habilitar la edición del documento.

    using (WordprocessingDocument doc =
           WordprocessingDocument.Open(filepath, true)) 
    { 
       // Insert other code here. 
    }

La instrucción using proporciona una alternativa recomendada a la típica secuencia .Open, .Save, .Close. Garantiza que se llamará automáticamente al método Dispose (un método interno que Open XML SDK usa para limpiar recursos) cuando se llegue a la llave de cierre. El bloque que sigue a la instrucción using establece un ámbito para el objeto que se crea o se denomina en la instrucción using, en este caso doc. Dado que la clase WordprocessingDocument del SDK de Open XML guarda y cierra automáticamente el objeto como parte de su implementación System.IDisposable y, como Dispose se llama automáticamente al salir del bloque, no es necesario llamar explícitamente a Save y Close─siempre que use.

Estructura de una tabla

La estructura de documento básica de un documento WordProcessingML contiene los elementos document y body, seguidos de uno o varios elementos a nivel de bloque, como p, que representa un párrafo. Un párrafo contiene uno o varios elementos r. La r representa a run (segmento), que es una región de texto con un conjunto de propiedades comunes, como el formato. Un segmento contiene uno o varios elementos t. El elemento t contiene un intervalo de texto.

Al igual que en este ejemplo, el documento puede contener una tabla. Una tabla es un conjunto de párrafos (y otro contenido a nivel de bloque) organizados en filas y columnas. Las tablas de WordprocessingML se definen mediante el elemento tbl, que es análogo a la etiqueta de tabla HTML. Considere una tabla de una celda vacía (es decir, una tabla con una fila y una columna) y bordes de 1 punto en todos los lados. Esta tabla se representa mediante el siguiente ejemplo de código de WordprocessingML.

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

En esta tabla se indican las propiedades para toda la tabla: ancho de página de 100% mediante el elemento tblW, un conjunto de bordes de tabla mediante el elemento tblBorders, la cuadrícula de tabla que define un conjunto de bordes verticales compartidos dentro de la tabla mediante el elemento tblGrid y una única fila de tabla mediante el elemento tr.

Funcionamiento del código de ejemplo

En el código de ejemplo, una vez abierto el documento en la instrucción using, busque la primera tabla del documento. A continuación, busque la segunda fila de la tabla; para ello, busque la fila cuyo índice sea 1. A continuación, busque la tercera celda de esa fila cuyo índice es 2, tal como se muestra en el siguiente ejemplo de código.

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

Tras encontrar la celda objetivo, busque el primer segmento del primer párrafo de la celda y reemplace el texto con el texto que se pasó. En el ejemplo de código siguiente se muestran estas acciones.

    Paragraph p = cell.Elements<Paragraph>().First();
    Run r = p.Elements<Run>().First();
    Text t = r.Elements<Text>().First();
    t.Text = txt;

Cambio de texto en una celda de una tabla

En el ejemplo de código siguiente se muestra cómo cambiar el texto de la celda de tabla especificada en un documento de procesamiento de texto. El ejemplo de código espera que el documento, cuyo nombre y ruta de acceso se pasan como un argumento al método ChangeTextInCell, contenga una tabla. También espera que la tabla tenga al menos dos filas y tres columnas, y que contenga texto en la celda que está ubicada en la segunda fila y la tercera columna. Cuando llama al método ChangeTextInCell en el programa, el texto de la celda de la ubicación especificada será reemplazado por el texto que pasó como segundo argumento al método ChangeTextInCell. En la siguiente tabla, se usó el texto "The text from the API example".

Cualquier texto Cualquier texto Cualquier texto
Cualquier texto Texto El texto del ejemplo de la API

Código de ejemplo

El método ChangeTextinCell cambia el texto de la segunda fila y la tercera columna de la primera tabla que se encuentra en el archivo. Para llamarlo, debe pasar una ruta de acceso completa al archivo como el primer parámetro y el texto que se va a usar como el segundo parámetro. Por ejemplo, la siguiente llamada al método ChangeTextInCell cambia el texto de la celda especificada por "The text from the API example".

    ChangeTextInCell(@"c:\Users\Public\Documents\word4.docx",
    "The text from the API example");

A continuación se proporciona el ejemplo de código completo.

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

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

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