Как да анализираме таблици в 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‑тo CompositeNode не разкрива метаданни за сливане. Всяка TableCell се третира като отделна клетка, независимо от визуалното сливане.

Мога ли да преброя колко реда има една таблица? Да: len(table.GetChildNodes(TableRow)).


Свързани ресурси:

 Български