Worksheet Classic XLS dan XLSX mengekspos API baca-saja yang sama untuk mengevaluasi teks formula seolah-olah formula tersebut dimasukkan pada baris dan kolom berbasis-satu yang dipilih
Evaluasi sekali jalan
function EvaluateFormulaAt(Row, Col: Integer;
const Formula: WideString): TXLSFormulaEvaluationResult; overload;
function EvaluateFormulaAt(Row, Col: Integer;
const Formula: WideString;
ReferenceStyle: TXLSFormulaReferenceStyle;
const Options: TXLSFormulaEvaluationOptions): TXLSFormulaEvaluationResult; overload;
Worksheet menyediakan konteks local-name, referensi tak-terkualifikasi, tabel, dan tautan eksternal tanpa mengubah sheet aktif, seleksi, model sel, cache formula, status dirty, atau grafik dependensi
xlfrsA1 mempertahankan referensi absolut dan campuran sambil menyelesaikan referensi relatif dari sel target; xlfrsR1C1 menyelesaikan offset relatif langsung dari target tersebut
Hasil bertipe
TXLSFormulaEvaluationResult mengembalikan Status, Valuebertipe asli, IsVolatile, dan record Issue yang stabil berisi status, kode native, dan pesan
TXLSFormulaEvaluationStatus = (xlfeOk, xlfeInvalidArgument,
xlfeWorksheetUnavailable, xlfeParseError, xlfeUnsupportedFunction,
xlfeCircularReference, xlfeExternalReferenceDenied, xlfeCancelled,
xlfeResourceLimit, xlfeFailed, xlfeUnsafeFunctionDenied);
TXLSFormulaEvaluationIssue = record
Status: TXLSFormulaEvaluationStatus;
NativeCode: Integer;
Message: WideString;
end;
Nilai formula seperti #DIV/0!, #REF!, string kosong, array, nilai Boolean, dan tanggal tetap merupakan nilai yang dapat dibedakan; kegagalan parse, fungsi yang tidak didukung, referensi melingkar, referensi eksternal yang ditolak, callback tidak aman yang ditolak, pembatalan, argumen tidak valid, worksheet yang tidak tersedia, dan kehabisan resource menggunakan status API eksplisit Issue.NativeCode membawa kode kesalahan mesin yang mendasarinya dan Issue.Message the human-readable description when Status is not xlfeOk
Template immutable yang dapat dipakai ulang
function CreateFormulaEvaluationTemplate(Row, Col: Integer;
const Formula: WideString;
ReferenceStyle: TXLSFormulaReferenceStyle): IXLSFormulaEvaluationTemplate;
Template mengompilasi formula sekali di jangkarannya dan mengekspos EvaluateAt serta EvaluateAtWithOptions untuk evaluasi berulang pada sel target yang berbeda
Formula A1 dan R1C1 biasa memakai ulang pohon terkompilasi secara langsung; referensi terstruktur A1 yang maknanya bergantung pada baris tabel target diselesaikan dan dikompilasi untuk konteks target tersebut
Template tidak menyimpan status worksheet yang dapat ditulis, melaporkan xlfeWorksheetUnavailable dengan aman setelah workbook dihancurkan, dan beralih ke kompilasi ulang sadar-konteks ketika perubahan workbook membuat konteks terkompilasi asli kedaluwarsa
Opsi resource, referensi eksternal, dan callback
| AllowExternalReferences | Default true tetapi hanya mengizinkan target workspace yang didaftarkan secara eksplisit atau cache lokal file dan tidak pernah melakukan akses file atau jaringan implisit |
| AllowUnsafeFormulaCallbacks | Default false dan memblokir nama fungsi berbahaya agar tidak mencapai registry fungsi pengguna atau callback sebelum ada argumen yang dievaluasi; penolakan mengembalikan xlfeUnsafeFunctionDenied |
| CancelFlag | Pointer Boolean opsional yang diperiksa sebelum dan sesudah evaluasi |
| MaxFormulaLength | Default 8192 unit kode UTF-16 |
| MaxEvaluationSteps | Default 1,000,000 evaluasi item sintaks |
| MaxRecursionDepth | Default 256 evaluasi formula bersarang |
| MaxArrayBytes | Default 64 MiB untuk payload array yang dihasilkan |
Maksimum nol atau negatif menonaktifkan batas per-panggilan tersebut; kebijakan memori array seluruh workbook tetap berlaku, dan tercapainya batas yang aktif mengembalikan xlfeResourceLimit setelah melepaskan status evaluasi sementara
Overload yang menerima opsi eksplisit memperlakukan AllowUnsafeFormulaCallbacks sebagai otoritatif untuk panggilan tersebut; evaluasi sekali jalan default dan evaluasi template mewarisi properti workbook dengan nama yang sama
Contoh Delphi
Template := Sheet.CreateFormulaEvaluationTemplate(2, 2,
'=R[-1]C[-1]+1', xlfrsR1C1);
Result := Template.EvaluateAt(2, 2);
if Result.Status = xlfeOk then
UseValue(Result.Value);
Options := XLSDefaultFormulaEvaluationOptions;
Options.MaxEvaluationSteps := 10000;
Result := Template.EvaluateAtWithOptions(20, 4, Options);
Contoh C++Builder
Lxcalc::_di_IXLSFormulaEvaluationTemplate evalTemplate =
sheet->CreateFormulaEvaluationTemplate(1, 1,
WideString(L"=ROW()+COLUMN()"), Lxcalc::xlfrsA1);
Lxcalc::TXLSFormulaEvaluationResult result =
evalTemplate->EvaluateAt(7, 8);Lihat juga