Парсинг таблиць 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Ні

Наступні кроки