Kako parsirati tabele u OneNote fajlovima koristeći Python

Kako parsirati tabele u OneNote fajlovima koristeći Python

Microsoft OneNote omogućava korisnicima da ugrađuju strukturirane tabele podataka direktno u stranice. Aspose.Note FOSS za Python izlaže svaku tabelu kroz Table → TableRow → TableCell hijerarhiju, dajući vam programatski pristup svim sadržajima ćelija, metapodacima kolona i oznakama tabele.

Prednosti

  1. Strukturirani pristup: broj redova i kolona, sadržaj pojedinačnih ćelija, širine kolona
  2. Nije potrebna aplikacija za proračunske tablice: izvadite podatke tabele iz OneNote‑a na bilo kojoj platformi
  3. Besplatno i otvorenog koda: MIT licenca, bez API ključa

Vodič korak po korak

Korak 1: Instalirajte Aspose.Note FOSS za Python

pip install aspose-note

Korak 2: Učitaj .one datoteku

from aspose.note import Document

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

Korak 3: Pronađite sve tabele

Koristite GetChildNodes(Table) da biste preuzeli svaku tabelu iz celog dokumenta rekurzivno:

from aspose.note import Document, Table

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

Korak 4: Čitanje vrednosti redova i ćelija

Izvršite iteraciju TableRow i TableCell čvorova. Svaka ćelija sadrži RichText čvorove čija .Text svojstvo daje sadržaj u običnom tekstu:

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

Korak 5: Čitanje širina kolona

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

Korak 6: Izvezi u 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")

Уобичајени проблеми и решења

Табеле се приказују празне

Uzrok: Ćelije sadrže Image čvorove umesto RichText čvorova.

Provera:

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

Broj kolona se ne podudara Columns

table.Columns odražava metapodatke kolona sačuvane u fajlu. Stvarni broj ćelija po redu može se razlikovati ako redovi imaju spojene ćelije (format fajla to čuva na binarnom nivou; javni API ne izlaže zastavicu za spajanje).

ImportError: Nema modula pod nazivom ‘aspose’

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

Često postavljana pitanja

Mogu li da uređujem podatke tabele i sačuvam ih nazad? Ne. Pisanje nazad u format .one nije podržano. Promene napravljene u memoriji (npr. putem RichText.Replace()) ne mogu biti sačuvane u izvornoj datoteci.

Da li su spojene ćelije otkrivene? API CompositeNode ne izlaže metapodatke o spajanju. Svaka TableCell se tretira kao zasebna ćelija, bez obzira na vizuelno spajanje.

Mogu li da izbrojim koliko redova ima tabela? Da: len(table.GetChildNodes(TableRow)).


Povezani resursi:

 Српски