Vsebina

# Branje in pisanje vrednosti v obsegih

Makri v LibreOffice Calc morajo pogosto brati in pisati vrednosti iz/na delovne liste. Ta stran pomoči opisuje različne pristope za dostop do delovnih listov in obsegov, da lahko beremo in zapisujemo njihove vrednosti.

Vse na tej strani predstavljene primere lahko implementirate v Basicu in Pythonu.

## Dostop do posamezne celice

Spodnji primer vnese številsko vrednost 123 v celico »A1« na trenutnem delovnem listu.

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

Isto lahko dosežemo v Pythonu:

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

Upoštevajte, da v prejšnjih primerih dostop do celice poteka z imenom obsega »A1«. Prav tako je do celic možno dostopati z uporabo indeksov, kot da je delovni list matrika, kjer so stolpci in vrstice indeksirani od nič naprej.

To lahko opravimo z metodo getCellByPosition(colIndex, rowIndex), ki vzame za argument indeks stolpca in vrstice. Spodnji primer v Basicu spremeni besedilno vrednost v celici »C1« (stolpec 2, vrstica 0).

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

Ta primer lahko implementiramo tudi v Pythonu na sledeč način:

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

Glavna razlika med skripti Python in Basic je v načinu dostopa do predmeta delovnega lista z uporabo kontekstne spremenljivke XSCRIPTCONTEXT. Zatem so vse metode in lastnosti v Basicu in Pythonu identične.

## Vrednosti, nizi in formule

Celice v preglednicah Calc imajo lahko tri vrste vrednosti: števila, nize in formule. Vsaka teh vrst ima lastni metodi določanja in pridobivanja:

Vrsta | Get Method | Set Method
--- | --- | ---
Številska | getValue() | setValue(newValue)
Besedilo | getString() | setString(newString)
Formula | getFormula() | setFormula(newFormula)

Datumske in valutne vrednosti v programu Calc štejejo za številske.

Naslednji primer vnese številski vrednosti v celici »A1« in »A2« ter formulo v celico »A3«, ki vrne zmnožek njunih vrednosti.

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

## Dostop do obsegov na različnih delovnih listih

Prejšnji primeri so za izvajanje operacij uporabljali le dejavni delovni list. Do obsegov celic lahko dostopate tudi na različnih delovnih listih, tako da uporabite njihove indekse ali imena.

Spodnji primer vnese številsko vrednost v celico »A1« na delovnem listu z imenom »Sheet2«.

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

Ta primer lahko implementiramo tudi v Pythonu na sledeč način:

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

Do delovnih listov lahko dostopamo tudi z indeksi na osnovi nič, ki nakazujejo, za kateri delovni list po vrsti glede na zaporedje v datoteki Calc gre.

V Basicu namesto metode getByName uporabite Sheets(indeksDelovnegaLista), kot je prikazano v nadaljevanju:

        oSheet = ThisComponent.Sheets(0)

To lahko opravimo na podoben način v Pythonu:

        sheet = doc.Sheets[0]

## Z uporabo knjižnice ScriptForge

Storitev Calc knjižnice ScriptForge lahko uporabimo za pridobivanje (get) in določanje (set) vrednosti celic na sledeč način:

        ' Naloži knjižnico ScriptForge
        GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
        ' Pridobi dostop do trenutnega dokumenta Calc
        oDoc = CreateScriptService("Calc")
        ' Določi vrednost celic A1 in A2
        oDoc.setValue("A1", "Hello")
        oDoc.setValue("A2", 123)

Metodo setValue lahko uporabimo za določitev tako številskih kot besedilnih vrednosti. Za določitev formule v celici uporabite metodo setFormula.

S storitvijo Calc je pridobivanje in določanje vrednosti celic možno opraviti z eno samo vrstico kode. Spodnji primer pridobi vrednosti iz celice »A1« in jo prikaže v oknu s sporočilom.

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

Knjižnica ScriptForge tudi olajša dostop do obsegov na različnih delovnih listih, kar demonstrira spodnji primer:

        Dim val1, val2
        ' Pridobi celico »A1« iz delovnega lista z imenom »Sheet1«
        val1 = oDoc.getValue("Sheet1.A1")
        ' Pridobi celico »B3« iz delovnega lista z imenom »Sheet2«
        val2 = oDoc.getValue("Sheet2.B3")
        ' Postavi rezultat v celico »A1« delovnega lista »Report«
        Dim result : result = val1 * val2
        oDoc.setValue("Report.A1", result)

Zgornje primere lahko implementiramo tudi v Pythonu na sledeč način:

        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)

Podobne teme

Knjižnica ScriptForge

Storitev SFDocuments.Calc

Programiranje s skripti Python