Як розбирати таблиці у файлах OneNote за допомогою Python
Microsoft OneNote дозволяє користувачам вбудовувати структуровані таблиці даних безпосередньо в сторінки. Aspose.Note FOSS для Python відкриває кожну таблицю через a Table → TableRow → TableCell ієрархію, надаючи вам програмний доступ до всього вмісту клітинок, метаданих стовпців та тегів таблиці.
Переваги
- Структурований доступ: кількість рядків і стовпців, вміст окремих клітинок, ширина стовпців
- Не потрібен жоден додаток електронних таблиць: витягнути дані таблиці з OneNote на будь-якій платформі
- Безкоштовний та з відкритим кодом: ліцензія MIT, без API key
Покроковий посібник
Крок 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 не розкриває merge flag).
ImportError: No module named ‘aspose’
pip install aspose-note
pip show aspose-note # confirm it is installed in the active environmentЧасті запитання
Чи можу я редагувати дані таблиці та зберігати їх назад? Ні. Запис назад у .one формат не підтримується. Зміни, внесені в пам’яті (наприклад, за допомогою RichText.Replace()) не може бути збережено у вихідному файлі.
Чи виявляються об’єднані клітинки? The CompositeNode API не надає метаданих про об’єднання. Кожен TableCell розглядається як окрема клітинка, незалежно від візуального об’єднання.
Чи можу я підрахувати, скільки рядків має таблиця? Так: len(table.GetChildNodes(TableRow)).
Пов’язані ресурси: