เอกสาร HotXLS

เมธอด CreateReadOnlyView

สร้างมุมมองแบบอ่านอย่างเดียวที่มีน้ำหนักเบาเหนือโมเดลสมุดงาน Classic หรือ XLSX ที่โหลดแล้ว

ไวยากรณ์

function CreateReadOnlyView: IXLSReadOnlyWorkbookView;

CreateReadOnlyView ถูกประกาศโดย IXLSWorkbook แบบคลาสสิกใน lxHandle และโดย IXLSXWorkbookOwner ของ XLSX ใน lxHandleX ส่วนอินเทอร์เฟซมุมมองที่ใช้ร่วมกัน ตัวเลือก และชนิดสแนปชอตถูกประกาศใน lxStandard

สถานะมุมมองและอายุการใช้งาน

การสร้างมุมมองใช้เวลาคงที่และไม่เดินทางผ่านเวิร์กชีต เซลล์ สไตล์ ชื่อ หรือรูปทรง

แต่ละมุมมองมี ActiveSheetIndex ที่เริ่มนับจาก 1 เป็นของตัวเอง มุมมองหลายมุมมองจึงเลือกเวิร์กชีตต่างกันได้โดยไม่เปลี่ยน ActiveSheetIndex แบบคลาสสิก หรือ ActiveIndex, IsSelected และ ActiveTab ของ XLSX

มุมมองถือสิทธิ์เช่าการอ่านขณะที่ยังมีอยู่ และการแก้ไขสมุดงานจะล้มเหลวทันทีด้วย EXLSWorkbookWriteGuardUnavailable ก่อนเปลี่ยนโมเดล

คงสมุดงาน Classic ไว้ผ่าน IXLSWorkbook และสมุดงาน XLSX ผ่าน IXLSXWorkbookOwner เมื่อใช้มุมมอง อินเทอร์เฟซเจ้าของและมุมมองทุกมุมมองจะถือสมุดงานที่นับการอ้างอิงชุดเดียวกัน และปล่อยได้ตามลำดับใดก็ได้

อย่าเรียก Free บน TXLSWorkbook หรือ TXLSXWorkbook ที่เป็นรูปธรรมขณะที่ยังมีอินเทอร์เฟซเจ้าของหรือมุมมองอ้างถึงอยู่

สแนปชอตเซลล์

TryReadCell ใช้พิกัดแถวและคอลัมน์ที่เริ่มนับจาก 1 บนเวิร์กชีตที่ใช้งานของมุมมอง และส่งกลับ False เฉพาะเมื่อไม่มีเซลล์ที่จัดเก็บไว้ที่พิกัดนั้น

การอ่านเซลล์ที่ไม่มีอยู่จะไม่สร้างพื้นที่จัดเก็บและไม่เพิ่มรุ่นของสมุดงาน

TXLSReadOnlyCellSnapshot เป็นเจ้าของชื่อเวิร์กชีต ค่า ข้อความสูตร ข้อมูลแคชและการประเมิน พิกัด ชนิด และดัชนีสไตล์ของตนเอง และไม่เปิดเผยออบเจกต์สมุดงานที่เขียนได้เลย

ฟิลด์ความหมาย
SheetIndex / SheetNameข้อมูลประจำตัวเวิร์กชีตเฉพาะของมุมมอง
Row / Colพิกัดเซลล์ที่เริ่มนับจาก 1
StyleIndexดัชนี XF แบบคลาสสิกที่จัดเก็บไว้ หรือดัชนีรูปแบบเซลล์ของ XLSX
Kindการจัดประเภทข้อความ ตัวเลข วันที่-เวลา ตรรกะ สูตร ข้อผิดพลาด หรือว่างเปล่า
Valueค่าสเกลาร์ที่จัดเก็บไว้หรือค่าแคชสูตรโดยไม่คำนวณใหม่
HasFormulaCache / FormulaCacheการมีอยู่ของแคชสูตร ที่มา ชนิดค่า และค่าแคชที่เป็นของตน
FormulaEvaluationการประเมินไม่เกี่ยวข้อง ไม่ได้ร้องขอ คำนวณแล้ว หรือล้มเหลว พร้อมรหัสผลลัพธ์ของตัวประเมินและค่าผลลัพธ์ที่เป็นของตน
Formulaว่างเปล่าตามค่าเริ่มต้นและจะถูกเติมเฉพาะเมื่อเปิดใช้ข้อความสูตรอย่างชัดเจน

นโยบายสูตร

ตามค่าเริ่มต้น เซลล์สูตรจะใช้แคชที่จัดเก็บไว้เดิม และไม่คำนวณ ไม่เรียกฟังก์ชันผู้ใช้ ไม่อัปเดตสถานะความไม่สดใหม่ หรือเขียนแคชกลับลงสมุดงานเลย

