工作表窗格选择 API
TXLSWorksheet 和 TXLSXWorksheet 公开相同的感知窗格方法,用于读取或替换选定的单元格和区域
共享类型与方法
TXLSPanePosition = (xlspTopLeft, xlspTopRight, xlspBottomLeft, xlspBottomRight); TXLSSelectedAreas = array of WideString; function GetSelectedAreas(APane: TXLSPanePosition; out ActiveAreaIndex: Integer): TXLSSelectedAreas; function SelectAreas(APane: TXLSPanePosition; const Areas: array of WideString; ActiveAreaIndex: Integer = 0): Boolean; function TryGetWindowScroll(APane: TXLSPanePosition; out ARow, ACol: Integer): Boolean; function ScrollWindow(APane: TXLSPanePosition; ARow, ACol: Integer): Boolean;
区域文本使用 A1 单元格或区域引用,ActiveAreaIndex 是返回或提供的区域序列中从零开始的索引
区域序列保持源顺序,并且可以包含相互重叠的区域,因为选择顺序和重叠本身就是工作表视图状态的一部分
快照所有权
GetSelectedAreas 返回一个新的动态数组,其字符串和长度归调用方所有,因此修改或释放结果不会影响工作表
当请求的窗格没有已表示的选择组时,结果为空且 ActiveAreaIndex 为 -1
读取不存在的窗格绝不会在工作簿中创建窗格、选择对象、单元格或区域
经典 XLS 记录聚合
经典 XLS 为每个窗格维护一个独立的逻辑选择组,并按源顺序聚合具有相同窗格代码的连续 BIFF Selection 记录
活动行、活动列和 ActiveAreaIndex 由同一组中的每条记录共享,并且该索引寻址完整的聚合区域序列,而不是单个物理记录
保存未改动过的一组会保留其原始记录体,而编辑过的一组会以最多 1369 个区域的连续块写入,且每个块中都带有相同的聚合活动索引
编辑一个窗格不会更改其他窗格的选择组,工作表副本会保留完整的窗格选择状态
结构性编辑
整行或整列的插入或删除会在两个工作簿引擎中对每个已表示窗格的有序选择组进行重新映射
存留的区域保持其顺序和活动区域的同一性;如果活动区域被移除,则会选择第一个存留的后继区域,若没有后继区域,则选择最后一个存留的前驱区域
如果所有区域都被移除,该组将变为删除边界处的一个单元格;而位于所选存留区域之外的活动单元格会回退到该区域的左上角单元格
无效的经典记录
格式错误、不连续或自相矛盾的经典 Selection 记录保持不透明,不会通过类型化的区域查询公开
在记录验证期间被拒绝的物理记录会以诊断代码 1304 报告 xlsDiagnosticSelectionRecordInvalid,而仅与聚合相关的矛盾会在工作表 EOF 处报告一个组诊断;保存时会逐字节重放每条原始记录体
大型选择
区域解析、规范化、结构重新映射和快照构建采用单遍构建器或几何容量增长,因此大型选择组仍保持摊销线性
窗格滚动坐标
TryGetWindowScroll 返回一个逻辑窗格的第一个可见单元格,ScrollWindow 更改它,两个引擎都使用从 1 开始的工作表行和列坐标
上部窗格共享整窗行,下部窗格共享下部窗格行,左侧窗格共享整窗列,右侧窗格共享右侧窗格列
窗格不存在时返回 False 且不创建视图状态,查询输出设为零;坐标无效时也会在任何轴被更改之前返回 False
经典 XLS 将上下轴保留在 Window2 中,将下右轴保留在 Pane 中,而 XLSX 则独立保留 sheetView 和 pane 中相应的 topLeftCell 值
原子更新
SelectAreas 在获取工作表写入事务之前验证每个 A1 引用和活动索引
对于格式错误或空输入、无效的活动索引,或当前拆分或冻结几何中不存在的窗格,该方法返回 False,并且先前的选择保持不变
成功的调用返回 True,并保留现有的引擎特定选择对象和传统 API
Delphi 示例
if Sheet.SelectAreas(xlspBottomRight,
['C4:E5', 'D5:F6', 'G7'], 1) then
begin
Areas := Sheet.GetSelectedAreas(xlspBottomRight,
ActiveAreaIndex);
UseSelection(Areas, ActiveAreaIndex);
end;
if Sheet.ScrollWindow(xlspBottomRight, 20, 8) and
Sheet.TryGetWindowScroll(xlspBottomRight, Row, Col) then
ShowVisibleCell(Row, Col);
兼容性
经典重载 SelectAreas(const Areas; ActiveAreaIndex) 和 XLSX 重载 SelectAreas(const Areas; ActiveAreaIndex; APane) 保持原样可用
经典的 ScrollRow 和 ScrollColumn 属性以及 XLSX 的从零开始的 SetPaneScroll、GetPaneScroll、ScrollRow 和 ScrollCol 成员也保持原样可用
共享外观显式转换逻辑窗格名称,因此调用方不依赖于任一文件格式所使用的数字窗格代码