Come analizzare le tabelle nei file OneNote usando Python

Come analizzare le tabelle nei file OneNote usando Python

Microsoft OneNote consente agli utenti di incorporare tabelle di dati strutturati direttamente nelle pagine. Aspose.Note FOSS for Python espone ogni tabella tramite una gerarchia Table → TableRow → TableCell, fornendo l’accesso programmatico a tutti i contenuti delle celle, ai metadati delle colonne e ai tag della tabella.

Benefici

  1. Accesso strutturato: conteggio di righe e colonne, contenuto delle singole celle, larghezze delle colonne
  2. Nessuna app di foglio di calcolo richiesta: estrai i dati della tabella da OneNote su qualsiasi piattaforma
  3. Gratuito e open‑source: licenza MIT, nessuna chiave API

Guida passo-passo

Passo 1: Installa Aspose.Note FOSS per Python

pip install aspose-note

Passo 2: Carica il file .one

from aspose.note import Document

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

Passo 3: Trova tutte le tabelle

Usa GetChildNodes(Table) per recuperare ogni tabella dall’intero documento in modo ricorsivo:

from aspose.note import Document, Table

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

Passo 4: Leggi i valori di riga e cella

Itera i nodi TableRow e TableCell. Ogni cella contiene i nodi RichText la cui proprietà .Text fornisce il contenuto in testo semplice:

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}")

Passo 5: Leggi le larghezze delle colonne

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}")

Passo 6: Esporta in 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")

Problemi comuni e soluzioni

Le tabelle appaiono vuote

Causa: Le celle contengono nodi Image anziché nodi RichText.

Verifica:

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)")

Il conteggio delle colonne non corrisponde Columns

table.Columns riflette i metadati della colonna memorizzati nel file. Il numero effettivo di celle per riga può differire se le righe hanno celle unite (il formato file lo memorizza a livello binario; l’API pubblica non espone un flag di unione).

ImportError: Nessun modulo chiamato ‘aspose’

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

Domande Frequenti

Posso modificare i dati della tabella e salvarli di nuovo? No. La scrittura di ritorno al formato .one non è supportata. Le modifiche apportate in memoria (ad es. tramite RichText.Replace()) non possono essere persistite nel file di origine.

Le celle unite vengono rilevate? L’API CompositeNode non espone i metadati di unione. Ogni TableCell è trattata come una cella separata indipendentemente dall’unione visiva.

Posso contare quante righe ha una tabella? Sì: len(table.GetChildNodes(TableRow)).


Risorse correlate:

 Italiano