Cum să Analizezi Tabelele în Fișiere OneNote Utilizând Python

Cum să Analizezi Tabelele în Fișiere OneNote Utilizând Python

Microsoft OneNote permite utilizatorilor să încorporeze tabele de date structurate direct în pagini. Aspose.Note FOSS pentru Python expune fiecare tabel printr-o ierarhie Table → TableRow → TableCell, oferindu‑vă acces programatic la tot conținutul celulelor, metadatele coloanelor și etichetele tabelului.

Beneficii

  1. Acces structurat: număr de rânduri și coloane, conținutul individual al celulelor, lățimile coloanelor
  2. Nu este necesară o aplicație de foi de calcul: extrage datele tabelului din OneNote pe orice platformă
  3. Gratuit și cu sursă deschisă: licență MIT, fără cheie API

Ghid pas cu pas

Pasul 1: Instalați Aspose.Note FOSS pentru Python

pip install aspose-note

Pasul 2: Încarcă fișierul .one

from aspose.note import Document

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

Pasul 3: Găsește toate tabelele

Utilizați GetChildNodes(Table) pentru a prelua fiecare tabel din întregul document recursiv:

from aspose.note import Document, Table

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

Pasul 4: Citește valorile rândului și celulei

Iterați nodurile TableRow și TableCell. Fiecare celulă conține noduri RichText ale căror proprietate .Text furnizează conținutul text simplu:

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

Pasul 5: Citește lățimile coloanelor

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

Pasul 6: Exportă în 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")

Probleme comune și soluții

Tabelele apar goale

Cauză: Celulele conțin noduri Image în loc de noduri RichText.

Verificare:

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

Numărul de coloane nu se potrivește Columns

table.Columns reflectă metadatele coloanei stocate în fișier. Numărul real de celule pe rând poate diferi dacă rândurile au celule fuzionate (formatul fișierului stochează acest lucru la nivel binar; API‑ul public nu expune un semnal de fuziune).

ImportError: Nu există niciun modul numit ‘aspose’

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

Întrebări frecvente

Pot să editez datele tabelului și să le salvez înapoi? Nu. Scrierea înapoi în formatul .one nu este suportată. Modificările făcute în memorie (de ex. prin RichText.Replace()) nu pot fi păstrate în fișierul sursă.

Sunt detectate celulele fuzionate? API-ul CompositeNode nu expune metadatele de fuziune. Fiecare TableCell este tratat ca o celulă separată, indiferent de fuziunea vizuală.

Pot să număr câte rânduri are un tabel? Da: len(table.GetChildNodes(TableRow)).


Resurse conexe:

 Română