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
- Struktureret adgang: række- og kolonneantal, individuelt celleindhold, kolonnebredder
- Ingen regnearksapp påkrævet: udtræk tabeldata fra OneNote på enhver platform
- 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-noteTrin 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 environmentOfte 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: