Hur man parsar tabeller i OneNote-filer med Python

Hur man parsar tabeller i OneNote-filer med Python

Microsoft OneNote låter användare bädda in strukturerade datatabeller direkt i sidor. Aspose.Note FOSS för Python exponerar varje tabell genom en Table → TableRow → TableCell hierarki, vilket ger dig programmatisk åtkomst till allt cellinnehåll, kolumnmetadata och tabelltaggar.

Fördelar

  1. Strukturerad åtkomst: rad- och kolumnantal, individuellt cellinnehåll, kolumnbredder
  2. Ingen kalkylbladsapp krävs: extrahera tabelldata från OneNote på vilken plattform som helst
  3. Fri och öppen källkod: MIT-licens, ingen API-nyckel

Steg-för-steg-guide

Steg 1: Installera Aspose.Note FOSS för Python

pip install aspose-note

Steg 2: Ladda .one-filen

from aspose.note import Document

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

Steg 3: Hitta alla tabeller

Använd GetChildNodes(Table) för att hämta varje tabell från hela dokumentet rekursivt:

from aspose.note import Document, Table

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

Steg 4: Läs rad- och cellvärden

Iterera TableRow och TableCell noder. Varje cell innehåller RichText noder vars .Text egenskap ger det rena textinnehållet:

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

Steg 5: Läs kolumnbredder

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

Steg 6: Exportera till 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")

Vanliga problem och lösningar

Tabeller verkar tomma

Orsak: Cellerna innehåller Image noder snarare än RichText noder.

Kontrollera:

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

Kolumnantalet matchar inte Columns

table.Columns återspeglar kolumnmetadata som lagras i filen. Det faktiska antalet celler per rad kan skilja sig om rader har sammanslagna celler (filformatet lagrar detta på binär nivå; det offentliga API:et exponerar inte en sammanslagningsflagga).

ImportError: Ingen modul med namnet ‘aspose’

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

Vanliga frågor

Kan jag redigera tabelldata och spara tillbaka det? Nej. Att skriva tillbaka till .one format stöds inte. Ändringar som görs i minnet (t.ex. via RichText.Replace()) kan inte sparas till källfilen.

Detekteras sammanslagna celler? Den CompositeNode API:et exponerar inte metadata för sammanslagning. Varje TableCell behandlas som en separat cell oavsett visuell sammanslagning.

Kan jag räkna hur många rader en tabell har? Ja: len(table.GetChildNodes(TableRow)).


Relaterade resurser:

 Svenska