เมธอด 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;