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
- Accès structuré : nombre de lignes et de colonnes, contenu de chaque cellule, largeurs des colonnes
- Pas d’application de feuille de calcul requise : extraire les données du tableau depuis OneNote sur n’importe quelle plateforme
- 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 environmentFoire 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 :