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
- Acesso estruturado: contagem de linhas e colunas, conteúdo das células individuais, largura da coluna
- Não é necessário aplicativo de planilha: extrair dados de tabela do OneNote em qualquer plataforma
- 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-notePasso 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 environmentPerguntas 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:
- Guia de Desenvolvedor para análise da tabela
- Como extrair texto
- Referência API
- Blog: Analisar tabelas OneNote em Python