เอกสาร HotXLS

นโยบายการตรวจสอบความถูกต้องของการป้อนสูตร

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

นโยบายที่ใช้ร่วมกัน

TXLSFormulaEmptyStringMode =
  (xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
  (xlfusmReject, xlfusmPreserve);

TXLSFormulaEntryPolicy = record
  EmptyStringMode: TXLSFormulaEmptyStringMode;
  UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
  UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;

property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
Classic 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 ระบุฟังก์ชันหรือชื่อที่ไม่รู้จักเมื่อมีรายการใดรายการหนึ่งถูกจดจำ

ข้อความว่างและสูตร

อินพุตที่ว่างเปล่าทั้งหมดจะคืนค่า xlfeaClearCell หรือ xlfeaStoreString ตาม EmptyStringMode
สูตรที่คืนค่าสตริงว่าง เช่น ="" ยังคงเป็นสูตรและคืนค่า xlfeaStoreFormula เมื่อรูปแบบเป้าหมายสามารถแสดงค่านั้นได้
ข้อความสูตรอาจรวมหรือละเว้นเครื่องหมายเท่ากับหนึ่งตัวที่อยู่ด้านหน้า
การกำหนดค่าสตริงว่างเปล่าทั้งหมดผ่านคุณสมบัติ Value ปกติของเซลล์ใน Classic XLS หรือ XLSX จะใช้โหมดนี้โดยตรงทันที: ค่าเริ่มต้นจะลบค่าหรือสูตรที่มีอยู่ทั้งหมด ส่วน xlfesmPreserveString จะแทนที่เนื้อหาเซลล์ด้วยสตริงคงที่ที่มีความยาวเป็นศูนย์
Null และ Unassigned จะล้างเซลล์เสมอในทั้งสองโหมด ส่วนสูตรจริง เช่น ="" ยังคงเป็นสูตรที่มีผลลัพธ์สตริงว่างซึ่งจัดเก็บหรือคำนวณแยกต่างหาก
ตัวเขียนแถวหรือคอลัมน์ของ XLSX สำหรับ string และ Variant ใช้กฎเดียวกันโดยไม่แปลงช่องว่างที่ล้างแล้วให้เป็นข้อมูลจริง และยังคงรักษาการจัดเก็บแบบแพ็กตราบเท่าที่ค่าที่เหลือสามารถแสดงได้ในรูปแบบนั้น
ตัวอ่านแบบเนทีฟของ XLS, XLSX และ ODS ตลอดจนตัวแปลง XLS-to-XLSX หรือ XLSX-to-XLS ถือว่าค่าที่จัดเก็บไว้เป็นอินพุตที่เชื่อถือได้ ดังนั้นสตริงว่างคงที่ในระดับไฟล์จึงอยู่รอดแม้เมื่อสมุดงานปลายทางยังคงใช้นโยบายการป้อนของผู้ใช้เริ่มต้น

สัญลักษณ์ที่ไม่รู้จักและรูปแบบเป้าหมาย

ฟังก์ชันผู้ใช้ที่ลงทะเบียนในระดับสมุดงานหรือระดับกระบวนการ และ callback ของ OnUserFunction หรือ OnUserFunctionEx ที่กำหนดไว้ จะนับเป็นรายการที่รู้จักระหว่างการตรวจสอบโดยไม่เรียกใช้ตัวจัดการ ส่วนการเรียกที่ไม่ได้ลงทะเบียนจะคงชื่อฟังก์ชันของตนไว้ใน Symbol
โหมดเข้มงวดคืนค่า xlfeaReject สำหรับฟังก์ชันหรือชื่อที่ไม่รู้จัก; การกำหนดผ่านคุณสมบัติ Formula ปกติของเซลล์จะปฏิเสธก่อนที่ค่า แคชสูตร หรือการพึ่งพาจะเปลี่ยนไป
โหมดการเก็บรักษาคงข้อมูลการวินิจฉัยไว้และจัดเก็บสูตรผ่าน API ปกติของเซลล์; Classic XLS ทำซีเรียลไลซ์การเรียกที่ไม่รู้จักผ่านโทเค็นฟังก์ชันผู้ใช้แบบ add-in ของ BIFF และคงข้อความชื่อที่ไม่รู้จักไว้ตลอดการบันทึก การเปิดใหม่ และการแปลง XLS/XLSX
Classic XLS คอมไพล์สูตรที่รู้จักเพิ่มเติมผ่านตัวเขียน BIFF และคืนค่า xlfeiTargetFormatUnsupported เมื่อแสดงนิพจน์นั้นไม่ได้ ส่วน XLSX ยอมรับฟังก์ชันสูตรสมัยใหม่ที่รู้จักซึ่งรูปแบบสูตรของมันรองรับ
การตรวจสอบของ XLSX จดจำ LAMBDA, รายการที่เรียกใช้ได้แบบศัพท์ของ LET, ชื่อที่กำหนดซึ่งอ้างถึง lambda, ตัวยึดตำแหน่งของรายงาน, ลิงก์สมุดงานภายนอกที่ลงทะเบียน และการอ้างอิงเชิงโครงสร้างแบบระบุเต็มหรือไม่ระบุเต็มที่ถูกต้อง รวมถึงรูปแบบที่ซ้อนกันและรูปแบบแถวปัจจุบัน
โหมดความเข้ากันได้ยังสามารถคงการอ้างอิงเชิงโครงสร้างภายนอกที่ยังไม่ได้รับการแก้ไวสำหรับการประมวลผลภายหลัง ขณะที่โหมดเข้มงวดยังคงปฏิเสธชื่อตารางที่ยังไม่ได้รับการแก้

การคำนวณและการตรวจสอบจำนวนมาก

ฟังก์ชันที่ไม่รู้จักซึ่งถูกเก็บรักษาไว้และยังไม่ได้รับการจัดการหลังการกระจายไปยัง lambda และฟังก์ชันผู้ใช้ หรือชื่อที่ไม่รู้จักซึ่งถูกเก็บรักษาไว้ จะถูกประเมินเป็นข้อผิดพลาด Variant รหัส $1D ซึ่งเป็นข้อผิดพลาด #NAME? ของ Excel; ข้อผิดพลาดที่มีชนิดเดียวกันนี้จะแพร่กระจายผ่านสูตรที่พึ่งพาและการประเมินตามบริบท
ฟังก์ชันในตัวที่รู้จักแต่ยังไม่ได้นำไปปฏิบัติจะยังคงแยกจากการเรียกที่ไม่รู้จัก ขณะที่การลงทะเบียน แทนที่ ลบ หรือล้างฟังก์ชันผู้ใช้ในระดับสมุดงานหรือระดับกระบวนการ และการเปลี่ยนสูตรของชื่อที่กำหนด จะทำให้สถานะการพึ่งพาและการคำนวณที่ล้าสมัยไม่ถูกต้อง
function AuditFormulaSymbols: TXLSFormulaSymbolIssues; overload;
function AuditFormulaSymbols(
  out AStats: TXLSFormulaSymbolAuditStats):
  TXLSFormulaSymbolIssues; overload;
TXLSWorkbook และ TXLSXWorkbook ให้โอเวอร์โหลดการตรวจสอบจำนวนมากชุดเดียวกัน; ปัญหาแต่ละรายการระบุฟังก์ชันที่ไม่รู้จัก ชื่อที่ไม่รู้จัก หรือข้อผิดพลาดทางไวยากรณ์ พร้อมตำแหน่งเซลล์ของเวิร์กชีตหรือตำแหน่งของชื่อที่กำหนด สูตรต้นทาง และสัญลักษณ์ที่ยังไม่ได้รับการแก้
การตรวจสอบจะไล่ผ่านต้นไม้สูตรที่แยกวิเคราะห์แล้วหรือโทเค็น BIFF ที่จัดเก็บไว้แทนการสแกนข้อความ ดังนั้นข้อความที่ดูเหมือนฟังก์ชันภายในสตริงจึงไม่ถูกรายงาน; การคอมไพล์ของ XLSX ใช้แคชเฉพาะการดำเนินการซึ่งใช้คีย์จากข้อความสูตรที่แก้แล้ว เวิร์กชีต โลแคล รุ่นของชื่อที่กำหนด รุ่นของทะเบียนฟังก์ชันผู้ใช้ และความพร้อมใช้งานของ callback
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);

ดูเพิ่มเติม

การประเมินสูตรตามบริบท
กลไกการคำนวณของ Excel
สมาชิก API XLS แบบคลาสสิกเพิ่มเติม
สมาชิก API XLSX ขั้นสูง