Четене и записване на стойности в диапазони

В макросите за LibreOffice Calc често се налага да се четат и записват стойности от/в листовете. Тази страница от помощта описва различните подходи за достъп до листове и диапазони, за да се четат и записват стойности в тях.

note

Всички представени в страницата примери могат да се реализират и на 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")
  
note

Основната разлика между скриптовете на Python и на Basic е в начина на получаване на достъп до обекта лист чрез променливата за контекст XSCRIPTCONTEXT. След това всички методи и свойства са идентични в Basic и в Python.


Стойности, низове и формули

Клетките могат да имат три типа стойности: числа, низове и формули. Всеки тип има собствени методи за задаване (set) и извличане (get):

Тип

Get Method

Set Method

Числа

getValue()

setValue(newValue)

Текст

getString()

setString(newString)

Формула

getFormula()

setFormula(newFormula)


note

Датите и валутните стойности в 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)

note

Методът 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)
  

Моля, подкрепете ни!