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

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

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