Indhold

# Læsning og Skrivning af værdier til områder

Makroer i LibreOffice Calc har ofte brug for at læse og skrive værdier fra/til ark, Denne hjælpeside beskriver de forskellige tilgange til at tilgå ark og områder for at læse eller skrive deres værdier.

Alle eksempler præsenteres på denne side kan implementeres i både Basic og Python.

## Tilgang til en enkelt celle

Eksemplet herunder indsætter den numeriske værdi 123 i celle "A1" i de aktuelle ark.

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

Det samme kan opnå med Python:

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

Bemærk, at cellen i de foregående eksempler tilgås med den område navn "A1". Det er også muligt at tilgå celler med indekser som om arket var en matrix, hvor kolonner og rækker er indekseret begyndende fra nul.

Dette kan gøres med metoden getCellByPosition(colIndex, rowIndex), der bruger et kolonne- og et rækkeindeks. Eksemplet herunder i Basic ændrer tekstværdien i celle "C1" (kolonne 2, række 0).

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

Dette eksempel kan også implementeres i Python som følger:

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

Hovedforskellen mellem Python- og Basic-script ligger i, hvordan du får adgang til arkobjektet med kontekstvariablen XSCRIPTCONTEXT. Derefter er alle metoder og egenskaber identiske i Basic og Python.

## Værdier, strenge og formler

Calc-celler kan have tre typer værdier: numeriske, strenge og formler. Hver type har sine egne metoder til at sætte og hente:

Type | Get Method | Set Method
--- | --- | ---
Numerisk | getValue() | setValue(newValue)
Tekst | getString() | setString(newString)
Formel | getFormula() | setFormula(newFormula)

Datoer og valutaværdier betragtes som numeriske værdier i Calc.

Det følgende eksempel indsætter numeriske værdier i cellerne "A1" og "A2" og indsætter en formel i celle "A3", der returnerer multiplikationen af disse værdier.

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

## Tilgang til områder i forskellige ark

De foregående eksempler benytte udelukkende de aktive ark til at udføre handlinger. Det er muligt at tilgå celleområder på forskellige ark efter indekser eller navn.

Eksemplet herunder indsætter en numerisk værdi i celle "A1" på arket ved navn "Sheet2".

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

Dette eksempel kan også implementeres i Python som følger:

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

Ark kan også tilgås ved at bruge nulbaserede indekser, som angiver, hvilket ark ud fra den rækkefølge, de vises i Calc-filen.

I stedet for at bruge metoden getByName bruger du i Basic Sheets(sheetIndex) som vist herefter:

        oSheet = ThisComponent.Sheets(0)

Dette kan gøres på en lignende måde i Python:

        sheet = doc.Sheets[0]

## Med biblioteket ScriptForge

Calc-tjenesten i ScriptForge-biblioteket kan bruges til at hente og angive celleværdier som følger:

        ' Indlæser ScriptForge-biblioteket
        GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
        ' Får adgang til det aktuelle Calc-dokument
        oDoc = CreateScriptService("Calc")
        ' Angiver værdien i cellerne A1 og A2
        oDoc.setValue("A1", "Hello")
        oDoc.setValue("A2", 123)

Metoden setValue kan bruges til at angive både numeriske og tekstværdier. For at angive en celleformel bruger du metoden setFormula.

Med Calc-tjenesten kan hentning og angivelse af celleværdier gøres med en enkelt kodelinje. Eksemplet herunder henter værdien fra celle "A1" og viser den i et beskedfelt.

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

ScriptForge-biblioteket gør det også lettere at få adgang til områder i forskellige ark, som vist i eksemplet herunder:

        Dim val1, val2
        ' Henter celle "A1" fra arket kaldet "Sheet1"
        val1 = oDoc.getValue("Sheet1.A1")
        ' Henter celle "B3" fra arket kaldet "Sheet2"
        val2 = oDoc.getValue("Sheet2.B3")
        ' Placerer resultatet i celle "A1" på arket "Rapport"
        Dim result : result = val1 * val2
        oDoc.setValue("Report.A1", result)

Eksemplerne ovenfor kan også implementeres i Python som følger:

        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)

Relaterede emner

Biblioteket ScriptForge

SFDocuments.Calc

Programmering med Python-scripts