Table of Contents (TOC) en un documento de Word le brinda una descripción general de lo que contiene un documento. Además, le permite navegar a una sección particular del documento. En este artículo, aprenderá cómo trabajar con una tabla de contenido en documentos de Word mediante programación usando C#. En particular, este artículo cubre cómo agregar, extraer, actualizar o eliminar una tabla de contenido en documentos de Word.

API de C# para trabajar con TOC en un documento de Word

Para trabajar con tablas de contenido en documentos de Word, utilizaremos Aspose.Words for .NET. Dicha API está diseñada para realizar funciones básicas y avanzadas de automatización de Word desde aplicaciones .NET. Además, le brinda un buen control sobre la manipulación de la tabla de contenido en documentos de Word. Puede descargar la API o instalarla mediante NuGet.

PM> Install-Package Aspose.Words

Agregar tabla de contenido en un documento de Word usando C#

Los siguientes son los pasos para agregar una tabla de contenido a un documento de Word usando Aspose.Words for .NET.

El siguiente ejemplo de código muestra cómo agregar una tabla de contenido en un documento de Word en C#.

// Para obtener ejemplos completos y archivos de datos, vaya a https://github.com/aspose-words/Aspose.Words-for-.NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_WorkingWithDocument();
// Inicializar documento.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

// Inserta una tabla de contenido al principio del documento.
builder.InsertTableOfContents("\\o \"1-3\" \\h \\z \\u");

// La tabla de contenido recién insertada estará inicialmente vacía.
// Debe completarse actualizando los campos en el documento.
doc.UpdateFields();
dataDir = dataDir + "DocumentBuilderInsertTOC_out.doc";
doc.Save(dataDir);

Extraiga la tabla de contenido de un documento de Word usando C#

Los siguientes son los pasos para extraer campos de una tabla de contenido en un documento de Word.

  • Cargue el documento de Word utilizando la clase Document.
  • Recorra cada Field en el documento usando la colección Document.Range.Fields.
  • Compruebe si el tipo de campo es un hipervínculo utilizando la propiedad Field.Type.
  • Compruebe si el campo se encuentra debajo de la tabla de la sección de contenido.
  • Recupera la información del campo e imprímela.

El siguiente ejemplo de código muestra cómo extraer una tabla de contenido de un documento de Word usando C#.

// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_WorkingWithDocument();

string fileName = "TOC.doc";
Aspose.Words.Document doc = new Aspose.Words.Document(dataDir + fileName);

foreach (Field field in doc.Range.Fields)
{
	if (field.Type.Equals(Aspose.Words.Fields.FieldType.FieldHyperlink))
	{
		FieldHyperlink hyperlink = (FieldHyperlink)field;
		if (hyperlink.SubAddress != null && hyperlink.SubAddress.StartsWith("_Toc"))
		{
			Paragraph tocItem = (Paragraph)field.Start.GetAncestor(NodeType.Paragraph);
			Console.WriteLine(tocItem.ToString(SaveFormat.Text).Trim());
			Console.WriteLine("------------------");
			if (tocItem != null)
			{
				Bookmark bm = doc.Range.Bookmarks[hyperlink.SubAddress];
				// Obtener la ubicación a la que apunta este elemento TOC
				Paragraph pointer = (Paragraph)bm.BookmarkStart.GetAncestor(NodeType.Paragraph);
				Console.WriteLine(pointer.ToString(SaveFormat.Text));
			}
		} // End If
	}// End If
}// End Foreach

Actualice la tabla de contenido en un documento de Word usando C#

Cada vez que agrega algún contenido a un documento de Word, debe actualizar la tabla de contenido. Para hacerlo mediante programación, simplemente debe llamar al método Document.UpdateFields() antes de guardar el documento.

Eliminar la tabla de contenido en un documento de Word usando C#

