ยูนิต lxOutline ให้เรขาคณิตและการวางแผนการเปลี่ยนแปลงที่เป็นกลางต่อเอนจินสำหรับโครงร่างแถวและคอลัมน์
ยูนิตนี้จัดเก็บเฉพาะช่วงที่ปรากฏเป็นรูปธรรม จดจำโหนดสรุปจากการเปลี่ยนระดับโครงร่างที่อยู่ติดกัน และสร้างการเปลี่ยนสถานะแบบบีบอัดสำหรับเลย์เอาต์สรุป-หลังและสรุป-ก่อน โดยไม่จัดสรรรายการสำหรับทุกพิกัดของเวิร์กชีต
ชนิดหลัก
TXLSOutlineAxis = (xoaRows, xoaColumns);
TXLSOutlineChildMode = (xocPreserve, xocCollapse, xocExpand);
TXLSOutlineMutationPlan = class
constructor Create(AAxis: TXLSOutlineAxis);
procedure Clear;
property Axis: TXLSOutlineAxis;
property Count: Integer;
property Changes[Index: Integer]: TXLSOutlineStateChange;
end;
TXLSOutlineGeometry = class
constructor Create(AAxis: TXLSOutlineAxis;
ASummaryAfter: Boolean);
procedure Clear;
property Axis: TXLSOutlineAxis;
property SpanCount: Integer;
procedure AddSpan(AFirstIndex, ALastIndex, ALevel: Integer;
AHidden, ACollapsed: Boolean);
function TryGetNode(ANodeIndex: Integer;
out ANode: TXLSOutlineNode): Boolean;
function TryBuildNodeCollapsePlan(ANodeIndex: Integer;
ACollapsed: Boolean; AChildMode: TXLSOutlineChildMode;
APlan: TXLSOutlineMutationPlan): Boolean;
procedure BuildDisplayLevelPlan(ADisplayLevel: Integer;
AChildMode: TXLSOutlineChildMode;
APlan: TXLSOutlineMutationPlan);
end;
ดัชนีแถวและคอลัมน์เริ่มนับจาก 1 ระดับโครงร่างไม่ติดลบ และช่วงต้องถูกเพิ่มตามลำดับที่เพิ่มขึ้นอย่างเคร่งครัดและไม่ทับซ้อน
ช่วงที่อยู่ติดกันซึ่งมีระดับ สถานะซ่อน และสถานะยุบเหมือนกันจะถูกรวมกันโดยอัตโนมัติ ดัชนีที่ละไว้มีระดับศูนย์โดยปริยาย สถานะปกติ และไม่มีเครื่องหมายยุบ
คลาสทั้งสองจำ Axis ของตนไว้ตั้งแต่ตอนสร้าง Clear ล้างแผนหรือเรขาคณิตเพื่อใช้ใหม่โดยไม่จัดสรรบัฟเฟอร์ภายในใหม่ และ SpanCount รายงานจำนวนช่วงที่รวมแล้วซึ่งเรขาคณิตถืออยู่ในปัจจุบัน
ความหมายของโหนด
| NodeIndex | แถวหรือคอลัมน์สรุปกายภาพที่ผู้เรียกสืบค้น |
| FirstDetailIndex / LastDetailIndex | ช่วงรายละเอียดต่อเนื่องที่ระดับลึกกว่ารายการสรุป |
| SummaryLevel | ระดับโครงร่างที่จัดเก็บไว้บนรายการสรุป หรือศูนย์เมื่อรายการนั้นยังไม่ปรากฏเป็นรูปธรรม |
| Level | ระดับกลุ่มที่โหนดแทน ซึ่งเท่ากับ SummaryLevel + 1 |
| SummaryHidden | สถานะซ่อนที่จัดเก็บไว้บนรายการสรุป |
| Collapsed | เครื่องหมายยุบที่ระบุชัดซึ่งจัดเก็บไว้บนรายการสรุป |
| SummaryAfter | True เมื่อรายละเอียดมาก่อนรายการสรุป และ false เมื่อรายละเอียดมาหลังรายการสรุป |
กลุ่มที่ซ้อนกันยังคงเป็นอิสระ เพราะการสืบค้นแต่ละครั้งหยุดที่ช่วงติดกันชุดแรกที่ระดับไม่ลึกกว่ารายการสรุปที่เลือก
ช่องว่างยังทำให้ช่วงรายละเอียดสิ้นสุดด้วย ข้อมูลเมตาแบบสแปร์สจึงไม่สามารถบังเอิญเชื่อมพิกัดที่ไม่ได้ใช้เข้าเป็นกลุ่มเดียวกันได้
แผนการเปลี่ยนแปลง
แผนการเปลี่ยนแปลงประกอบด้วยช่วงที่เรียงลำดับซึ่งเริ่มนับจาก 1 และมาสก์ฟิลด์ที่ระบุว่าช่วงใดเปลี่ยนสถานะซ่อน สถานะยุบ หรือทั้งสองอย่าง การเปลี่ยนแปลงที่เทียบเท่าและอยู่ติดกันจะถูกรวมกันโดยอัตโนมัติ
| xocPreserve | เปลี่ยนโหนดที่เลือกโดยคงเครื่องหมายยุบของโหนดลูกไว้ ซึ่งเป็นพฤติกรรมกลุ่มซ้อนค่าเริ่มต้น |
| xocCollapse | ทำเครื่องหมายโหนดลูกว่ายุบ เมื่อโหนดเหล่านั้นอยู่ภายในโหนดที่เลือกหรือซ่อนอยู่ต่ำกว่าระดับการแสดงผลที่ต้องการ |
| xocExpand | ล้างเครื่องหมายยุบของโหนดลูก เมื่อโหนดเหล่านั้นอยู่ภายในโหนดที่เลือกหรือซ่อนอยู่ต่ำกว่าระดับการแสดงผลที่ต้องการ |
การขยายโหนดแม่ด้วย xocPreserve จะเผยรายละเอียดโดยตรง ขณะที่รายละเอียดที่เป็นของโหนดลูกที่ยุบอยู่ยังคงถูกซ่อน การขยายโหนดลูกภายในบรรพบุรุษที่ยุบอยู่จะไม่เปิดเผยเนื้อหาผ่านบรรพบุรุษนั้น
ระดับการแสดงผลเริ่มนับจาก 1: ระดับ 1 ยุบทุกกลุ่มระดับบนสุด และแต่ละระดับที่สูงขึ้นจะเผยระดับโครงร่างเพิ่มอีกหนึ่งระดับ พร้อมตั้งเครื่องหมายของโหนดขอบเขตที่สอดคล้องกัน
การสร้างสถานะที่ต้องการชุดเดิมจากเรขาคณิตที่มีสถานะนั้นอยู่แล้วจะได้แผนว่าง และการสืบค้นโหนดที่ไม่มีจริงจะส่งกลับ false พร้อมแผนว่าง
การดำเนินการกับโหนดจะไม่เปลี่ยนสถานะซ่อนอิสระของรายการสรุปที่เลือก และแผนระดับการแสดงผลจะไม่เลิกซ่อนรายการระดับศูนย์ที่ถูกซ่อนอยู่นอกกลุ่มโครงร่าง
อะแดปเตอร์เวิร์กชีต
function TryGetOutlineNode(AAxis: TXLSOutlineAxis;
ANodeIndex: Integer; out ANode: TXLSOutlineNode): Boolean;
function SetOutlineNodeCollapsed(AAxis: TXLSOutlineAxis;
ANodeIndex: Integer; ACollapsed: Boolean;
AChildMode: TXLSOutlineChildMode = xocPreserve): Boolean;
procedure SetOutlineDisplayLevel(AAxis: TXLSOutlineAxis;
ADisplayLevel: Integer;
AChildMode: TXLSOutlineChildMode = xocPreserve);
TXLSWorksheet และ TXLSXWorksheet เปิดเผยสามเมธอดชุดเดียวกัน ผู้เรียกจึงสืบค้นหรือเปลี่ยนโหนดสรุปแถวหรือคอลัมน์ที่เริ่มนับจาก 1 ได้โดยไม่ต้องสร้างเรขาคณิตด้วยตนเอง
อะแดปเตอร์แบบคลาสสิกอ่านเฉพาะบล็อกแถวที่จัดสรรไว้และข้อมูลเมตาคอลัมน์ที่กำหนดค่าไว้ ส่วนอะแดปเตอร์ของ XLSX รวมรายการระดับโครงร่าง สถานะซ่อน และสถานะยุบแบบสแปร์สของตน ก่อนใช้แผนการเปลี่ยนแปลงแบบบีบอัดหนึ่งแผนในธุรกรรมการเขียนเดียว
กลุ่มแถวและคอลัมน์ของ OpenDocument คงสถานะ table:display แบบซ้อนดั้งเดิมของตนไว้ การแก้ไขข้อมูลเมตาโดยตรงและการเปลี่ยนแปลงเชิงโครงสร้างของแถวหรือคอลัมน์จะส่งผ่านสถานะนั้นไปยังโหนดสรุปเชิงตรรกะอย่างปลอดภัย และการแปลงเป็น XLSX จะเขียนเครื่องหมายยุบบนรายการสรุปของ XLSX แทนสมาชิกทุกตัวของกลุ่ม
เมธอด TXLSXWorksheet.ToggleRowGrouped และ ToggleColGrouped ที่มีอยู่เดิมยังคงใช้ได้ในฐานะแรปเปอร์เพื่อความเข้ากันได้ อาร์กิวเมนต์ของเมธอดเหล่านี้คือแถวหรือคอลัมน์รายละเอียดแรก และแรปเปอร์จะแก้โหนดสรุปที่คำนึงถึงทิศทางก่อนสลับสถานะ
ตัวอย่าง Delphi
Geometry := TXLSOutlineGeometry.Create(xoaRows, True);
Plan := TXLSOutlineMutationPlan.Create(xoaRows);
try
Geometry.AddSpan(2, 4, 1, False, False);
Geometry.AddSpan(5, 5, 0, False, False);
if Geometry.TryGetNode(5, Node) then
UseOutlineNode(Node.FirstDetailIndex,
Node.LastDetailIndex, Node.Collapsed);
if Geometry.TryBuildNodeCollapsePlan(5, True,
xocPreserve, Plan) then
ApplyOutlineChanges(Plan);
finally
Plan.Free;
Geometry.Free;
end;
ตัวอย่าง C++Builder
Lxoutline::TXLSOutlineGeometry *geometry =
new Lxoutline::TXLSOutlineGeometry(Lxoutline::xoaColumns, false);
try {
geometry->AddSpan(3, 3, 0, false, true);
geometry->AddSpan(4, 7, 1, true, false);
Lxoutline::TXLSOutlineNode node;
if (geometry->TryGetNode(3, node))
UseOutlineNode(node.FirstDetailIndex, node.LastDetailIndex,
node.Collapsed);
}
__finally {
delete geometry;
}
ประสิทธิภาพและขอบเขต
การค้นหาโหนดใช้การค้นแบบไบนารี ตามด้วยเฉพาะช่วงรูปธรรมที่อยู่ติดกันซึ่งกลุ่มที่เลือกตัดผ่าน ทำให้มีปริมาณงาน O(log n + k) สำหรับ n ช่วง และ k ช่วงที่เข้าชม
การวางแผนการเปลี่ยนแปลงเป็นชุดใหญ่จะค้นพบทุกโหนดรูปธรรมด้วยการเดินแบบเชิงเส้นบนสแตกเอกภาค รวมช่วงการมองเห็นที่ยุบ และส่งออกการเปลี่ยนแปลงช่วงแบบบีบอัดโดยไม่เข้าชมพิกัดที่ไม่ได้ใช้
ตัวสร้างยอมรับแถวสุดท้ายของเวิร์กชีต XLSX ขณะคงเฉพาะช่วงที่ให้มาไว้ พิกัดสูงจึงไม่ได้แปลว่าต้องจัดสรรหรือสแกนรายการหนึ่งล้านรายการ
ด่านทดสอบย้อนกลับของอะแดปเตอร์เวิร์กชีตรันการสืบค้นโหนด 32,768 ครั้งชุดเดิมและการเปลี่ยนแปลงยุบหรือขยาย 2,048 ครั้งชุดเดิมบนช่วงแถวรูปธรรมหกช่วงใกล้แถว 8 และแถว 1,048,576 กำหนดให้การทำเซลล์เป็นรูปธรรมเป็นศูนย์ และจำกัดต้นทุนพิกัดสูงเทียบกับเส้นฐานพิกัดต่ำ
TXLSOutlineGeometry ไม่เขียนข้อมูลสมุดงานโดยตรงเด็ดขาด อะแดปเตอร์เอนจินเป็นผู้ตรวจสอบและใช้แผนที่ส่งกลับ ทำให้การวิเคราะห์เรขาคณิตและการเปลี่ยนสถานะยังคงแยกจากกัน
ดูเพิ่มเติม