Как парсить таблицы в файлах 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")

Общие проблемы и решения

Таблицы выглядят пустыми

Cause: Клетки содержат узлы 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)).


Связанные ресурсы:

 Русский