เพิ่ม xlsvIncludeFormulaText ลงใน Options เมื่อต้องการข้อความสูตร ฝั่ง Classic จะสร้างตัวถอดรหัสเฉพาะของมุมมองตามต้องการ ฝั่ง XLSX จะคัดลอกสตริงสูตรที่จัดเก็บไว้ และทั้งสองเส้นทางไม่เริ่มต้นหรือแก้ไขเครื่องคำนวณของสมุดงาน

สูตรที่ไม่มีแคชที่โหลดหรือคำนวณไว้จะรายงาน HasFormulaCache=False และปล่อยให้ Value เป็น Unassigned

เพิ่ม xlsvEvaluateFormulas เพื่อประเมินสูตรผ่านเครื่องคำนวณเฉพาะของมุมมอง สถานะการเรียกซ้ำ แคชสเกลาร์ แคชเมทริกซ์อาร์เรย์ และแคชสูตรที่คอมไพล์แล้วของ XLSX ค่า Value และ FormulaEvaluation.Value ที่ได้จะไม่แทนที่แคชที่จัดเก็บไว้ของสมุดงานหรือฟิลด์รันไทม์สูตรที่คอมไพล์แล้วเด็ดขาด

ข้อผิดพลาดสเปรดชีตมาตรฐานจะถูกส่งกลับเป็นค่าข้อผิดพลาด Variant พร้อม xlfesCalculated ส่วนความล้มเหลวการประเมินที่ไม่รองรับหรือเป็นการภายในจะรายงาน xlfesFailed และคงแคชที่จัดเก็บเดิมไว้ใน FormulaCache

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

การประเมินสูตรภายนอกของ XLSX อ่านเฉพาะแคช externalLink ของไฟล์เท่านั้น และไม่ยกเลิกการอ้างอิงการลงทะเบียนสมุดงานที่ยังทำงานแบบอ่อน หรือทำ I/O ภายนอกเด็ดขาด

เธรดและประสิทธิภาพ

ใช้มุมมองหนึ่งมุมมองต่อเธรดผู้ทำงาน มุมมองแยกกันสแกนเวิร์กชีตต่างกันหรือประเมินสูตรชุดเดียวกันพร้อมกันได้ แต่ผู้เรียกต้องไม่แก้ไขเวิร์กชีตที่ใช้งานหรือตัวเลือกของมุมมองหนึ่งจากเธรดอื่น

หลังการสร้าง การอ่านเซลล์ทั่วไปจะไม่เข้าสู่มอนิเตอร์หรือคริติคอลเซกชัน เนื่องจากสิทธิ์เช่ากันการแก้ไขสมุดงานพร้อมกันอยู่แล้ว

การตรวจสอบการปล่อยคงมุมมองว่างแต่ละมุมมองไว้ต่ำกว่า 64 KiB ของสถานะคงที่ มุมมองว่างหนึ่งร้อยมุมมองต่ำกว่า 8 MiB และการสร้างมุมมองเป็นอิสระจากขนาดสมุดงาน ด้วยเกณฑ์ p95 หนึ่งมิลลิวินาทีบนโมเดลหนึ่งล้านเซลล์

ชุดทดสอบประสิทธิภาพยังจำกัดผลกระทบของมุมมองว่างต่อการสแกนเคอร์เซอร์แบบเธรดเดียวที่มีอยู่ไว้ที่ห้าเปอร์เซ็นต์ และกำหนดให้มุมมองแปดมุมมองที่สแกนเวิร์กชีตอิสระต่างหากต้องบรรลุอัตราการส่งผ่านอย่างน้อยห้าเท่าของมุมมองเดียวบนโฮสต์ตรวจสอบ

ตัวอย่าง

var
  Workbook: IXLSWorkbook;
  View: IXLSReadOnlyWorkbookView;
  Cell: TXLSReadOnlyCellSnapshot;
begin
  Workbook := TXLSWorkbook.Create;
  Workbook.Sheets.Add;
  Workbook.Sheets[1].Cells[1, 1].Value := 'ready';

  View := Workbook.CreateReadOnlyView;
  View.Options := [xlsvEvaluateFormulas];
  if View.TryReadCell(1, 1, Cell) then
    Memo1.Lines.Add(VarToStr(Cell.Value));
end;

สำหรับ XLSX ให้คงสมุดงานที่เป็นรูปธรรมไว้ผ่านอินเทอร์เฟซเจ้าของก่อนสร้างมุมมอง

var
  Owner: IXLSXWorkbookOwner;
  Workbook: TXLSXWorkbook;
  View: IXLSReadOnlyWorkbookView;
begin
  Workbook := TXLSXWorkbook.Create;
  Owner := Workbook;
  Workbook.Sheets.Add('Data').Cells[1, 1].Value := 42;
  View := Owner.CreateReadOnlyView;
end;

ดูเพิ่มเติม