Πώς να Αναλύσετε Πίνακες σε Αρχεία OneNote χρησιμοποιώντας Python
Το Microsoft OneNote επιτρέπει στους χρήστες να ενσωματώνουν δομημένους πίνακες δεδομένων απευθείας στις σελίδες. Το Aspose.Note FOSS για Python εκθέτει κάθε πίνακα μέσω μιας ιεραρχίας Table → TableRow → TableCell, παρέχοντάς σας προγραμματιστική πρόσβαση σε όλο το περιεχόμενο των κελιών, τα μεταδεδομένα των στηλών και τις ετικέτες του πίνακα.
Οφέλη
- Δομημένη πρόσβαση: αριθμός γραμμών και στηλών, περιεχόμενο μεμονωμένων κελιών, πλάτη στηλών
- Δεν απαιτείται εφαρμογή λογιστικού φύλλου: εξαγωγή δεδομένων πίνακα από το OneNote σε οποιαδήποτε πλατφόρμα
- Δωρεάν και ανοιχτού κώδικα: άδεια MIT, χωρίς κλειδί API
Οδηγός βήμα προς βήμα
Βήμα 1: Εγκατάσταση Aspose.Note FOSS για Python
pip install aspose-noteΒήμα 2: Φορτώστε το αρχείο .one
from aspose.note import Document
doc = Document("MyNotes.one")
print(f"Pages: {len(list(doc))}")Βήμα 3: Εύρεση Όλων των Πινάκων
Χρησιμοποιήστε GetChildNodes(Table) για να ανακτήσετε κάθε πίνακα από ολόκληρο το έγγραφο αναδρομικά:
from aspose.note import Document, Table
doc = Document("MyNotes.one")
tables = doc.GetChildNodes(Table)
print(f"Found {len(tables)} table(s)")Βήμα 4: Ανάγνωση τιμών γραμμής και κελιού
Επαναλάβετε τους κόμβους TableRow και TableCell. Κάθε κελί περιέχει κόμβους RichText των οποίων η ιδιότητα .Text παρέχει το περιεχόμενο απλού κειμένου:
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}")Βήμα 5: Ανάγνωση Πλάτους Στηλών
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}")Βήμα 6: Εξαγωγή σε 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")Κοινά Προβλήματα και Διορθώσεις
Οι πίνακες εμφανίζονται κενά
Αιτία: Τα κύτταρα περιέχουν κόμβους Image αντί για κόμβους RichText.
Έλεγχος:
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)")Ο αριθμός των στηλών δεν ταιριάζει Columns
table.Columns αντικατοπτρίζει τα μεταδεδομένα της στήλης που αποθηκεύονται στο αρχείο. Ο πραγματικός αριθμός των κελιών ανά γραμμή μπορεί να διαφέρει εάν οι γραμμές έχουν συγχωνευμένα κελιά (η μορφή αρχείου το αποθηκεύει σε δυαδικό επίπεδο· το δημόσιο API δεν εκθέτει σημαία συγχώνευσης).
ImportError: Δεν υπάρχει μονάδα με όνομα ‘aspose’
pip install aspose-note
pip show aspose-note # confirm it is installed in the active environmentΣυχνές Ερωτήσεις
Μπορώ να επεξεργαστώ δεδομένα πίνακα και να τα αποθηκεύσω ξανά; Όχι. Η εγγραφή πίσω στη μορφή .one δεν υποστηρίζεται. Οι αλλαγές που γίνονται στη μνήμη (π.χ. μέσω RichText.Replace()) δεν μπορούν να διατηρηθούν στο αρχικό αρχείο.
Ανιχνεύονται τα συγχωνευμένα κελιά; Το CompositeNode API δεν εκθέτει μεταδεδομένα συγχώνευσης. Κάθε TableCell αντιμετωπίζεται ως ξεχωριστό κελί, ανεξαρτήτως οπτικής συγχώνευσης.
Μπορώ να μετρήσω πόσες γραμμές έχει ένας πίνακας; Ναι: len(table.GetChildNodes(TableRow)).
Σχετικοί Πόροι: