เอกสาร HotXLS

เรขาคณิตโครงร่างแบบสแปร์ส

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

ดูเพิ่มเติม

สมาชิก API เพิ่มเติมของ Classic XLS
สมาชิก API ขั้นสูงของ XLSX
สมาชิก API เพิ่มเติมของไลบรารี