Contido

# Lectura e escritura de valores nos intervalos

As macros no Calc do LibreOffice deben ler e escribir valores decotío en follas de cálculo. Esta páxina da axuda describe os diversos enfoques para acceder a follas e intervalos e ler ou escribir os seus valores.

Todos os exemplos presentados nesta páxina poden ser implementados tanto en BASIC como en Python.

## Acceder a unha única cela

O seguinte exemplo introduce o valor numérico 123 na cela «A1» da folla activa.

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

Pódese lograr o mesmo con Python:

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

Observe que, nos exemplos anteriores, a cela é accesíbel utilizando o nome de intervalo «A1». Tamén é posíbel acceder ás celas con axuda de índices, como se a folla fose unha matriz na que as columnas e filas están indexadas a partir de cero.

Isto pódese facer empregando o método getCellByPosition(colIndex, rowIndex), que toma un índice de columna e de fila. O exemplo de abaixo en BASIC cambia o valor do texto da cela «C1» (columna 2, fila 0).

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

Este exemplo tamén se pode implementar en Python deste xeito:

        doc = XSCRIPTCONTEXT.getDocument()
        sheet = doc.getCurrentController().getActiveSheet()
        cell = sheet.getCellByPosition(2, 0)
        cell.setString("Hello")

A diferenza principal entre os scripts en Python e en BASIC reside na maneira na que se accede ao obxecto da folla empregando a variábel de contexto XSCRIPTCONTEXT. Despois disto, todos os métodos e propiedades son idénticos en BASIC e en Python.

## Valores, cadeas e fórmulas

As celas do Calc poden ter tres tipos de valores: números, cadeas e fórmulas. Cada tipo ten os seus métodos de definición e lectura de valores:

Tipo | Get Method | Set Method
--- | --- | ---
Numérico | getValue() | setValue(newValue)
Texto | getString() | setString(newString)
Fórmula | getFormula() | setFormula(newFormula)

As datas e os valores monetarios considéranse valores numéricos no Calc.

O exemplo seguinte introduce valores numéricos nas celas «A1» e «A2» e insire unha fórmula na cela «A3» que devolve a multiplicación destes valores.

        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")

## Acceder a intervalos en follas diferentes

Os exemplos anteriores empregan só a folla activa para realizar operacións. É posíbel acceder a intervalos de celas en follas diferentes polos seus índices ou nomes.

O exemplo de abaixo introduce un valor numérico na cela «A1» da folla chamada «Sheet2».

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

Este exemplo tamén se pode implementar en Python deste xeito:

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

Tamén é posíbel acceder ás follas empregando índices que comecen en cero que indican a folla considerando a orde na que aparecen no ficheiro de Calc.

En BASIC, no canto de empregar o método getByName, empregue Sheets(sheetIndex), como se mostra aquí:

        oSheet = ThisComponent.Sheets(0)

Isto pódese facer de forma semellante en Python:

        sheet = doc.Sheets[0]

## Empregando a biblioteca ScriptForge

Pódese empregar o servizo de Calc da biblioteca ScriptForge para obter e definir valores deste xeito:

        ' Carga a biblioteca ScriptForge
        GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
        ' Obtén acceso ao documento de Calc actual
        oDoc = CreateScriptService("Calc")
        ' Define o valor das celas A1 e A2
        oDoc.setValue("A1", "Hello")
        oDoc.setValue("A2", 123)

Pódese empregar o método setValue para definir valores tanto numéricos como textuais. Para definir unha fórmula nunha cela empregue o método setFormula.

Co servizo de Calc, pódense obter e definir valores de celas cunha única liña de código. O exemplo de abaixo obtén o valor da cela «A1» e móstrao nunha caixa de mensaxe.

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

A biblioteca ScriptForge tamén simplifica o acceso a intervalos en follas diferentes, como se demostra no exemplo de abaixo:

        Dim val1, val2
        ' Obtén a cela «A1» da folla «Sheet1»
        val1 = oDoc.getValue("Sheet1.A1")
        ' Obtén a cela «B3» da folla «Sheet2»
        val2 = oDoc.getValue("Sheet2.B3")
        ' Coloca o resultado na cela «A1» da folla «Report»
        Dim result : result = val1 * val2
        oDoc.setValue("Report.A1", result)

Tamén é posíbel implementar os exemplos anteriores en Python deste xeito:

        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)

Temas relacionados

A biblioteca ScriptForge

SFDocuments.Calc service

Programming with Python Scripts