Comment analyser les tableaux dans les fichiers OneNote avec Python

Comment analyser les tableaux dans les fichiers OneNote avec Python

Microsoft OneNote permet aux utilisateurs d’intégrer des tableaux de données structurées directement dans les pages. Aspose.Note FOSS for Python expose chaque tableau via une hiérarchie Table → TableRow → TableCell, vous donnant un accès programmatique à tout le contenu des cellules, aux métadonnées des colonnes et aux balises du tableau.

Avantages

  1. Accès structuré : nombre de lignes et de colonnes, contenu de chaque cellule, largeurs des colonnes
  2. Pas d’application de feuille de calcul requise : extraire les données du tableau depuis OneNote sur n’importe quelle plateforme
  3. Gratuit et open-source : licence MIT, aucune clé API

Guide étape par étape

Étape 1 : Installer Aspose.Note FOSS pour Python

pip install aspose-note

Étape 2 : Charger le fichier .one

from aspose.note import Document

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

Étape 3 : Trouver toutes les tables

Utilisez GetChildNodes(Table) pour récupérer chaque tableau de l’ensemble du document de manière récursive :

from aspose.note import Document, Table

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

Étape 4 : Lire les valeurs de ligne et de cellule

Itérer TableRow et TableCell nœuds. Chaque cellule contient des RichText nœuds dont la propriété .Text fournit le contenu en texte brut :

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

Étape 5: Lire les largeurs de colonne

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

Étape 6 : Exporter en 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")

Problèmes courants et solutions

Les tableaux apparaissent vides

Cause: Les cellules contiennent des nœuds Image plutôt que des nœuds RichText.

Vérifier:

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

Le nombre de colonnes ne correspond pas Columns

table.Columns reflète les métadonnées de colonne stockées dans le fichier. Le nombre réel de cellules par ligne peut différer si les lignes ont des cellules fusionnées (le format de fichier stocke cela au niveau binaire ; l’API publique n’expose pas de drapeau de fusion).

ImportError : Aucun module nommé ‘aspose’

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

Foire aux questions

Puis-je modifier les données du tableau et les enregistrer à nouveau ? Non. L’écriture en retour au format .one n’est pas prise en charge. Les modifications effectuées en mémoire (par ex. via RichText.Replace()) ne peuvent pas être persistées dans le fichier source.

Les cellules fusionnées sont‑elles détectées ? L’API CompositeNode ne expose pas les métadonnées de fusion. Chaque TableCell est traitée comme une cellule distincte, quel que soit le fusionnement visuel.

Puis-je compter le nombre de lignes d’une table ? Oui : len(table.GetChildNodes(TableRow)).


Ressources associées :

 Français