Съдържание

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

В макросите за 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.

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

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

Тип | 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)

Теми, свързани с показаната

Библиотеката ScriptForge

Услуга SFDocuments.Calc

Програмиране със скриптове на Python