Чтение и запись значений в диапазоны ячеек

Макросы в LibreOffice Calc часто используются для чтения и записи значений на листах. Эта страница справки содержит описание различных подходов обращения к листам и диапазонам для чтения и записи значений.

Значок примечания

Все примеры, представленные на этой странице, могут применяться и в Basic, и в Python.


Обращение к одной ячейке

В примере ниже выполняется ввод числового значения 123 в ячейку "A1" текущего листа.


    Dim oSheet as Object
    Dim oCell as Object
    oSheet = ThisComponent.CurrentController.getActiveSheet()
    oCell = oSheet.getCellRangeByName("A1")
    oCell.setValue(123)
  

То же самое можно выполнить и в Python:


    doc = XSCRIPTCONTEXT.getDocument()
    sheet = doc.getCurrentController().getActiveSheet()
    cell = sheet.getCellRangeByName("A1")
    cell.setValue(123)
  

Обратите внимание на то, что в предыдущих примерах доступ к ячейке выполняется с помощью имени диапазона "A1". Обращаться к ячейкам можно также с помощью индексов, как если бы лист был матрицей с индексацией столбцов и строк от нуля.

Для этого можно использовать метод getCellByPosition(colIndex, rowIndex), который в качестве аргументов принимает индексы столбца и строки. Пример внизу содержит сценарий на Basic, который используется для изменения текстового значения в ячейке "C1" (столбец 2, строка 0).


    oSheet = ThisComponent.CurrentController.getActiveSheet()
    oCell = oSheet.getCellByPosition(2, 0)
    oCell.setString("Hello")
  

В Python такой пример реализуется следующим образом:


    doc = XSCRIPTCONTEXT.getDocument()
    sheet = doc.getCurrentController().getActiveSheet()
    cell = sheet.getCellByPosition(2, 0)
    cell.setString("Hello")
  
Значок примечания

Основное различие между сценариями Python и Basic заключается в способе получения доступа к объектам листа с помощью переменной контекста XSCRIPTCONTEXT. В остальном для Basic и Python используются одни и те же методы и свойства.


Значения, строки и формулы

Ячейки Calc могут иметь три типа значений: числовые, строковые и формулы. Каждый тип имеет свои собственные методы установки и получения значения:

Тип

Get Method

Set Method

Числовой

getValue()

setValue(newValue)

Текст

getString()

setString(newString)

Формула

getFormula()

setFormula(newFormula)


Значок примечания

Значения даты и валюты в Calc считаются числовыми значениями.


В следующем примере числовые значения вводятся в ячейки "A1" и "A2", а в ячейку "A3" вводится формула, которая возвращает результат перемножения этих значений.


    oSheet = ThisComponent.CurrentController.getActiveSheet()
    oCell = oSheet.getCellRangeByName("A1")
    oCell.setValue(10)
    oCell = oSheet.getCellRangeByName("A2")
    oCell.setValue(20)
    oCell = oSheet.getCellRangeByName("A3")
    oCell.setFormula("=A1*A2")
  

Получение доступа к диапазонам на разных листах

Предыдущие примеры выполнялись только на активном листе. При этом имеется возможность получать доступ к диапазонам ячеек на разных листах по их индексам или именам.

На примере ниже числовое значение вводится в ячейку "A1" листа с именем "Sheet2".


    oSheet = ThisComponent.Sheets.getByName("Sheet2")
    oCell = oSheet.getCellRangeByName("A1")
    oCell.setValue(123)
  

В Python данный пример можно реализовать следующим образом:


    doc = XSCRIPTCONTEXT.getDocument()
    sheet = doc.Sheets["Sheet2"]
    cell = sheet.getCellRangeByName("A1")
    cell.setValue(123)
  

Доступ к листам также может осуществляться при помощи индексов с отсчётом от нуля по порядку следования в файле Calc.

В Basic вместо метода getByName используется метод Sheets(sheetIndex) как показано далее:


    oSheet = ThisComponent.Sheets(0)
  

Подобным образом можно действовать и в Python:


    sheet = doc.Sheets[0]
  

Использование библиотеки ScriptForge

Службу Calc библиотеки ScriptForge можно использовать для получения и установки значений ячеек следующим образом:


    

' Загружается библиотека ScriptForge

GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")

' Осуществляется доступ к текущему документу Calc

oDoc = CreateScriptService("Calc")

' Устанавливается значение ячеек A1 и A2

oDoc.setValue("A1", "Hello")

oDoc.setValue("A2", 123)

Значок примечания

Метод setValue можно использовать для установки и числового, и текстового значения. При установке формулы используйте метод setFormula.


При помощи службы Calc получение и установку значений можно выполнять одной строкой кода. Пример внизу получает значение из ячейки "A1" и показывает её в окне сообщения.


    Dim val as Variant, oDoc as Object
    oDoc = CreateScriptService("Calc")
    val = oDoc.getValue("A1")
    MsgBox val
  

Библиотека ScriptForge также упрощает доступ к диапазонам ячеек на различных листах, что продемонстрировано на примере внизу:


    Dim val1, val2
    ' Считывает содержимое ячейки "A1" из листа с именем "Sheet1"
    val1 = oDoc.getValue("Sheet1.A1")
    ' Считывает содержимое ячейки "B3" с листа с именем "Sheet2"
    val2 = oDoc.getValue("Sheet2.B3")
    ' Помещает результат в ячейку "A1" листа "Report"
    Dim result : result = val1 * val2
    oDoc.setValue("Report.A1", result)
  

Примеры выше могут быть также реализованы в Python следующим образом:


    from scriptforge import CreateScriptService
    doc = CreateScriptService("Calc")
    doc.setValue("A1", "Hello")
  

    doc = CreateScriptService("Calc")
    bas = CreateScriptService("Basic")
    val = doc.getValue("A1")
    bas.MsgBox(val)
  

    first_val = doc.getValue("Sheet1.A1")
    second_val = doc.getValue("Sheet2.B3")
    result = first_val * second_val
    doc.setValue("Report.A1", result)
  
Пожалуйста, поддержите нас!

Пожалуйста, поддержите нас!