Парсинг таблиць OneNote у Python
Microsoft OneNote дозволяє користувачам вбудовувати структуровані таблиці безпосередньо в сторінки, що ідеально підходить для списків завдань, розкладів, матриць порівняння та форм збору даних. Aspose.Note FOSS для Python робить можливим програмний витяг усіх цих табличних даних без необхідності встановлення Microsoft Office.
Встановлення
pip install aspose-note
Завантажте документ і знайдіть таблиці
GetChildNodes(Table) виконує рекурсивний пошук по всьому документу та повертає кожну таблицю як Table об’єкт:
from aspose.note import Document, Table
doc = Document("MyNotes.one")
tables = doc.GetChildNodes(Table)
print(f"Found {len(tables)} table(s)")
Читання значень клітинок
Таблиці мають трирівневу ієрархію: Table → TableRow → TableCell. Кожна клітинка містить RichText вузли, які .Text надає простий текстовий вміст:
from aspose.note import Document, Table, TableRow, TableCell, RichText
doc = Document("MyNotes.one")
for t_num, table in enumerate(doc.GetChildNodes(Table), start=1):
print(f"\nTable {t_num}:")
for r_num, row in enumerate(table.GetChildNodes(TableRow), start=1):
cells = row.GetChildNodes(TableCell)
row_values = [
" ".join(rt.Text for rt in cell.GetChildNodes(RichText)).strip()
for cell in cells
]
print(f" Row {r_num}: {row_values}")
Перевірка ширини колонок
Table.ColumnWidths повертає збережену ширину кожного стовпця у пунктах:
from aspose.note import Document, Table
doc = Document("MyNotes.one")
for i, table in enumerate(doc.GetChildNodes(Table), start=1):
widths = [col.Width for col in table.Columns]
print(f"Table {i}: {len(widths)} column(s)")
print(f" Widths (pts): {widths}")
print(f" Borders visible: {table.IsBordersVisible}")
Експорт усіх таблиць у CSV
Перетворення кожної таблиці в документі у формат CSV:
import csv, io
from aspose.note import Document, Table, TableRow, TableCell, RichText
doc = Document("MyNotes.one")
output = io.StringIO()
writer = csv.writer(output)
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(output.getvalue())
print("Saved tables.csv")
Експорт таблиць у словник Python / JSON
import json
from aspose.note import Document, Table, TableRow, TableCell, RichText
doc = Document("MyNotes.one")
result = []
for table in doc.GetChildNodes(Table):
rows = []
for row in table.GetChildNodes(TableRow):
cells = [
" ".join(rt.Text for rt in cell.GetChildNodes(RichText)).strip()
for cell in row.GetChildNodes(TableCell)
]
rows.append(cells)
result.append({"rows": rows, "column_widths": [col.Width for col in table.Columns]})
print(json.dumps(result, indent=2))
Використати перший рядок як заголовки
from aspose.note import Document, Table, TableRow, TableCell, RichText
doc = Document("MyNotes.one")
for table in doc.GetChildNodes(Table):
rows = table.GetChildNodes(TableRow)
if not rows:
continue
def row_text(row):
return [
" ".join(rt.Text for rt in cell.GetChildNodes(RichText)).strip()
for cell in row.GetChildNodes(TableCell)
]
headers = row_text(rows[0])
print("Headers:", headers)
for row in rows[1:]:
record = dict(zip(headers, row_text(row)))
print(" Record:", record)
Що бібліотека підтримує для таблиць
| Функція | Підтримується |
|---|---|
Table.ColumnWidths | Так: ширини стовпців у пунктах |
Table.BordersVisible | Так |
Table.Tags | Так: теги OneNote у таблицях |
Текст клітини через RichText | Так |
Зображення клітини через Image | Так |
| Об’єднані клітинки (метадані rowspan/colspan) | Не доступно у публічному API |
Записувати/редагувати таблиці та зберігати у .one | Ні |