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
- Strukturovaný přístup: počet řádků a sloupců, obsah jednotlivých buněk, šířky sloupců
- Není potřeba žádná tabulková aplikace: extrahujte data tabulky z OneNote na jakékoli platformě
- 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-noteKrok 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: