Ako parsovať tabuľky v súboroch OneNote pomocou Pythonu

Ako parsovať tabuľky v súboroch OneNote pomocou Pythonu

Microsoft OneNote umožňuje používateľom vkladať štruktúrované dátové tabuľky priamo na stránky. Aspose.Note FOSS pre Python odhaľuje každú tabuľku prostredníctvom hierarchie Table → TableRow → TableCell, čím vám poskytuje programový prístup ku všetkému obsahu buniek, metadátam stĺpcov a značkám tabuľky.

Výhody

  1. Štruktúrovaný prístup: počet riadkov a stĺpcov, obsah jednotlivých buniek, šírky stĺpcov
  2. Nie je potrebná aplikácia pre tabuľky: extrahovať údaje tabuľky z OneNote na akejkoľvek platforme
  3. Bezplatné a open-source: MIT licencia, žiadny API kľúč

Návod krok za krokom

Krok 1: Nainštalujte Aspose.Note FOSS pre Python

pip install aspose-note

Krok 2: Načítajte súbor .one

from aspose.note import Document

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

Krok 3: Nájsť všetky tabuľky

Použite GetChildNodes(Table) na získanie každej tabuľky z celého dokumentu rekurzívne:

from aspose.note import Document, Table

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

Krok 4: Prečítajte hodnoty riadku a bunky

Iterujte uzly TableRow a TableCell. Každá bunka obsahuje uzly RichText, ktorých vlastnosť .Text poskytuje čistý textový obsah:

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

Krok 5: Prečítajte šírky stĺpcov

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

Krok 6: Exportovať do 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")

Bežné problémy a riešenia

Tabuľky sa javia prázdne

Príčina: Bunky obsahujú uzly Image namiesto uzlov RichText.

Skontrolovať:

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

Počet stĺpcov sa nezhoduje Columns

table.Columns odráža metadáta stĺpca uložené v súbore. Skutočný počet buniek v riadku sa môže líšiť, ak majú riadky zlúčené bunky (formát súboru to ukladá na binárnej úrovni; verejné API neodhaľuje príznak zlúčenia).

ImportError: Žiadny modul s názvom ‘aspose’

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

Často kladené otázky

Môžem upravovať údaje v tabuľke a uložiť ich späť? Nie. Zápis späť do formátu .one nie je podporovaný. Zmeny vykonané v pamäti (napr. pomocou RichText.Replace()) nie je možné uložiť do zdrojového súboru.

Sú zlúčené bunky detekované? API CompositeNode neodhaľuje metadáta o zlúčení. Každá TableCell sa považuje za samostatnú bunku bez ohľadu na vizuálne zlúčenie.

Môžem spočítať, koľko riadkov má tabuľka? Áno: len(table.GetChildNodes(TableRow)).


Súvisiace zdroje:

 Slovenčina