Sådan parser du tabeller i OneNote‑filer med Python

Sådan parser du tabeller i OneNote‑filer med Python

Microsoft OneNote giver brugerne mulighed for at indlejre strukturerede datatabeller direkte i sider. Aspose.Note FOSS for Python eksponerer hver tabel gennem en Table → TableRow → TableCell-hierarki, hvilket giver dig programmatisk adgang til alt celleindhold, kolonnemetadata og tabel‑tags.

Fordele

  1. Struktureret adgang: række- og kolonneantal, individuelt celleindhold, kolonnebredder
  2. Ingen regnearksapp påkrævet: udtræk tabeldata fra OneNote på enhver platform
  3. Gratis og open source: MIT-licens, ingen API-nøgle

Trin-for-trin guide

Trin 1: Installer Aspose.Note FOSS til Python

pip install aspose-note

Trin 2: Indlæs .one-filen

from aspose.note import Document

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

Trin 3: Find alle tabeller

Brug GetChildNodes(Table) til at hente hver tabel fra hele dokumentet rekursivt:

from aspose.note import Document, Table

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

Trin 4: Læs række- og celleværdier

Iterer TableRow og TableCell noder. Hver celle indeholder RichText noder, hvis .Text‑egenskab giver den ren‑tekst‑indhold:

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

Trin 5: Læs kolonnebredder

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

Trin 6: Eksporter til 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")

Almindelige problemer og løsninger

Tabeller fremstår tomme

Årsag: Cellerne indeholder Image-noder i stedet for RichText-noder.

Kontrol:

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

Kolonneantal matcher ikke Columns

table.Columns afspejler kolonnemetadatat lagret i filen. Det faktiske antal celler pr. række kan variere, hvis rækker har flettede celler (filformatet gemmer dette på binært niveau; den offentlige API afslører ikke en flettemarkør).

ImportError: Ingen modul med navnet ‘aspose’

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

Ofte stillede spørgsmål

Kan jeg redigere tabeldata og gemme dem igen? Nej. Tilbage‑skrivning til .one‑format understøttes ikke. Ændringer foretaget i hukommelsen (f.eks. via RichText.Replace()) kan ikke gemmes i kildefilen.

Er flettede celler registreret? API’en CompositeNode afslører ikke metadata for sammensmeltning. Hver TableCell behandles som en separat celle uanset visuel sammensmeltning.

Kan jeg tælle, hvor mange rækker en tabel har? Ja: len(table.GetChildNodes(TableRow)).


Relaterede ressourcer:

 Dansk