واحد 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;
اندیس سطر و ستون مبتنی بر یک است، سطحهای طرحواره نامنفیاند و بازهها باید با ترتیب اکیداً صعودی و بدون همپوشانی افزوده شوند
بازههای مجاور با سطح، حالت مخفی و حالت جمعشده یکسان بهطور خودکار ادغام میشوند؛ اندیسهای نیامده سطح صفر ضمنی، حالت پیدا و بدون نشانگر جمعشده دارند
هر دو کلاس Axis خود را از لحظه ساخت به خاطر میسپارند، Clear طرح یا هندسه را برای استفاده مجدد خالی میکند بدون تخصیص دوباره بافرهای داخلی، و SpanCount تعداد بازههای ادغامشدهای را که هندسه در حال حاضر نگه میدارد گزارش میکند
دلالتهای گره
| NodeIndex | سطر یا ستون خلاصه فیزیکی که فراخوان درباره آن پرسوجو کرده است |
| FirstDetailIndex / LastDetailIndex | بازه پیوسته جزئیات که سطح آن از آیتم خلاصه عمیقتر است |
| SummaryLevel | سطح طرحواره ذخیرهشده روی آیتم خلاصه، یا صفر وقتی آن آیتم عینیت نیافته باشد |
| Level | سطح گروهی که گره نمایندگی میکند و برابر SummaryLevel + 1 است |
| SummaryHidden | حالت مخفی ذخیرهشده روی آیتم خلاصه |
| Collapsed | نشانگر جمعشده صریح ذخیرهشده روی آیتم خلاصه |
| SummaryAfter | True وقتی جزئیات پیش از آیتم خلاصه بیایند و false وقتی پس از آن بیایند |
گروههای تودرتو مستقل میمانند، زیرا هر پرسوجو در نخستین بازه مجاوری که سطحش از آیتم خلاصه منتخب عمیقتر نباشد متوقف میشود
شکاف نیز بازه جزئیات را پایان میدهد؛ پس فراداده خلوت نمیتواند تصادفاً مختصات بلااستفاده را در یک گروه پل بزند
طرحهای تغییر
طرح تغییر شامل بازههای مرتب مبتنی بر یک و ماسک فیلدی است که نشان میدهد هر بازه حالت مخفی، حالت جمعشده یا هر دو را تغییر میدهد؛ تغییرهای مجاور معادل بهطور خودکار ادغام میشوند
| xocPreserve | گره منتخب را با حفظ نشانگرهای جمعشده فرزندان تغییر میدهد؛ این رفتار پیشفرض گروههای تودرتوست |
| xocCollapse | گرههای فرزند را وقتی داخل گره منتخب یا زیر سطح نمایش درخواستی مخفی باشند، جمعشده علامت میزند |
| xocExpand | نشانگرهای جمعشده گرههای فرزند را وقتی داخل گره منتخب یا زیر سطح نمایش درخواستی مخفی باشند، پاک میکند |
باز کردن والد با xocPreserve جزئیات بیواسطه را آشکار میکند در حالی که جزئیات متعلق به فرزندان جمعشده مخفی میمانند؛ باز کردن فرزندی درون والد جمعشده، محتوا را از طریق آن والد آشکار نمیکند
سطحهای نمایش مبتنی بر یک هستند: سطح 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 همان سه متد را در معرض میگذارند، بهطوری که فراخوان میتواند بدون ساخت دستی هندسه، درباره گره خلاصه سطر یا ستون مبتنی بر یک پرسوجو کند یا آن را تغییر دهد
مبدل کلاسیک فقط بلوکهای سطر تخصیصیافته و فراداده ستونهای مقداردهیشده را میخواند، در حالی که مبدل 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 هرگز مستقیماً در داده کتاب کار مینویسد؛ مبدلهای موتور طرح بازگرداندهشده را اعتبارسنجی و اعمال میکنند تا تحلیل هندسه و تغییر حالت جدا بمانند
همچنین ببینید