كيفية تحليل الجداول في ملفات OneNote باستخدام Python
Microsoft OneNote يتيح للمستخدمين تضمين جداول بيانات منظمة مباشرةً في الصفحات. Aspose.Note FOSS for Python يكشف كل جدول من خلال تسلسل Table → TableRow → TableCell، مما يمنحك وصولًا برمجيًا إلى جميع محتويات الخلايا، وبيانات تعريف الأعمدة، وعلامات الجداول.
الفوائد
- الوصول المنظم: عدد الصفوف والأعمدة، محتوى الخلية الفردية، عرض الأعمدة
- لا حاجة لتطبيق جدول بيانات: استخراج بيانات الجدول من OneNote على أي منصة
- مجاني ومفتوح المصدر: رخصة MIT، لا مفتاح API
دليل خطوة بخطوة
الخطوة 1: تثبيت Aspose.Note FOSS لـ Python
pip install aspose-noteالخطوة 2: تحميل ملف .one
from aspose.note import Document
doc = Document("MyNotes.one")
print(f"Pages: {len(list(doc))}")الخطوة 3: العثور على جميع الجداول
استخدم GetChildNodes(Table) لاسترجاع جميع الجداول من المستند بأكمله بشكل متكرر:
from aspose.note import Document, Table
doc = Document("MyNotes.one")
tables = doc.GetChildNodes(Table)
print(f"Found {len(tables)} table(s)")الخطوة 4: قراءة قيم الصف والخلية
تكرار عقد TableRow وTableCell. يحتوي كل خلية على عقد RichText التي تُعطي خاصية .Text المحتوى النصي العادي:
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}")الخطوة 5: قراءة عرض الأعمدة
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}")الخطوة 6: تصدير إلى 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")المشكلات الشائعة والحلول
الجداول تظهر فارغة
السبب: تحتوي الخلايا على عقد Image بدلاً من عقد RichText.
تحقق:
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)")عدد الأعمدة لا يتطابق Columns
table.Columns يعكس بيانات تعريف العمود المخزنة في الملف. قد يختلف العدد الفعلي للخلايا في كل صف إذا كان هناك خلايا مدمجة في الصفوف (يخزن تنسيق الملف ذلك على المستوى الثنائي؛ ولا تكشف الواجهة البرمجية العامة عن علامة الدمج).
ImportError: لا توجد وحدة باسم ‘aspose’
pip install aspose-note
pip show aspose-note # confirm it is installed in the active environmentالأسئلة المتكررة
هل يمكنني تعديل بيانات الجدول وحفظها مرة أخرى؟ لا. الكتابة مرة أخرى إلى تنسيق .one غير مدعومة. لا يمكن حفظ التغييرات التي تم إجراؤها في الذاكرة (مثلًا عبر RichText.Replace()) إلى ملف المصدر.
هل يتم اكتشاف الخلايا المدمجة؟ لا تعرض واجهة برمجة التطبيقات CompositeNode بيانات دمج الخلايا. يتم التعامل مع كل TableCell كخلية منفصلة بغض النظر عن الدمج البصري.
هل يمكنني عد عدد الصفوف في جدول؟ نعم: len(table.GetChildNodes(TableRow)).
الموارد ذات الصلة: