Cómo analizar tablas en archivos de OneNote usando Python

Cómo analizar tablas en archivos de OneNote usando Python

Microsoft OneNote permite a los usuarios incrustar tablas de datos estructurados directamente en las páginas. Aspose.Note FOSS for Python expone cada tabla a través de una jerarquía Table → TableRow → TableCell, dándole acceso programático a todo el contenido de las celdas, los metadatos de columnas y las etiquetas de la tabla.

Beneficios

  1. Acceso estructurado: recuento de filas y columnas, contenido de celdas individuales, anchos de columna
  2. No se requiere aplicación de hoja de cálculo: extraer datos de tabla de OneNote en cualquier plataforma
  3. Gratis y de código abierto: licencia MIT, sin clave API

Guía paso a paso

Paso 1: Instalar Aspose.Note FOSS para Python

pip install aspose-note

Paso 2: Cargar el archivo .one

from aspose.note import Document

doc = Document("MyNotes.one")
print(f"Pages: {len(list(doc))}")

Paso 3: Encontrar todas las tablas

Utilice GetChildNodes(Table) para recuperar cada tabla de todo el documento de forma recursiva:

from aspose.note import Document, Table

doc = Document("MyNotes.one")
tables = doc.GetChildNodes(Table)
print(f"Found {len(tables)} table(s)")

Paso 4: Leer valores de fila y celda

Iterar los nodos TableRow y TableCell. Cada celda contiene nodos RichText cuya propiedad .Text proporciona el contenido de texto sin formato:

from aspose.note import Document, Table, TableRow, TableCell, RichText

doc = Document("MyNotes.one")

for t, table in enumerate(doc.GetChildNodes(Table), start=1):
    print(f"\nTable {t}: {len(table.Columns)} column(s)")
    for r, row in enumerate(table.GetChildNodes(TableRow), start=1):
        cell_values = []
        for cell in row.GetChildNodes(TableCell):
            text = " ".join(rt.Text for rt in cell.GetChildNodes(RichText)).strip()
            cell_values.append(text)
        print(f"  Row {r}: {cell_values}")

Paso 5: Leer anchos de columna

from aspose.note import Document, Table

doc = Document("MyNotes.one")
for i, table in enumerate(doc.GetChildNodes(Table), start=1):
    print(f"Table {i} column widths (pts): {[col.Width for col in table.Columns]}")
    print(f"Borders visible: {table.IsBordersVisible}")

Paso 6: Exportar a CSV

import csv, io
from aspose.note import Document, Table, TableRow, TableCell, RichText

doc = Document("MyNotes.one")
buf = io.StringIO()
writer = csv.writer(buf)

for table in doc.GetChildNodes(Table):
    for row in table.GetChildNodes(TableRow):
        values = [
            " ".join(rt.Text for rt in cell.GetChildNodes(RichText)).strip()
            for cell in row.GetChildNodes(TableCell)
        ]
        writer.writerow(values)
    writer.writerow([])   # blank row between tables

with open("tables.csv", "w", encoding="utf-8", newline="") as f:
    f.write(buf.getvalue())
print("Saved tables.csv")

Problemas comunes y soluciones

Las tablas aparecen vacías

Causa: Las celdas contienen nodos Image en lugar de nodos RichText.

Verificar:

from aspose.note import Document, Table, TableRow, TableCell, RichText, Image

doc = Document("MyNotes.one")
for table in doc.GetChildNodes(Table):
    for row in table.GetChildNodes(TableRow):
        for cell in row.GetChildNodes(TableCell):
            texts = cell.GetChildNodes(RichText)
            images = cell.GetChildNodes(Image)
            print(f"  Cell: {len(texts)} text(s), {len(images)} image(s)")

El recuento de columnas no coincide Columns

table.Columns refleja los metadatos de columna almacenados en el archivo. El número real de celdas por fila puede diferir si las filas tienen celdas combinadas (el formato de archivo lo almacena a nivel binario; la API pública no expone una bandera de combinación).

ImportError: No existe un módulo llamado ‘aspose’

pip install aspose-note
pip show aspose-note  # confirm it is installed in the active environment

Preguntas frecuentes

¿Puedo editar datos de tabla y guardarlos de nuevo? No. Escribir de nuevo al formato .one no está soportado. Los cambios realizados en memoria (p. ej., mediante RichText.Replace()) no pueden persistirse en el archivo fuente.

¿Se detectan celdas combinadas? La API CompositeNode no expone metadatos de combinación. Cada TableCell se trata como una celda separada sin importar la combinación visual.

¿Puedo contar cuántas filas tiene una tabla? Sí: len(table.GetChildNodes(TableRow)).


Recursos relacionados:

 Español