Como analisar tabelas em arquivos OneNote usando Python

Como analisar tabelas em arquivos OneNote usando Python

Microsoft OneNote permite que os usuários incorporem tabelas de dados estruturados diretamente nas páginas. Aspose.Note FOSS for Python expõe cada tabela através de uma hierarquia Table → TableRow → TableCell, proporcionando acesso programático a todo o conteúdo das células, metadados das colunas e tags da tabela.

Benefícios

  1. Acesso estruturado: contagem de linhas e colunas, conteúdo de células individuais, larguras das colunas
  2. Nenhum aplicativo de planilha necessário: extraia dados de tabelas do OneNote em qualquer plataforma
  3. Gratuito e de código aberto: licença MIT, sem chave de API

Guia passo a passo

Etapa 1: Instale o Aspose.Note FOSS para Python

pip install aspose-note

Etapa 2: Carregar o arquivo .one

from aspose.note import Document

doc = Document("MyNotes.one")
print(f"Pages: {len(list(doc))}")

Etapa 3: Encontrar todas as tabelas

Use GetChildNodes(Table) para recuperar todas as tabelas de todo o documento recursivamente:

from aspose.note import Document, Table

doc = Document("MyNotes.one")
tables = doc.GetChildNodes(Table)
print(f"Found {len(tables)} table(s)")

Etapa 4: Ler valores de linha e célula

Itere os nós TableRow e TableCell. Cada célula contém nós RichText cujos .Text propriedade fornece o conteúdo em texto simples:

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}")

Etapa 5: Ler larguras das colunas

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}")

Etapa 6: Exportar para 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")

Problemas Comuns e Soluções

As tabelas aparecem vazias

Causa: As células contêm nós Image em vez de nós RichText.

Verificar:

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)")

A contagem de colunas não corresponde Columns

table.Columns reflete os metadados de coluna armazenados no arquivo. O número real de células por linha pode diferir se as linhas tiverem células mescladas (o formato de arquivo armazena isso no nível binário; a API pública não expõe uma flag de mesclagem).

ImportError: Nenhum módulo chamado ‘aspose’

pip install aspose-note
pip show aspose-note  # confirm it is installed in the active environment

Perguntas Frequentes

Posso editar dados da tabela e salvá‑los de volta? Não. A gravação de volta no formato .one não é suportada. Alterações feitas na memória (por exemplo, via RichText.Replace()) não podem ser persistidas no arquivo de origem.

As células mescladas são detectadas? A API CompositeNode não expõe metadados de mesclagem. Cada TableCell é tratada como uma célula separada, independentemente da mesclagem visual.

Posso contar quantas linhas uma tabela tem? Sim: len(table.GetChildNodes(TableRow)).


Recursos Relacionados:

 Português