Hoe tabellen in OneNote‑bestanden te parsen met Python

Hoe tabellen in OneNote‑bestanden te parsen met Python

Microsoft OneNote laat gebruikers gestructureerde gegevenstabellen direct in pagina’s insluiten. Aspose.Note FOSS voor Python maakt elke tabel beschikbaar via een Table → TableRow → TableCell hiërarchie, waardoor je programmatische toegang krijgt tot alle celinhoud, kolommetadata en tabeltags.

Voordelen

  1. Gestructureerde toegang: aantal rijen en kolommen, inhoud van individuele cellen, kolombreedtes
  2. Geen spreadsheet-app vereist: tabelgegevens uit OneNote halen op elk platform
  3. Gratis en open source: MIT-licentie, geen API-sleutel

Stapsgewijze handleiding

Stap 1: Installeer Aspose.Note FOSS for Python

pip install aspose-note

Stap 2: Laad het .one‑bestand

from aspose.note import Document

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

Stap 3: Alle tabellen vinden

Gebruik GetChildNodes(Table) om elke tabel uit het volledige document recursief op te halen:

from aspose.note import Document, Table

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

Stap 4: Lees rij- en celwaarden

Itereren TableRow en TableCell nodes. Elke cel bevat RichText nodes waarvan de .Text eigenschap de platte‑tekstinhoud geeft:

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

Stap 5: Kolombreedtes lezen

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

Stap 6: Exporteren naar 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")

Veelvoorkomende problemen en oplossingen

Tabellen lijken leeg

Oorzaak: De cellen bevatten Image knooppunten in plaats van RichText knooppunten.

Controle:

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

Kolomtelling komt niet overeen Columns

table.Columns reflecteert de kolommetadata die in het bestand is opgeslagen. Het werkelijke aantal cellen per rij kan verschillen als rijen samengevoegde cellen hebben (het bestandsformaat slaat dit op binair niveau op; de openbare API exposeert geen samenvoegvlag).

ImportError: Geen module met de naam ‘aspose’

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

Veelgestelde vragen

Kan ik tabelgegevens bewerken en terug opslaan? Nee. Terugschrijven naar .one-formaat wordt niet ondersteund. Wijzigingen die in het geheugen worden aangebracht (bijv. via RichText.Replace()) kunnen niet worden opgeslagen in het bronbestand.

Worden samengevoegde cellen gedetecteerd? De CompositeNode API geeft geen merge metadata vrij. Elke TableCell wordt behandeld als een aparte cel, ongeacht visueel samenvoegen.

Kan ik tellen hoeveel rijen een tabel heeft? Ja: len(table.GetChildNodes(TableRow)).


Gerelateerde bronnen:

 Nederlands