Документация HotXLS

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 остаются непрозрачными и не раскрываются через типизированный запрос областей

Физическая запись, отклоненная при проверке записей, сообщает xlsDiagnosticSelectionRecordInvalid с диагностическим кодом 1304, тогда как противоречие только на уровне агрегации сообщает одну диагностику группы в конце файла листа (EOF); при сохранении каждое исходное тело записи воспроизводится побайтово

Большие выделения

Разбор областей, нормализация, структурное переназначение и построение снимка используют однопроходные конструкторы или геометрический рост емкости, поэтому большие группы выделения остаются линейными с амортизацией

Координаты прокрутки области окна

TryGetWindowScroll возвращает первую видимую ячейку для одной логической области окна, а ScrollWindow изменяет ее; в обеих подсистемах используются координаты строк и столбцов листа, начиная с единицы

Верхние области окна используют общую строку всего окна, нижние — строку нижней области, левые — общий столбец всего окна, а правые — столбец правой области

Отсутствующая область окна возвращает False, не создавая состояние представления, а выходные данные запроса устанавливаются в нуль; недопустимые координаты также возвращают False до изменения любой оси

Классический XLS сохраняет верхнюю и левую оси в Window2, а нижнюю и правую — в Pane, тогда как XLSX независимо хранит соответствующие значения topLeftCell в sheetView и pane

Атомарные обновления

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 также остаются доступными без изменений

Общий фасад явно преобразует логические имена областей окна, поэтому вызывающие стороны не зависят от числовых кодов областей окна, используемых любым из форматов файлов