تصبح الصيغة التي يقرأها Excel لا شيء. لا تشك في أن الملف تالف.
عند استخدام data_only=True to read Excel الخاص بـ openpyxl، تصبح الصيغة بلا؟ الملف ليس تالفًا، وهو نتيجة الحساب التي لم يتم تخزينها مؤقتًا. تستخدم هذه المقالة مثالًا لتركيب الذاكرة للتحقق من الحدود السلوكية للمكتبة، وترفق قائمة مرجعية للقبول لمساعدتك على التمييز بين ما هو صحيح تقنيًا وما يمكن استخدامه في الأعمال التجارية.
عند استخدام openpyxl لقراءة Excel، إذا قمت بتعيين data_only=True لكنك حصلت على None، فهذا لا يعني عادةً تلف ملف أو خطأ في المكتبة، ولكن لا توجد نتيجة حسابية مخزنة مؤقتًا يمكن قراءتها في الملف.
هذه المقالة مكتوبة للمطورين وأفراد البيانات الذين يستخدمون التعليمات البرمجية لإنشاء تقارير Excel أو معالجتها. ربما تكون قد صادفت جدولاً تم إنشاؤه بواسطة برنامج نصي تلقائي، وكانت أعمدة الصيغة تقرأ جميع القيم الفارغة، لذا اشتبهت في وجود خطأ ما في الملف. بعد قراءة هذه المقالة، ستتمكن من التمييز بين "فقد ذاكرة التخزين المؤقت" و"تلف الملف"، ومعرفة طريقة القراءة التي يجب استخدامها، واستخدام قائمة التحقق من القبول لتحديد ما إذا كانت البيانات متاحة بالفعل.
تستخدم الأمثلة الموجودة في هذه المقالة عينات تركيبية وتستخدم فقط للتحقق من الحدود السلوكية للمكتبة. أنها لا تمثل ضمانًا لجميع الملفات الحقيقية أو تأثيرات المنتج. قبل معالجة المستندات المهمة، يرجى الاحتفاظ بالنسخ الأصلية ثم مراجعتها وفقًا للحدود وبنود القبول في النص.
ماذا علي أن أفعل إذا كانت الصيغة تقرأ لا شيء؟ استنتاج جملة واحدة
إذا كنت بحاجة إلى القيمة المحسوبة بواسطة الصيغة، ولكن data_only=True تقوم بإرجاع None، فتأكد أولاً من وجود قيمة مخزنة مؤقتًا في الملف، ثم قرر ما إذا كنت تريد إعادة الحساب والحفظ أو استخدام طرق قراءة أخرى.
| حالتك | الممارسات الموصى بها | سبب |
|---|---|---|
تقوم data_only=True بإرجاع None، ويتم إنشاء الملف بواسطة الكود | تأكد أولاً من وجود قيمة مخزنة مؤقتًا، ثم قرر ما إذا كنت تريد إعادة الحساب أم لا | عادةً ما تحتوي الملفات التي تم إنشاؤها بواسطة التعليمات البرمجية على صيغ فقط ولا تحتوي على ذاكرة تخزين مؤقت <v> |
| تحتاج إلى عرض نص الصيغة أو إعادة تحليله | القراءة باستخدام data_only=False | ما يتم إرجاعه هو سلسلة الصيغة، مثل '=1+2' |
| مطلوب قيمة رقمية للمشاركة في العملية، ولكن ذاكرة التخزين المؤقت مفقودة. | استخدم Excel أو LibreOffice لإعادة الحساب والحفظ، أو الاتصال بخدمة حسابية خارجية لإعادة التعبئة | openpyxl نفسها لا تحتوي على محرك حسابي |
بعض الخلايا هي None | قم بوضع علامة على المناصب المفقودة، أو قم بإعادة الحساب على دفعات أو قم بمطالبة المستخدمين بالإكمال | قد تكون حالة مختلطة ناجمة عن الادخار المتزايد |
تقوم صيغة الجدول المشترك أو الصفيف بإرجاع None | التحقق من المسارات المرجعية وأوضاع الحساب والتحقق منها يدويًا | السياق مفقود أو لم يتم توسيع الصفيف الديناميكي |
المعنى الحقيقي لمعلمات البيانات فقط
المفتاح لفهم هذه المشكلة هو التمييز بين "الصيغة" و"النتائج المخزنة مؤقتًا للصيغ". في معيار OOXML، تتكون الخلية التي تحتوي على صيغة من جزأين:
- تحتوي علامة
<f>على نص الصيغة، مثلSUM(A1:A10). - تقوم علامة
<v>بتخزين القيمة بعد العملية الحسابية الأخيرة.
تتحكم معلمة data_only الخاصة بـ load_workbook في إستراتيجية القراءة، وليس في سلوك الحساب.
- عند
data_only=False(الافتراضي)، تقومcell.valueبإرجاع سلسلة الصيغة. - عندما تقوم
data_only=True، تقومcell.valueبإرجاع محتويات علامة<v>.
إذا تم إنشاء الملف باستخدام تعليمات برمجية خالصة، أو لم يتم تشغيل عملية إعادة الحساب الكاملة قبل الحفظ، فلن تكون هناك عقدة <v> في XML، وستكون القيمة المرجعة بطبيعة الحال هي None. ولا يعد هذا فقدانًا للبيانات، بل إنه لم يكن هناك مطلقًا لقطة للنتائج المحسوبة في ذلك الموقع. ستواجه العديد من التقارير التي تم إنشاؤها بواسطة خطوط الأنابيب الآلية هذه المشكلة، لأن البرنامج النصي للإنشاء عادةً ما يكتب الصيغ فقط وليس مسؤولاً عن إجراء العمليات الحسابية.
مثال اصطناعي: ذاكرة التخزين المؤقت المفقودة والقراءة العادية
ولإعادة إنتاج هذا السلوك بدقة، قمنا ببناء عينتين اصطناعيتين خاضعتين للرقابة. هذا ليس اختبارًا للملفات الموجودة، ولكنه تحقق منطقي من سلوك المكتبة.
السيناريو العادي: تم فتح الملف وحفظه في Excel، ويحتوي على الصيغة =1+2 والقيمة المخزنة مؤقتًا 3. قم بتعيين data_only=True للقراءة، متوقعًا إخراج العدد الصحيح 3.
السيناريو المفقود: تتم كتابة الملف فقط باستخدام الصيغة =1+2 عبر التعليمات البرمجية، ولا يتم حسابه وحفظه مطلقًا بواسطة Excel. ضبط data_only=True للقراءة، والإخراج المتوقع هو None؛ إذا تم استخدام data_only=False بدلاً من ذلك، فسيتم إرجاع السلسلة '=1+2'.
يقوم التعليمة البرمجية التالية ببناء الحالتين المذكورتين أعلاه في الذاكرة والتحقق من سلوك القراءة لـ openpyxl. من المستحسن تشغيله في بيئة ذات تبعيات مقفلة، ويوصى باستخدام openpyxl>=3.1.0. لا يعتمد الكود على ملفات خارجية، وتم تصميم كافة التأكيدات بناءً على السلوك الحتمي للمكتبة.
from openpyxl import Workbook, load_workbook
from io import BytesIO
def create_formula_xlsx(has_cache: bool) -> bytes:
"""合成含公式的xlsx字节流。has_cache仅为逻辑标记,openpyxl无法生成真实缓存值。"""
wb = Workbook()
ws = wb.active
ws['A1'] = '=1+2'
# 注意:无论has_cache为何值,openpyxl保存的文件均不含<v>缓存节点。
# 真实有缓存的文件需手动用Excel/LibreOffice打开保存后替换此函数输入。
buffer = BytesIO()
wb.save(buffer)
return buffer.getvalue()
# 场景1:模拟无缓存文件(代码生成常态)
xlsx_bytes = create_formula_xlsx(has_cache=False)
wb_data = load_workbook(BytesIO(xlsx_bytes), data_only=True)
assert wb_data.active['A1'].value is None, "无缓存时data_only应返回None"
# 场景2:回退读取公式文本
wb_formula = load_workbook(BytesIO(xlsx_bytes), data_only=False)
assert wb_formula.active['A1'].value == '=1+2', "data_only=False应返回公式"
print("行为验证完成:缓存缺失时返回None符合预期")
يوضح هذا الرمز أن openpyxl نفسه لا يمكنه إنشاء قيم مخزنة مؤقتًا. إذا كنت بحاجة إلى اختبار الفرع "المخزن مؤقتًا"، فيجب عليك إعداد ملف حقيقي يتم حسابه وحفظه بواسطة Excel أو LibreOffice كمدخل. يمكن لـ create_formula_xlsx إنشاء عينات غير مخزنة مؤقتًا فقط. يتم تحديد ذلك من خلال حدود قدرة المكتبة ولا يعد عيبًا في المثال.
للتعامل مع هذا الموقف، فإن الطريقة الصحيحة لا تتمثل في "إصلاح" None بالقوة في طبقة القراءة، ولكن إنشاء استراتيجية تخفيض مستوى في طبقة الأعمال: عند اكتشاف خطأ في ذاكرة التخزين المؤقت، إما الرجوع إلى قراءة نص الصيغة ووضع علامة عليه، أو الاتصال بخدمة حسابية خارجية لإعادة الحساب ثم إعادة التعبئة. يعد الافتراض المباشر بأن data_only=True يمكنه دائمًا الحصول على القيمة مصدرًا شائعًا للأخطاء في معالجة البيانات اللاحقة.
📊 المقارنة الأساسية
| البند المقارن | data_only=False (افتراضي) | data_only=True |
|---|---|---|
cell.value إرجاع المحتوى | سلسلة الصيغة، مثل '=1+2' | قيمة ذاكرة التخزين المؤقت المحفوظة في <v>، مثل 3 |
| عندما يغيب ذاكرة التخزين المؤقت | لا يزال يُرجع نص الصيغة | العودة إلى None |
| مناسبة للمشهد | عرض الصيغة التحليلية التربيعية | قراءة القيمة المحسوبة |
| ملاحظة حول الاستخدام | لا يمكن المشاركة بشكل مباشر في العمليات العددية | لا يمكن الافتراض أنه يجب أن تكون هناك قيمة عددية |
معايير القبول وحدود المراجعة اليدوية
عند معالجة المستندات كثيفة الصيغة، لا يمكنك الحكم على نجاح القراءة لمجرد "عدم الإبلاغ عن أي خطأ". يميز الجدول أدناه بين صحة مستوى التعليمات البرمجية وسهولة الاستخدام على مستوى الأعمال.
| مراقبة الظواهر | الحكم الفني | قرارات معالجة الأعمال | ما إذا كانت المراجعة اليدوية مطلوبة |
|---|---|---|---|
data_only=True ترجع None | ذاكرة التخزين المؤقت المفقودة، خطأ غير تحليلي | التحقق من عملية إنشاء الملف المصدر؛ إذا كانت القيم الرقمية مطلوبة، استخدم محرك حساب خارجي لإعادة الحساب | نعم، تأكد من صحة منطق الصيغة |
تقوم data_only=False بإرجاع سلسلة الصيغة | قراءة نص الصيغة بشكل طبيعي | يمكن استخدامها للعرض أو التحليل الثانوي، ولا يمكن أن تشارك بشكل مباشر في العمليات العددية. | لا، إلا إذا كان بناء جملة الصيغة غير طبيعي |
بعض الخلايا لها قيم، وبعضها None | الحالة المختلطة، قد يكون سببها الادخار المتزايد | قم بوضع علامة على المناصب المفقودة، أو قم بإعادة الحساب على دفعات أو قم بمطالبة المستخدمين بالإكمال | نعم، قم باستكشاف أخطاء أسباب فشل الحساب في مناطق معينة وإصلاحها |
جميع خلايا الصيغة هي None | هناك احتمال كبير بأن الملف لم يتم فتحه بواسطة أي برنامج مكتبي | رفض كمصدر بيانات والمطالبة بإعادة التصدير | نعم، قم بتأكيد تكوين سلسلة الأدوات الأولية |
تقوم صيغة الجدول المشترك أو الصفيف بإرجاع None، ولكن مع ذاكرة تخزين مؤقت | السياق مفقود أو لم يتم توسيع الصفيف الديناميكي | تحقق من المسار المرجعي ووضع الحساب لتجنب الفشل بعد الترحيل | نعم، تحقق من اكتمال تبعية الصيغة |
تنطبق هذه القائمة فقط على سيناريو "قراءة القيمة المخزنة مؤقتًا الموجودة". إذا كان مطلبك هو "تحليل منطق الصيغة" أو "صيغة الحساب الديناميكي"، فإن وضع data_only غير مناسب. بالإضافة إلى ذلك، فإن الخلايا التي تتضمن مراجع مصنفات مشتركة أو صيغ صفيف أو وظائف مخصصة، حتى لو كانت تحتوي على قيم مخزنة مؤقتًا، قد تصبح غير صالحة بسبب فقدان السياق بعد الترحيل. وينبغي إدراج مثل هذه الحالات في نطاق المراجعة اليدوية.
🎯 ما هي الطريقة المناسبة لك؟
إذا كنت بحاجة إلى القيمة المحسوبة بواسطة الصيغة
استخدم أولاً Excel أو LibreOffice لفتح الملف وحفظه، وإنشاء ذاكرة تخزين مؤقت، ثم استخدم data_only=True لقراءته.
إذا كنت تحتاج فقط إلى عرض نص الصيغة أو تحليله
استخدم data_only=False الافتراضي لقراءة سلسلة الصيغة مباشرة.
إذا تم إنشاء ملفاتك على دفعات بواسطة أحد البرامج
أضف خطوة إعادة الحساب إلى عملية الإنشاء، أو اتصل بخدمة حوسبة خارجية لإعادة ملء ذاكرة التخزين المؤقت لتجنب قراءة None في اتجاه مجرى النهر.
إذا وجدت أن عددا كبيرا من الخلايا فارغة
تأكد أولاً مما إذا كان قد تمت معالجة المنبع بواسطة برامج المكتب، ثم قرر ما إذا كنت تريد إعادة التصدير أم لا.
❓ الأسئلة الشائعة (الأسئلة الشائعة)
1. إذا قامت خلية الصيغة بإرجاع None، فهل يعني ذلك أن الملف تالف؟
غير مؤكد. يشير هذا عادةً إلى عدم وجود حسابات مخزنة مؤقتًا للخلية وأن الملف نفسه قد يكون مكتملًا.
2. ما الفرق بين data_only=True وdata_only=False؟
تقوم data_only=False بإرجاع سلسلة الصيغة، وتقوم data_only=True بإرجاع القيمة المخزنة مؤقتًا المكتوبة في عملية الحفظ الأخيرة.
3. هل يستطيع openpyxl حساب الصيغة بنفسه وملء القيمة المخزنة مؤقتًا؟
لا أستطيع. لا يحتوي openpyxl على محرك حسابي، والملفات التي تم إنشاؤها بواسطة create_formula_xlsx تحتوي فقط على صيغ ولا تحتوي على ذاكرة تخزين مؤقت.
4. بعض الخلايا None، ماذا علي أن أفعل؟
حدد المواضع المفقودة، وأعد الحساب على دفعات أو اطلب من المستخدم الإكمال، وتحقق مما إذا كان الحساب قد فشل في منطقة معينة.
استخدم قائمة المراجعة هذه لترجمة المستندات
عند ترجمة الجداول التي تحتوي على صيغ، قم أولاً بالتمييز بين تلك التي تمثل نصًا، وأيها عبارة عن صيغ ورموز أعمال، ثم قم بترجمتها. لا يتحقق فحص ما بعد الترجمة من إمكانية تحويل اللغة الصينية إلى اللغة الهدف فحسب، بل يؤكد أيضًا أن الصيغ والمعرفات والعلاقات المرجعية لم تتغير.
توفر OmniDoc (بوابة المنتج) بوابة لترجمة المستندات متعددة التنسيقات، ويقدم الموقع الرسمي وظائف التعرف الضوئي على الحروف (OCR) والمسرد ووظائف المقارنة ثنائية اللغة. إذا أراد الفريق بدء المعالجة مباشرة من الملف، فيمكن تقييم هذا المسار باستخدام عينات حقيقية. الرجاء استخدام الملفات غير الحساسة التي لديك إذن بتحميلها، واستخدام عناصر الاختيار في هذه المقالة لمراجعة النتائج. لا تدعي هذه المقالة أن OmniDoc يستخدم المكتبات مفتوحة المصدر أو الخوارزميات الداخلية المذكورة في المقالة، ولا تستخدم الأمثلة كبديل لاختبار أداء المنتج.
📝 ملخص
يقرأ data_only=True None. في معظم الحالات، لا توجد قيمة ذاكرة تخزين مؤقت في الملف، وليس أن الملف تالف. قم أولاً بالتمييز بين أخطاء ذاكرة التخزين المؤقت وأخطاء التحليل، ثم حدد ما إذا كان يمكن استخدام البيانات للأعمال وفقًا لقائمة القبول.
جربه الآن: قم بتحميل المستند لبدء الترجمة، مع الاحتفاظ بالتخطيط الأصلي
مراجع
اقتراحات للخطوة التالية: استخدم أولاً المثال التجميعي الموجود في المقالة للتأكد من أن إصدارات openpyxl في بيئتك لها سلوك متسق؛ ثم حدد ملف عمل حقيقي، واقرأه باستخدام data_only=True وdata_only=False على التوالي، وسجل الحالة الفعلية في نموذج القبول؛ أخيرًا، قرر ما إذا كنت تريد تحسين عملية الإنشاء الأولي أو تقديم خدمة حوسبة خارجية لإكمال ذاكرة التخزين المؤقت بناءً على النسبة المفقودة.