Aspose.Words for .NET también le permite eliminar la tabla de contenido de un documento de Word. Los siguientes son los pasos para realizar esta operación.

  • Primero, cargue el documento de Word usando la clase Document.
  • Obtenga y almacene los nodos FieldStart de cada TOC en una matriz.
  • Recorra los nodos hasta que obtenga el nodo de tipo FieldEnd (fin de la tabla de contenido).
  • Elimine los nodos usando el método Node.Remove() y guarde el documento actualizado.

El siguiente ejemplo de código muestra cómo quitar la tabla de contenido de un documento de Word en C#.

// Para obtener ejemplos completos y archivos de datos, vaya a https://github.com/aspose-words/Aspose.Words-for-.NET
public static void Run()
{
    
    // La ruta al directorio de documentos.
    string dataDir = RunExamples.GetDataDir_WorkingWithStyles();

    // Abra un documento que contenga una TOC.
    Document doc = new Document(dataDir + "Document.TableOfContents.doc");

    // Elimina la primera tabla de contenido del documento.
    RemoveTableOfContents(doc, 0);

    dataDir = dataDir + "Document.TableOfContentsRemoveToc_out.doc";
    // Guarde la salida.
    doc.Save(dataDir);
    
    Console.WriteLine("\nSpecified TOC from a document removed successfully.\nFile saved at " + dataDir);
}
///<summary>
/// Elimina el campo de tabla de contenido especificado del documento.
///</summary>
///<param name="doc"> El documento del que se va a quitar el campo.</param>
///<param name="index"> El índice de base cero de la TOC que se va a eliminar.</param>
public static void RemoveTableOfContents(Document doc, int index)
{
    // Almacene los nodos FieldStart de los campos TOC en el documento para un acceso rápido.
    ArrayList fieldStarts = new ArrayList();
    // Esta es una lista para almacenar los nodos que se encuentran dentro del TOC especificado. serán eliminados
    // Al final de este método.
    ArrayList nodeList = new ArrayList();

    foreach (FieldStart start in doc.GetChildNodes(NodeType.FieldStart, true))
    {
        if (start.FieldType == FieldType.FieldTOC)
        {
            // Agregue todos los FieldStarts que sean de tipo FieldTOC.
            fieldStarts.Add(start);
        }
    }

    // Asegúrese de que exista la TOC especificada por el índice pasado.
    if (index > fieldStarts.Count - 1)
        throw new ArgumentOutOfRangeException("TOC index is out of range");

    bool isRemoving = true;
    // Obtenga el FieldStart del TOC especificado.
    Node currentNode = (Node)fieldStarts[index];

    while (isRemoving)
    {
        // Es más seguro almacenar estos nodos y luego eliminarlos todos a la vez.
        nodeList.Add(currentNode);
        currentNode = currentNode.NextPreOrder(doc);

        // Una vez que encontramos un nodo FieldEnd de tipo FieldTOC, sabemos que estamos al final
        // Del TOC actual y podemos parar aquí.
        if (currentNode.NodeType == NodeType.FieldEnd)
        {
            FieldEnd fieldEnd = (FieldEnd)currentNode;
            if (fieldEnd.FieldType == FieldType.FieldTOC)
                isRemoving = false;
        }
    }

    // Elimina todos los nodos que se encuentran en la tabla de contenido especificada.
    foreach (Node node in nodeList)
    {
        node.Remove();
    }
}

Obtenga una licencia de API gratuita

En caso de que quiera probar la API sin limitaciones de evaluación, puede obtener una licencia temporal gratuita.

Conclusión

En este artículo, ha aprendido a trabajar con una tabla de contenido en un documento de Word usando C#. La guía paso a paso y los ejemplos de código muestran cómo agregar, actualizar, extraer y eliminar la tabla de contenido de los documentos de Word. Puede explorar más sobre la API de automatización de C# Word utilizando documentación. En caso de que tenga alguna pregunta o inquietud, comuníquese con nosotros a través de nuestro foro.

Ver también