Як розбирати таблиці у файлах OneNote за допомогою Python

Як розбирати таблиці у файлах OneNote за допомогою Python

Microsoft OneNote дозволяє користувачам вбудовувати структуровані таблиці даних безпосередньо в сторінки. Aspose.Note FOSS for Python надає доступ до кожної таблиці через ієрархію Table → TableRow → TableCell, забезпечуючи програмний доступ до всього вмісту клітинок, метаданих стовпців та тегів таблиці.

Переваги

  1. Структурований доступ: кількість рядків і стовпців, вміст окремих клітинок, ширина стовпців
  2. Не потрібен додаток електронних таблиць: витягувати дані таблиці з OneNote на будь‑якій платформі
  3. Безкоштовний та з відкритим кодом: ліцензія 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()), не можуть бути збережені у вихідному файлі.

Чи виявляються об’єднані клітинки? API CompositeNode не надає метаданих про об’єднання. Кожен TableCell розглядається як окрема клітинка, незалежно від візуального об’єднання.

Чи можу я підрахувати, скільки рядків у таблиці? Так: len(table.GetChildNodes(TableRow)).


Пов’язані ресурси:

 Українська