Como analisar tabelas em arquivos do OneNote usando Python

Como analisar tabelas em arquivos do OneNote usando Python

Este guia mostra como extrair e processar dados de tabela do Microsoft OneNote . .one arquivos em Python usando Document.GetChildNodes() Para caminhar o Table → TableRow → TableCell hierarquia. Aspose.Note FOSS para Python fornece acesso programático a todo o conteúdo de células, metadados de colunas e tags de tabela.

Benefícios

  1. Acesso estruturado: contagem de linhas e colunas, conteúdo das células individuais, largura da coluna
  2. Não é necessário aplicativo de planilha: extrair dados de tabela do OneNote em qualquer plataforma
  3. Liberto e de código aberto: licença MIT, sem chave API.

Guia passo a passo

Passo 1: Instalar Aspose.Note FOSS para Python

Instale o pacote Aspose.Note FOSS a partir do PyPI usando o comando pip abaixo:

pip install aspose-note

Passo 2: Carregar o ficheiro .one

Instanciar Document com o caminho para a .one arquivo para carregar a sua árvore de conteúdo completa na memória:

from aspose.note import Document

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

Passo 3: Encontre todas as tabelas

Utilização: 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)")

Passo 4: Leia os valores das linhas e células

Iteração TableRow e a) TableCell Cada célula contém: RichText Nodos cujos: .Text Propriedade dá 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}")

Passo 5: Ler largura de coluna

Leia as larguras das colunas e a visibilidade da borda do sistema de imagem. table.Columns coleção por iteração com: enumerate():

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: Exportação para CSV

Exportar todos os dados da tabela para um arquivo CSV escrevendo valores de texto em cada linha usando o código csv.writer módulo:

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 parecem vazias .

Causa da morte:As células contêm: Image de nós, em vez de RichText Nódulos.

Verificação: Utilize o seguinte código para contar: RichText e a) Image Nodos por célula e diagnosticar porque as células da tabela parecem vazias:

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 das colunas não corresponde. Columns

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

ImportError: Não há 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, estou a escrever para o meu amigo. .one As alterações feitas na memória (por exemplo, via RichText.Replace()) não pode ser persistente no ficheiro de origem.

Alguma célula fusionada foi detectada? A Comissão CompositeNode A API não expõe metadados de fusão. Cada um deles é usado para a função “compartilhar”. TableCell é tratada como uma célula separada, independentemente da fusão visual.

Posso contar quantas linhas uma mesa tem? - Sim , sim .: len(table.GetChildNodes(TableRow)).


Recursos relacionados:

Ver também:

 Português