Actualice la TOC (tabla de contenido) de los documentos .docx de MS Word con Python

Uso el paquete “python-docx” de python para modificar la estructura y el contenido de los documentos MS Word .docx. El paquete no tiene la posibilidad de actualizar la tabla de contenido (tabla de contenido) [ Python: cree una “tabla de contenido” con python-docx / lxml .

¿Existen soluciones para actualizar la TDC de un documento? Pensé en usar “win32com.client” del paquete python “pywin32” [ https://pypi.python.org/pypi/pypiwin32] o un paquete pypi comparable que ofrezca capacidades de “control de cli” para MS Office.

Intenté lo siguiente:

Cambié document.docx por document.docm e implementé la siguiente macro [ http://word.tips.net/T000301_Updating_an_Entire_TOC_from_a_Macro.html] :

Sub update_TOC() If ActiveDocument.TablesOfContents.Count = 1 Then _ ActiveDocument.TablesOfContents(1).Update End Sub 

Si cambio el contenido (agregar / eliminar encabezados) y ejecutar la macro, se actualiza la TOC. Guardo el documento y estoy feliz.

Implemento el siguiente código de Python que debería ser equivalente a la macro:

 import win32com.client def update_toc(docx_file): word = win32com.client.DispatchEx("Word.Application") doc = word.Documents.Open(docx_file) toc_count = doc.TablesOfContents.Count if toc_count == 1: toc = doc.TablesOfContents(1) toc.Update print('TOC should have been updated.') else: print('TOC has not been updated for sure...') 

Se llama a update_toc (docx_file) en una secuencia de comandos de nivel superior (que manipula el contenido del documento relevante para TOC). Después de esta función, el documento se guarda (doc.Save ()), se cierra (doc.Close ()) y se cierra la instancia de word (word.Quit ()). Sin embargo, el TOC no se actualiza.

¿La palabra ms realiza acciones adicionales después de la ejecución de macros que no consideré?

Aquí hay un fragmento para actualizar el TOC de un documento .docx de 2013 de palabras que incluye solo una tabla de contenido (por ejemplo, solo TOC de encabezados, no TOC de figuras, etc.). Si la secuencia de comandos update_toc.py se ejecuta desde el comando promt (windows 10, command promt no se ejecuta como administrador) usando python update_toc.py la instalación del sistema de python abre el archivo doc_with_toc.docx en el mismo directorio, actualiza el TOC ( en mi caso, los encabezados) y guarda los cambios en el mismo archivo. El documento no puede abrirse en otra instancia de Word 2013 y no puede estar protegido contra escritura. Tenga en cuenta que esta secuencia de comandos no es lo mismo que seleccionar todo el contenido del documento y presionar la tecla F9 .

Contenido de update_toc.py :

 import win32com.client import inspect, os def update_toc(docx_file): word = win32com.client.DispatchEx("Word.Application") doc = word.Documents.Open(docx_file) doc.TablesOfContents(1).Update() doc.Close(SaveChanges=True) word.Quit() def main(): script_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) file_name = 'doc_with_toc.docx' file_path = os.path.join(script_dir, file_name) update_toc(file_path) if __name__ == "__main__": main() 

Para actualizar el TOC, esto funcionó para mí:

 word = win32com.client.DispatchEx("Word.Application") Selection = word.Selection Selection.Fields.Update