Contenuto

# Leggere e scrivere valori negli intervalli di celle

Le macro di LibreOffice Calc spesso richiedono di leggere e scrivere valori da/nei fogli. Questa pagina della guida in linea descrive i vari approcci per accedere ai fogli e agli intervalli di celle al fine di leggere o scrivere i loro valori.

È possibile implementare tutti gli esempi presentati in questa pagina sia in Basic, sia in Python.

## Accesso a una singola cella

L'esempio seguente inserisce il valore numerico 123 nella cella "A1" del foglio corrente.

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

È possibile ottenere lo stesso con Python:

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

Tenere presente che negli esempi precedenti l'accesso alla cella è consentito usando il nome del suo intervallo "A1". È possibile accedere alla celle anche mediante gli indici, come se il foglio fosse una matrice, nella quale le colonne e le righe sono rappresentate da indici a partire da zero.

A tale scopo utilizzare il metodo getCellByPosition(colIndex, rowIndex), che richiede l'indice di una colonna e di una riga. L'esempio seguente in Basic modifica il valore del testo nella cella "C1" (colonna 2, riga 0).

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

È possibile implementare lo stesso esempio in Python come segue:

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

La differenza principale tra gli script in Python e Basic risiede nel modo di ottenere l'accesso all'oggetto che rappresenta il foglio usando la variabile di contesto XSCRIPTCONTEXT. Dopodiché tutti i metodi e le proprietà sono identiche in Basic e in Python.

## Valori, stringhe e formule

Le celle di Calc possono avere tre tipi di valori: numerici, stringhe e formule. Ogni tipo ha i suoi metodi "set" e "get":

Tipo | Get Method | Set Method
--- | --- | ---
Numerico | getValue() | setValue(newValue)
Testo | getString() | setString(newString)
Formula | getFormula() | setFormula(newFormula)

In Calc, le date e le valute sono considerate valori numerici.

L'esempio seguente inserisce dei valori numerici nelle celle "A1" e "A2" e una formula nella cella "A3", che restituisce la moltiplicazione di tali valori.

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

## Accedere a intervalli di celle di fogli differenti

Gli esempi precedenti eseguivano operazioni solamente sul foglio attivo. È possibile accedere a intervalli di celle di fogli diversi in base ai relativi indici o nomi.

L'esempio seguente inserisce un valore numerico nella cella "A1" del foglio denominato "Sheet2".

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

È possibile implementare lo stesso esempio in Python come segue:

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

È possibile accedere ai fogli anche usando degli indici a partire da zero che indicano il foglio in base all'ordine con cui appaiono nel file di Calc.

In Basic, anziché usare il metodo getByName, utilizzare Sheets(sheetIndex) come mostrato di seguito:

        oSheet = ThisComponent.Sheets(0)

È possibile procedere in modo analogo in Python:

        sheet = doc.Sheets[0]

## Utilizzare la libreria ScriptForge

È possibile usare il servizio Calc della libreria ScriptForge per ottenere e impostare i valori delle celle come segue:

        ' Carica la libreria ScriptForge
        GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
        ' Ottiene l'accesso al documento corrente di Calc
        oDoc = CreateScriptService("Calc")
        ' Imposta il valore delle celle A1 e A2
        oDoc.setValue("A1", "Hello")
        oDoc.setValue("A2", 123)

È possibile usare il metodo setValue per impostare valori sia numerici, sia di testo. Per impostare la formula di una cella, usare il metodo setFormula.

Con il servizio Calc, è possibile ottenere e impostare i valori delle celle con una singola linea di codice. L'esempio sottostante ottiene il valore della cella "A1" e lo visualizza in una finestra di messaggio.

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

La libreria ScriptForge semplifica anche l'accesso agli intervalli in fogli diversi, come dimostrato nell'esempio seguente:

        Dim val1, val2
        ' Ottiene la cella "A1" dal foglio denominato "Sheet1"
        val1 = oDoc.getValue("Sheet1.A1")
        ' Ottiene la cella "B3" dal foglio denominato "Sheet2"
        val2 = oDoc.getValue("Sheet2.B3")
        ' Inserisce il risultato nella cella "A1" del foglio "Report"
        Dim result : result = val1 * val2
        oDoc.setValue("Report.A1", result)

È possibile implementare gli esempi sopra riportati in Python, come segue:

        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)

Argomenti correlati

La libreria ScriptForge

Servizio SFDocuments.Calc

Programmare con script Python

Sostienici!