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
- Strukturerad åtkomst: rad- och kolumnantal, individuellt cellinnehåll, kolumnbredder
- Ingen kalkylbladsapp krävs: extrahera tabelldata från OneNote på vilken plattform som helst
- 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-noteSteg 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 environmentVanliga 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: