Classic XLS و XLSX همان قرارداد بدون اثر جانبی را برای طبقهبندی ورودی فرمول پیش از آنکه فراخواننده سلولی را تغییر دهد در معرض دید قرار میدهند
خطمشی مشترک
TXLSFormulaEmptyStringMode =
(xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
(xlfusmReject, xlfusmPreserve);
TXLSFormulaEntryPolicy = record
EmptyStringMode: TXLSFormulaEmptyStringMode;
UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;
property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
دو IXLSWorkbook و TXLSWorkbook کلاسیک، ویژگی را همراه با TXLSXWorkbook در معرض دید قرار میدهند؛ XLSDefaultFormulaEntryPolicy ورودی خالی را پاک میکند و توابع ناشناخته و نامهای تعریفشده ناشناخته را رد میکند
ویژگی کتاب کار بهصورت مقدار کپی و هنگام انتساب بهصورت اتمی اعتبارسنجی میشود، بهگونهای که مقادیر شمارشی پشتیبانینشده EArgumentOutOfRangeException را بدون تغییر خطمشی پیشین ایجاد میکنند
نتیجه اعتبارسنجی
function ValidateFormulaEntry(Row, Col: Integer;
const Formula: WideString): TXLSFormulaEntryValidationResult;
TXLSFormulaEntryValidationResult = record
Issue: TXLSFormulaEntryIssue;
Action: TXLSFormulaEntryAction;
Symbol: WideString;
end;
Issue بین بیخطایی، تابع ناشناخته، نام ناشناخته، خطای نحوی، محدودیت قالب هدف و مختصات هدف نامعتبر تمایز قائل میشود
Action پاکسازی سلول، ذخیره رشته، ذخیره فرمول یا ردکردن را برمیگزیند، در حالی که Symbol تابع یا نام ناشناخته را هنگامی که یکی از آنها شناسایی شده باشد مشخص میکند
متن خالی و فرمولها
ورودیِ کاملاً خالی بسته به EmptyStringMode مقدار xlfeaClearCell یا xlfeaStoreString را برمیگرداند
فرمولی که رشته خالی برمیگرداند، مانند =""، فرمول باقی میماند و وقتی قالب هدف بتواند آن را بازنمایی کند مقدار xlfeaStoreFormula را برمیگرداند
متن فرمول میتواند یک علامت مساوی ابتدایی را در بر بگیرد یا از آن صرفنظر کند
انتساب رشتهٔ کاملاً خالی از طریق ویژگی معمولی Value سلول در Classic XLS یا XLSX اکنون مستقیماً این حالت را اعمال میکند: حالت پیشفرض هر مقدار یا فرمول موجود را حذف میکند، در حالی که xlfesmPreserveString محتوای سلول را با رشته ثابتی به طول صفر جایگزین میکند
Null و Unassigned در هر دو حالت همیشه سلول را پاک میکنند، در حالی که فرمول واقعی مانند ="" فرمولی با نتیجه رشته خالی که بهطور مستقل ذخیره یا محاسبه میشود باقی میماند
نوشتههای سطر یا ستون XLSX برای string و Variant همان قاعده را بدون عینیتبخشی به حفرههای پاکشده اعمال میکنند و تا زمانی که مقادیر باقیمانده در آن بازنماییپذیر باشند، ذخیرهسازی بستهبندیشده را نگه میدارند
خوانندههای بومی XLS، XLSX و ODS و مبدلهای XLS-to-XLSX یا XLSX-to-XLS مقادیر ذخیرهشده را ورودی مورد اعتماد تلقی میکنند، از این رو رشته خالی ثابت در سطح فایل حتی زمانی که کتاب کار مقصد خطمشی پیشفرض ورود کاربر را نگه دارد باقی میماند
نمادهای ناشناخته و قالبهای هدف
توابع کاربر ثبتشده در سطح کتاب کار یا فرایند و فراخوانهای OnUserFunction یا OnUserFunctionEx منتسب، در زمان اعتبارسنجی بدون فراخوانی هیچ گردانندهای شناختهشده بهشمار میآیند، در حالی که فراخوانیهای ثبتنشده نام تابع خود را در Symbol نگه میدارند
حالت سختگیرانه برای توابع یا نامهای ناشناخته xlfeaReject را برمیگرداند؛ انتساب از طریق ویژگی معمولی Formula سلول پیش از تغییر مقدار، حافظه پنهان فرمول یا وابستگیها رد میکند
حالت حفظ، تشخیص را نگه میدارد و فرمول را از طریق API معمولی سلول ذخیره میکند؛ Classic XLS فراخوانی ناشناخته را با توکنهای توابع کاربر افزونهای BIFF سریالسازی میکند و متن نام ناشناخته را در ذخیرهسازی، بازگشایی و تبدیل XLS/XLSX حفظ میکند
Classic XLS افزون بر آن فرمولهای شناختهشده را از طریق نویسنده BIFF کامپایل میکند و وقتی عبارت بازنماییپذیر نباشد xlfeiTargetFormatUnsupported را برمیگرداند، در حالی که XLSX توابع فرمول مدرن شناختهشدهای را که مدل فرمولش پشتیبانی میکند میپذیرد
اعتبارسنجی XLSX مقدار LAMBDA، فراخوانپذیرهای واژگانی LET، نامهای تعریفشدهای که به لامبداها ارجاع میدهند، جاینگهدارهای گزارش، پیوندهای خارجی ثبتشده کتابهای کار و ارجاعهای ساختاری واجد شرایط یا بدون شرایط معتبر را شناخته و از جمله فرمهای تودرتو و فرم سطر جاری را در بر میگیرد
حالت سازگاری همچنین میتواند ارجاعهای ساختاری خارجی حلنشده را برای پردازش بعدی نگه دارد، در حالی که حالت سختگیرانه همچنان نامهای جدول حلنشده را رد میکند
محاسبه و ممیزی انبوه
تابع ناشناختهٔ نگهداشتهشدهای که پس از توزیع میان لامبداها و توابع کاربر بدون رسیدگی بماند، یا نام ناشناختهٔ نگهداشتهشده، بهعنوان خطای Variant با کد $1D یعنی خطای #NAME? اکسل ارزیابی میشود؛ همان خطای نوعدار از طریق فرمولهای وابسته و ارزیابی زمینهای منتقل میشود
توابع درونساز شناختهشدهٔ پیادهسازینشده از فراخوانی ناشناخته متمیز باقی میمانند، در حالی که ثبت، جایگزینی، حذف یا پاکسازی تابع کاربر در سطح کتاب کار یا فرایند و تغییر فرمول یک نام تعریفشده، وضعیت کهنه وابستگی و محاسبه را بیاعتبار میکند
function AuditFormulaSymbols: TXLSFormulaSymbolIssues; overload;
function AuditFormulaSymbols(
out AStats: TXLSFormulaSymbolAuditStats):
TXLSFormulaSymbolIssues; overload;
TXLSWorkbook و TXLSXWorkbook همان نسخههای سربارگذاریشدهٔ ممیزی انبوه را فراهم میکنند؛ هر مسئله تابع ناشناخته، نام ناشناخته یا خطای نحوی را همراه با یا مکان سلول کاربرگ یا مکان نام تعریفشده، فرمول منبع و نماد حلنشده شناسایی میکند
ممیزی بهجای پویش متن از درختهای فرمول تجزیهشده یا توکنهای ذخیرهشدهٔ BIFF عبور میکند، بنابراین متن شبیه تابع درون یک رشته گزارش نمیشود؛ کامپایل XLSX از حافظه پنهان محلی-عملیات با کلیدهایی شامل متن فرمول حلشده، کاربرگ، زبان محلی، نسل نامهای تعریفشده، نسلهای دفتر توابع کاربر و در دسترس بودن فراخوانها استفاده میکند
EntryCount فرمولهای ممیزیشده را گزارش میکند، UniqueFormulaCount فرمولهایی که بهطور مستقل کامپایل یا بازرسی شدهاند را گزارش میکند و CacheHitCount ورودیهای تکراریای را گزارش میکند که از حافظه پنهان عملیات سرویس شدهاند
بدون جهش کاربرگ
اعتبارسنجی سلولی نمیسازد یا ویرایش نمیکند، مقادیر پنهانشده را تغییر نمیدهد، نمودار وابستگی را بهروزرسانی نمیکند، کتاب کار را کهنه علامت نمیزند و گردانندهٔ تابع کاربر ثبتشده را فراخوانی نمیکند
اعتبارسنجی مستقیم بدون جهش باقی میماند؛ انتساب معمولی فرمول همان تصمیم را بهطور داخلی اعمال میکند و تنها پس از موفقیت اعتبارسنجی و آمادهسازی قالب هدف ثبت میشود
نمونه Delphi
Policy := Workbook.FormulaEntryPolicy;
Policy.UnknownFunctionMode := xlfusmReject;
Policy.UnknownNameMode := xlfusmReject;
Workbook.FormulaEntryPolicy := Policy;
Validation := Sheet.ValidateFormulaEntry(4, 2, FormulaText);
if Validation.Action = xlfeaStoreFormula then
Sheet.Cells[4, 2].Formula := FormulaText;
Issues := Workbook.AuditFormulaSymbols(Stats);
for I := 0 to High(Issues) do
if Issues[I].Kind = xlfsiUnknownFunction then
LogUnknownSymbol(Issues[I].Symbol);
همچنین ببینید