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
- Acceso estructurado: recuento de filas y columnas, contenido de celdas individuales, anchos de columna
- No se requiere aplicación de hoja de cálculo: extraer datos de tabla de OneNote en cualquier plataforma
- 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-notePaso 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 environmentPreguntas 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: