Saltar al contenido

¿Cómo generar una tabla de contenido usando OpenXML SDK 2.0?

El tutorial o código que hallarás en este artículo es la solución más eficiente y válida que encontramos a esta duda o dilema.

Solución:

Eche un vistazo a la cuarta y última serie de Screen-Cast sobre cómo agregar / actualizar la tabla de contenido en documentos OpenXML WordprocessingML por Eric White.

¡Espero que ayude!

ACTUALIZAR:


Según las preguntas frecuentes de los foros de MSDN, veo que esta función no es compatible:

8) ¿Cómo generar TOC (tabla de contenido) en un documento de Word?

Open XML SDK 2.0 no admite esta función. Pero puede generar un pequeño TOC a través de la aplicación Word y reflejar las partes del TOC con el componente Document Reflector en la herramienta de productividad Open XML SDK para ver cómo generar un TOC mediante programación. Para obtener información más detallada, consulte:

  • Hilo del foro de MSDN: Generar tabla de contenido y aplicar un estilo personalizado,

  • Hilo del foro de MSDN: ¿Cómo puedo crear un directorio para un documento de Word?.


ACTUALIZACIÓN 2


Según nuestros comentarios a continuación, podría proponer usar este escenario:

  1. Usted crea manualmente un archivo DOCX vacío e inserta TOC dentro de él.
  2. Luego, guarde este archivo y ábralo en la herramienta OpenXML SDK 2.0, que le proporciona el código C # para generar dicho archivo vacío con el marcador de posición TOC en su interior.
  3. Luego, borra programáticamente todos los datos que necesita en este archivo DOCX y lo guarda.
  4. Además, deberá proporcionar el mecanismo que actualizará automáticamente la tabla de contenido una vez que se vacíen los datos (o una vez que se abra el documento). Hay algunas opciones para hacer eso: vea las transmisiones de pantalla 3-5 en el enlace a la publicación de Eric White que proporcioné anteriormente. Especialmente, creo que deberías prestar atención a Quinto uno – “Muestra cómo utilizar un AutoOpen macro para actualizar el TOC siempre que se abra cualquier documento que contenga un TOC“.

Todo eso parece un poco complicado, pero espero que ayude.

Usar tabla de contenido automática (se puede hacer clic)

  1. Establecer rumbo

    public static Paragraph SetHeading1(this Paragraph p)
    
        var pPr = p.Descendants().First();
        pPr.ParagraphStyleId = new ParagraphStyleId()  Val = "Heading1" ;
        return p;
    
    
  2. Genere TOC a partir de un documento vacío, puede usar esto:

    private static string GetTOC(string title, int titleFontSize)
    
        return [email protected]"
     
        
        
           
           
        
     
     
        
           
           
           
           
           
           
           
        
     
     
        
           
              
               
           
           
                
                   
                   
                   
                   
              
              title
           
        
        
           
              
                 
                 
                 
              
              
           
           
              
                 
                 
                 
              
               TOC o ""1-3"" h z u 
           
           
              
                 
                 
                 
              
              
           
           
              
                 
              
              No table of contents entries found.
           
           
              
                 
                 
                 
              
              
           
        
     
    

  3. Cree SdtBlock y configure TOC xml

        var sdtBlock = new SdtBlock();
        sdtBlock.InnerXml = GetTOC(Translations.ResultsBooksTableOfContentsTitle, 16);
        document.MainDocumentPart.Document.Body.AppendChild(sdtBlock);
    
  4. Establecer UpdateFieldsOnOpen

        var settingsPart = document.MainDocumentPart.AddNewPart();
        settingsPart.Settings = new Settings  BordersDoNotSurroundFooter = new BordersDoNotSurroundFooter()  Val = true  ;
    
        settingsPart.Settings.Append(new UpdateFieldsOnOpen()  Val = true );
    

si necesita generar un archivo pdf desde docx, ¡está funcionando bien!

Gracias a Dmitri Pavlov (@DmitryPavlov) por la ayuda.

No quiero dar una respuesta a mi propia pregunta, pero esto es solo para ilustrar los pasos que he tomado.

El consejo para cualquier persona interesada es ver la proyección de pantalla en 5 partes de Eric White: Exploración de tablas de contenido en documentos Open XML WordprocessingML. Esto tiene toda la información con respecto a agregar y actualizar un TOC (soy mucho más).

Mi solución fue usar una plantilla (solo un documento vacío normal que tenía estilos para todo lo que necesitaba: encabezado 1-5, estilo TOC, etc.). Esto es particularmente útil como una solución rápida para el problema de estilos (el nuevo documento, que tiene el TOC, tendrá un nuevo style.xml creado; este archivo tiene algunos datos adicionales; como resultado, la jerarquía en el TOC no es tan esperado, es decir, el encabezado 2 es el hijo del encabezado 1, el encabezado 3 es un hijo del encabezado 2, etc.).

Por lo tanto:

  1. Cree un documento de Word y agregue todos los elementos que espera que se agreguen más tarde mediante programación (por ejemplo, encabezado 1-5, tabla de contenido, etc.). Elimina todo el contenido y guarda el documento (el motivo es crear estilos para todos los elementos necesarios).

  2. Personalmente agregué la plantilla (el archivo creado en el paso # 1) como un recurso en mi proyecto.

  3. En su código, cree una nueva copia de la plantilla (este será el archivo real en el que trabajará). Solía:

    byte[] stream = Properties.Resources.Template;
    File.WriteAllBytes(@"D:Template.docx", stream);
    File.Copy(@"D:Template.docx", @"D:New.docx");
    
  4. Vacíe todos los datos a este documento.

  5. Agregue los archivos de origen de screen-cast 2, 3 o 4 a su proyecto (para esto, consulte screen-cast 3); al final de esas publicaciones, encontrará un enlace para descargar TocAdder.zip. O simplemente agregue una referencia a TocAdder.dll.

  6. Inserte el TOC. Solo un ejemplo:

    using (WordprocessingDocument wdoc = WordprocessingDocument.Open(@"D:New.docx", true))
    
        XElement firstPara = wdoc
            .MainDocumentPart
            .GetXDocument()
            .Descendants(W.p)
            .FirstOrDefault();
        TocAdder.AddToc(wdoc, firstPara,
            @"TOC o '1-3' h z u", null, null);
    
    
  7. Reemplace los estilos en el documento recién creado con los de la plantilla. Puede usar este recurso de MSDN: Reemplazo de las partes de estilos en documentos de Word 2010 mediante Open XML SDK 2.0. De nuevo, un ejemplo:

    string fromDoc = @"D:Template.docx";
    string toDoc = @"D:New.docx";
    var node = WDExtractStyles(fromDoc, false);
    if (node != null)
        WDReplaceStyles(toDoc, node, false);
    node = WDExtractStyles(fromDoc);
    if (node != null)
        WDReplaceStyles(toDoc, node);
    
  8. Opcionalmente, use uno de los métodos descritos en screen-cast 3, 4 o 5 para solucionar el problema con el cuadro de diálogo modal que muestra Word.

Espero que esto sea útil para alguien.

Recuerda que tienes permiso de decir si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *