Руководство разработчика

Метод ЭЛЕКТРОННАЯ_ТАБЛИЦА. СЧИТАТЬ_БУФЕР

Метод СЧИТАТЬ_БУФЕР позволяет эффективно считать значения множества ячеек электронной таблицы во временный буфер. Последующее чтение значений из буфера не требует взаимодействия с офисным приложением и выполняется в десятки раз быстрее, чем чтение без использования буфера.

Четырехугольная область ячеек электронной таблицы, которую следует считать в буфер, определяется текущей ячейкой и размерами, задаваемыми в параметрах метода. Текущая ячейка должна быть предварительно выбрана вызовом метода УСТ_ТЕК_ПОЗ или УСТ_ТЕК_ЯЧЕЙКУ. Количество столбцов и строк, заполненных данными можно получить вызовом метода РАЗМЕР_ТЕК_ЛИСТА.

ФУНКЦИЯ ЛОГИКА: СЧИТАТЬ_БУФЕР(ЦЕЛОЕ: ширина;
                              ЦЕЛОЕ: высота)

Параметры

ширина
Горизонтальный размер буфера (количество ячеек).
высота
Вертикальный размер буфера (количество ячеек).

Возвращаемое значение

ДА – в случае успешного считывания, НЕТ – в случае ошибки. Сообщение об ошибке может быть получено с помощью метода ПОСЛ_ОШИБКА.

Чтение значений ячеек из буфера выполняется только методом ЗНАЧ_ЯЧЕЙКИ. Выбор текущей ячейки выполняется как обычно: вызовом метода УСТ_ТЕК_ПОЗ или УСТ_ТЕК_ЯЧЕЙКУ. Если выбрана ячейка вне области буфера, то ее чтение выполняется в обход буфера (т.е. медленно).

Считывание типа ячейки (ТИП_ЯЧЕЙКИ) и формата (ФОРМАТ_ЯЧЕЙКИ) выполняется без использования буфера, т.к. буфер не содержит информации о форматах ячеек. Поэтому следует избегать вызова этих методов для всех ячеек, т.к. это сведет на нет преимущества использования буфера. Если ожидаемые типы значений для столбцов неизвестны, то можно, например, считать типы только для первой строки, а далее полагать, что для остальных строк типы те же.

После того, как все интересующие значения из буфера прочитаны, можно освободить ресурсы, занятые буфером, вызовом метода ЗАКРЫТЬ_БУФЕР. При закрытии документа ресурсы буфера освобождаются автоматически.

Для данного документа одновременно поддерживается только один буфер (не важно – чтения или записи). Например, для чтения двух несмежных столбцов можно сначала создать буфер для первого столбца, прочитать значения, закрыть буфер, а затем сделать то же для второго столбца.

Во время использования буфера запрещено переключение текущего листа методом УСТ_ТЕК_ЛИСТ.

Пример

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

На рисунке выделена область ячеек, которую мы собираемся считать в буфер. Первые четыре строки являются заголовком. Первый столбец (№ п/п) интереса не представляет. Значит адрес верхней левой ячейки буфера "B5", надо сделать ее текущей. Размер буфера вычисляем из размера листа за вычетом заголовков.

ПЕРЕМ ЭЛЕКТРОННАЯ_ТАБЛИЦА: т
ЕСЛИ т.ОТКРЫТЬ_ДОК("Default", "electric.xlsx") ТО

  // вычисляем область листа, заполненную данными
  ПЕРЕМ ЦЕЛОЕ: ширина_листа, высота_листа  
  т.РАЗМЕР_ТЕК_ЛИСТА(ширина_листа, высота_листа) // 12 x 10

  // первая ячейка буфера - B5
  КОНСТ первый_столбец = "B"
  КОНСТ первая_строка = 5

  // вычисляем размеры буфера
  ПЕРЕМ ЦЕЛОЕ: ширина_буф = ширина_листа - т.ПОЗ_СТОЛБЦА(первый_столбец) + 1
  ПЕРЕМ ЦЕЛОЕ: высота_буф = высота_листа - первая_строка + 1

  // делаем B5 текущей ячейкой
  т.УСТ_ТЕК_ЯЧЕЙКУ(первый_столбец, первая_строка)
  // создаем буфер и считываем туда значения
  т.СЧИТАТЬ_БУФЕР(ширина_буф, высота_буф) // 11 х 6

  // вычисляем номер последней строки с данными
  ПЕРЕМ посл_строка = первая_строка + высота_буф - 1 // 10
  // цикл по строкам 5..10
  ЦИКЛ ДЛЯ (строка = первая_строка, посл_строка)
    ПЕРЕМ СТРОКА: участок, фамилия
    ПЕРЕМ ЧИСЛО: общ_сумма

    // читаем номер участка и фамилию из столбцов B и С как текст
    т.УСТ_ТЕК_ЯЧЕЙКУ("B", строка)
    т.ЗНАЧ_ЯЧЕЙКИ(ЭТ_СТРОКА, участок)

    т.УСТ_ТЕК_ЯЧЕЙКУ("С", строка)
    т.ЗНАЧ_ЯЧЕЙКИ(ЭТ_СТРОКА, фамилия)

    // читаем общую сумму из столбца L как вещественное число
    т.УСТ_ТЕК_ЯЧЕЙКУ("L", строка)
    т.ЗНАЧ_ЯЧЕЙКИ(ЭТ_ЧИСЛО, общ_сумма)

    // ... тут можно выполнить какую-то обработку прочитанных значений...
  КОНЕЦ_ЦИКЛА
КОНЕЦ_ЕСЛИ  

См. также: