Wie man Tabellen in OneNote-Dateien mit Python parst

Wie man Tabellen in OneNote-Dateien mit Python parst

Microsoft OneNote ermöglicht es Benutzern, strukturierte Datentabellen direkt in Seiten einzubetten. Aspose.Note FOSS for Python stellt jede Tabelle über eine Table → TableRow → TableCell‑Hierarchie bereit und gewährt Ihnen programmatischen Zugriff auf alle Zellinhalte, Spaltenmetadaten und Tabellentags.

Vorteile

  1. Strukturierter Zugriff: Zeilen‑ und Spaltenanzahl, einzelner Zelleninhalt, Spaltenbreiten
  2. Keine Tabellenkalkulations‑App erforderlich: Tabellendaten aus OneNote auf jeder Plattform extrahieren
  3. Kostenlos und Open‑Source: MIT license, kein API‑Schlüssel

Schritt-für-Schritt-Anleitung

Schritt 1: Installieren Sie Aspose.Note FOSS für Python

pip install aspose-note

Schritt 2: Laden Sie die .one-Datei

from aspose.note import Document

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

Schritt 3: Alle Tabellen finden

Verwenden Sie GetChildNodes(Table), um jede Tabelle aus dem gesamten Dokument rekursiv abzurufen:

from aspose.note import Document, Table

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

Schritt 4: Zeilen- und Zellenwerte lesen

Iterieren Sie TableRow und TableCell Knoten. Jede Zelle enthält RichText Knoten, deren .Text‑Eigenschaft den reinen Textinhalt liefert:

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

Schritt 5: Spaltenbreiten lesen

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

Schritt 6: Exportieren nach 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")

Häufige Probleme und Lösungen

Tabellen erscheinen leer

Ursache: Die Zellen enthalten Image Knoten statt RichText Knoten.

Prüfen:

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

Spaltenanzahl stimmt nicht überein Columns

table.Columns spiegelt die im Dokument gespeicherten Spaltenmetadaten wider. Die tatsächliche Anzahl von Zellen pro Zeile kann abweichen, wenn Zeilen zusammengeführte Zellen enthalten (das Dateiformat speichert dies auf Binärebene; die öffentliche API stellt kein Zusammenführungs‑Flag bereit).

ImportError: Kein Modul mit dem Namen ‘aspose’

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

Häufig gestellte Fragen

Kann ich Tabellendaten bearbeiten und zurück speichern? Nein. Das Zurückschreiben in das .one-Format wird nicht unterstützt. Änderungen, die im Speicher vorgenommen wurden (z. B. über RichText.Replace()), können nicht in die Quelldatei übernommen werden.

Werden zusammengeführte Zellen erkannt? Die CompositeNode API stellt keine Merge-Metadaten bereit. Jede TableCell wird als separate Zelle behandelt, unabhängig von der visuellen Zusammenführung.

Kann ich zählen, wie viele Zeilen eine Tabelle hat? Ja: len(table.GetChildNodes(TableRow)).


Verwandte Ressourcen:

 Deutsch