เอกสาร HotXLS

การประเมินสูตรตามบริบท

เวิร์กชีตแบบ Classic XLS และ XLSX เปิดเผย API แบบอ่านอย่างเดียวชุดเดียวกันสำหรับการประเมินข้อความสูตร ราวกับว่าสูตรถูกป้อนไว้ที่แถวและคอลัมน์ที่เลือกซึ่งเริ่มนับจาก 1

การประเมินแบบครั้งเดียวจบ

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;
เวิร์กชีตจัดเตรียมบริบทชื่อท้องถิ่น การอ้างอิงแบบไม่ระบุคุณสมบัติ ตาราง และลิงก์ภายนอกให้ โดยไม่เปลี่ยนเวิร์กชีตที่ใช้งาน การเลือก โมเดลเซลล์ แคชสูตร สถานะความไม่สดใหม่ หรือกราฟการพึ่งพา
xlfrsA1 คงการอ้างอิงแบบสัมบูรณ์และแบบผสมไว้ พร้อมแก้การอ้างอิงแบบสัมพัทธ์จากเซลล์เป้าหมาย xlfrsR1C1 แก้ออฟเซตสัมพัทธ์โดยตรงจากเป้าหมายนั้น

ผลลัพธ์แบบมีชนิด

TXLSFormulaEvaluationResult ส่งกลับ Status, Value ดั้งเดิมแบบมีชนิด, IsVolatile และระเบียน Issue ที่เสถียรซึ่งมีสถานะ รหัสดั้งเดิม และข้อความ
ค่าสูตรเช่น #DIV/0!, #REF!, สตริงว่าง อาร์เรย์ ค่าตรรกะ และวันที่ ยังคงเป็นค่าที่แยกแยะได้ ส่วนการแยกวิเคราะห์ล้มเหลว ฟังก์ชันที่ไม่รองรับ การอ้างอิงวนรอบ การอ้างอิงภายนอกที่ถูกปฏิเสธ callback ที่ไม่ปลอดภัยที่ถูกปฏิเสธ การยกเลิก อาร์กิวเมนต์ไม่ถูกต้อง เวิร์กชีตไม่พร้อมใช้งาน และทรัพยากรหมด จะใช้สถานะ API ที่ระบุชัดเจน

เทมเพลตเปลี่ยนแปลงไม่ได้ที่ใช้ซ้ำได้

function CreateFormulaEvaluationTemplate(Row, Col: Integer;
  const Formula: WideString;
  ReferenceStyle: TXLSFormulaReferenceStyle): IXLSFormulaEvaluationTemplate;
เทมเพลตคอมไพล์สูตรหนึ่งครั้งที่จุดยึด และเปิดเผย EvaluateAt และ EvaluateAtWithOptions สำหรับการประเมินซ้ำที่เซลล์เป้าหมายต่างกัน
สูตร A1 และ R1C1 ทั่วไปใช้ต้นไม้ที่คอมไพล์แล้วซ้ำโดยตรง ส่วนการอ้างอิงเชิงโครงสร้างแบบ A1 ที่ความหมายขึ้นกับแถวตารางของเป้าหมาย จะถูกแก้และคอมไพล์สำหรับบริบทเป้าหมายนั้น
เทมเพลตไม่คงสถานะเวิร์กชีตที่เขียนได้ไว้ รายงาน xlfeWorksheetUnavailable อย่างปลอดภัยหลังสมุดงานถูกทำลาย และย้อนกลับไปคอมไพล์ใหม่โดยคำนึงถึงบริบทเมื่อการเปลี่ยนแปลงสมุดงานทำให้บริบทที่คอมไพล์เดิมล้าสมัย

ตัวเลือกทรัพยากร การอ้างอิงภายนอก และ callback

AllowExternalReferencesค่าเริ่มต้นเป็น true แต่อนุญาตเฉพาะเป้าหมายพื้นที่ทำงานที่ลงทะเบียนชัดเจนหรือแคชเฉพาะไฟล์เท่านั้น และไม่ทำการเข้าถึงไฟล์หรือเครือข่ายโดยปริยายเด็ดขาด
AllowUnsafeFormulaCallbacksค่าเริ่มต้นเป็น false และปิดกั้นชื่อฟังก์ชันที่อันตรายไม่ให้ไปถึงทะเบียนฟังก์ชันผู้ใช้หรือ callback ก่อนที่จะประเมินอาร์กิวเมนต์ใด ๆ การปฏิเสธส่งกลับ xlfeUnsafeFunctionDenied
CancelFlagพอยเตอร์บูลีนที่เลือกได้ซึ่งตรวจสอบก่อนและหลังการประเมิน
MaxFormulaLengthค่าเริ่มต้น 8192 หน่วยรหัส UTF-16
MaxEvaluationStepsค่าเริ่มต้น 1,000,000 การประเมินรายการไวยากรณ์
MaxRecursionDepthค่าเริ่มต้น 256 การประเมินสูตรซ้อนกัน
MaxArrayBytesค่าเริ่มต้น 64 MiB สำหรับเพย์โหลดอาร์เรย์ที่สร้างขึ้น
ค่าสูงสุดที่เป็นศูนย์หรือติดลบจะปิดใช้ขีดจำกัดต่อการเรียกนั้น นโยบายหน่วยความจำอาร์เรย์ระดับสมุดงานยังคงมีผลอยู่ และการไปถึงขีดจำกัดที่เปิดใช้จะส่งกลับ xlfeResourceLimit หลังปล่อยสถานะการประเมินชั่วคราว
โอเวอร์โหลดที่รับตัวเลือกอย่างชัดเจนถือว่า AllowUnsafeFormulaCallbacks เป็นตัวชี้ขาดสำหรับการเรียกนั้น การประเมินแบบครั้งเดียวจบค่าเริ่มต้นและการประเมินเทมเพลตสืบทอดคุณสมบัติชื่อเดียวกันของสมุดงาน

ตัวอย่าง 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);

ตัวอย่าง C++Builder

Lxcalc::_di_IXLSFormulaEvaluationTemplate evalTemplate =
  sheet->CreateFormulaEvaluationTemplate(1, 1,
    WideString(L"=ROW()+COLUMN()"), Lxcalc::xlfrsA1);

Lxcalc::TXLSFormulaEvaluationResult result =
  evalTemplate->EvaluateAt(7, 8);

ดูเพิ่มเติม

เมธอด TXLSWorksheet.Calculate
เมธอด IXLSWorkbook.Calculate
กลไกการคำนวณของ Excel