Jak parsovat tabulky v souborech OneNote pomocí Python

Jak parsovat tabulky v souborech OneNote pomocí Python

Microsoft OneNote umožňuje uživatelům vkládat strukturované datové tabulky přímo na stránky. Aspose.Note FOSS pro Python zpřístupňuje každou tabulku prostřednictvím Table → TableRow → TableCell hierarchie, která vám poskytuje programový přístup ke všemu obsahu buněk, metadatům sloupců a značkám tabulky.

Výhody

  1. Strukturovaný přístup: počet řádků a sloupců, obsah jednotlivých buněk, šířky sloupců
  2. Není potřeba žádná tabulková aplikace: extrahujte data tabulky z OneNote na jakékoli platformě
  3. Zdarma a open-source: licence MIT, žádný API klíč

Průvodce krok za krokem

Krok 1: Nainstalujte Aspose.Note FOSS pro Python

pip install aspose-note

Krok 2: Načtěte soubor .one

from aspose.note import Document

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

Krok 3: Najít všechny tabulky

Použijte GetChildNodes(Table) k získání každé tabulky z celého dokumentu rekurzivně:

from aspose.note import Document, Table

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

Krok 4: Číst hodnoty řádků a buněk

Iterujte TableRow a TableCell uzly. Každá buňka obsahuje RichText uzly, jejichž .Text vlastnost poskytuje prostý 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: Číst šířky sloupců

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

Časté problémy a opravy

Tabulky se jeví jako prázdné

Příčina: Buňky obsahují Image uzly spíše než RichText uzly.

Zkontrolovat:

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 sloupců neodpovídá Columns

table.Columns odráží metadata sloupců uložená v souboru. Skutečný počet buněk v řádku se může lišit, pokud řádky obsahují sloučené buňky (formát souboru ukládá tuto informaci na binární úrovni; veřejné API neodhaluje příznak sloučení).

ImportError: No module named ‘aspose’

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

Často kladené otázky

Mohu upravit data tabulky a uložit je zpět? Ne. Zpětné zápisy do .one formátu nejsou podporovány. Změny provedené v paměti (např. pomocí RichText.Replace()) nelze uložit do zdrojového souboru.

Jsou sloučené buňky detekovány? The CompositeNode API neodhaluje metadata sloučení. Každý TableCell je považován za samostatnou buňku bez ohledu na vizuální sloučení.

Mohu spočítat, kolik řádků má tabulka? Ano: len(table.GetChildNodes(TableRow)).


Související zdroje:

 Čeština