Contingut
Índex 🔎︎

# Lectura i escriptura de valors als intervals

Les macros a Calc LibreOffice sovint necessiten llegir i escriure valors de/a fulls. Aquesta pàgina d'ajuda descriu els diferents enfocaments per accedir a fulls i intervals per llegir o escriure els seus valors.

Els exemples que es presenten en aquesta pàgina poden implementar-se tant en Basic com en Python.

## Accés a una única cel·la

L'exemple següent introdueix el valor numèric 123 a la cel·la "A1" del full actual.

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

El mateix es pot aconseguir en Python:

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

Tingueu en compte que en els exemples anteriors s'accedeix a la cel·la utilitzant el seu nom d'interval "A1". També és possible accedir a les cel·les mitjançant índexs com si el full fos una matriu on s'indexen columnes i files a partir de zero.

Es pot realitzar utilitzant el mètode getCellByPosition(colIndex, rowIndex), que agafa un índex de columna i fila. L'exemple següent en Basic canvia el valor del text a la cel·la "C1" (columna 2, fila 0).

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

Aquest exemple també es pot implementar en Python de la següent manera:

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

La principal diferència entre els scripts Python i Basic rau en com accedir a l'objecte full utilitzant la variable de context XSCRIPTCONTEXT. Després d'això, tots els mètodes i propietats són idèntics tant en Basic com en Python.

## Valors, cadenes i fórmules

Les cel·les del Calc tenen tres tipus de valors: numèric, cadena i fórmula. Cada tipus té mètodes de lectura i escriptura propis:

Tipus | Get Method | Set Method
--- | --- | ---
Numèric | getValue() | setValue(newValue)
Text | getString() | setString(newString)
Fórmula | getFormula() | setFormula(newFormula)

Els valors de les dates i les monedes es consideren numèriques a Calc.

L'exemple següent introdueix valors numèrics a les cel·les "A1" i "A2" i insereix una fórmula a la cel·la "A3" que retorna la multiplicació d'aquests valors.

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

## Accés a intervals definits en altres fulls

Els exemples anteriors utilitzaven només el full actiu per realitzar operacions. És possible accedir a rangs de cel·les de diferents fulls mitjançant els índexs o noms dels fulls.

L'exemple següent introdueix un valor numèric a la cel·la "A1" del full anomenat "Full2".

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

Aquest exemple també es pot implementar en Python de la següent manera:

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

També es pot accedir als fulls mitjançant índexs de base zero que indiquen el full tenint en compte l'ordre en què apareixen al fitxer Calc.

En Basic, en comptes d'utilitzar el mètode getByName, utilitzeu Sheets(indexFull) com es mostra a continuació:

        oSheet = ThisComponent.Sheets(0)

Això es pot fer d'una manera semblant en Python:

        sheet = doc.Sheets[0]

## Ús de la biblioteca ScriptForge

El servei Calc de la biblioteca ScriptForge es pot usar per a obtenir i modificar els valors de les cel·les així:

        ' Carrega la biblioteca ScriptForge
        GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
        ' Obté accés al document del Calc actual
        oDoc = CreateScriptService("Calc")
        ' Estableix el valor de les cel·les A1 i A2
        oDoc.setValue("A1", "Hello")
        oDoc.setValue("A2", 123)

El mètode setValue es pot utilitzar per establir valors text i numèrics. Per establir una formula en una cel·la, utilitzeu el mètode setFormula.

Amb el servei Calc, obtenir i establir valors de cel·la es pot fer amb una única línia de codi. L'exemple següent obté el valor de la cel·la "A1" i el mostra en un quadre de missatge.

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

La biblioteca ScriptForge també simplifica l'accés als intervals d'altres fulls, com es demostra a l'exemple següent:

        Dim val1, val2
        ' Obté la cel·la "A1" del full "Full1"
        val1 = oDoc.getValue("Sheet1.A1")
        ' Obté la cel·la "B3" del full anomenat "Full2"
        val2 = oDoc.getValue("Sheet2.B3")
        ' Col·loca el resultat a la cel·la "A1" del full "Informe"
        Dim result : result = val1 * val2
        oDoc.setValue("Report.A1", result)

Els exemples anteriors també es poden implementar en Python així:

        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)

Temes relacionats

La llibreria ScriptForge

SFDocuments.Calc service

Programació amb scripts en Python