Obsah

# Čtení a zápis hodnot do oblastí

Makra v aplikaci LibreOffice často vyžadují čtení a zápis hodnot z listů a do listů. Tato stránka popisuje různé možnosti, jak k listům a oblastem přistupovat a jak z nich číst a do nich zapisovat hodnoty.

Všechny příklady na této stránce mohou být implementovány jak v Basicu, tak v Pythonu.

## Přístup k jediné buňce

V následujícím příkladu je do buňky "A1" z aktuálního listu zadána číselná hodnota 123.

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

Téhož lze dosáhnout v Pythonu:

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

V těchto příkladech je k přístupu k buňce použit název oblasti "A1". K buňce je možné přistupovat také pomocí indexů, které odpovídají představě, že list je matice a jeho řádky a sloupce začínají od indexu 0.

K tomu slouží metoda getCellByPosition(colIndex, rowIndex), jejímiž argumenty jsou index sloupce a index řádku. Následující příklad v Basicu změní textovou hodnotu v buňce "C1" (sloupec 2, řádek 0).

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

V Pythonu lze tento příklad implementovat následovně:

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

Hlavní rozdíl mezi skripty v Pythonu a Basicu spočívá v tom, že v Pythonu se získává přístup k objektu s listem pomocí kontextové proměnné XSCRIPTCONTEXT. Poté jsou všechny metody a vlastnosti v obou jazycích stejné.

## Hodnoty, řetězce a vzorce

Buňky Calcu mohou obsahovat tři typu hodnot: čísla, řetězce a vzorce. Každý typ má vlastní metody set a get:

Typ | Get Method | Set Method
--- | --- | ---
Číslo | getValue() | setValue(newValue)
Text | getString() | setString(newString)
Vzorec | getFormula() | setFormula(newFormula)

Hodnoty data a měny jsou Calcu považovány za číselné.

V následujícím příkladu jsou do buněk "A1" a "A2" zadány číselné hodnoty a do buňky "A3" je vložen vzorec, který vrátí součin těchto hodnot.

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

## Přístup k oblastem na jiných listech

V předchozí příklady pracovaly pouze s aktivním listem. Je však možné přistupovat k oblastem buněk na jiných listech, a to pomocí jejich indexů nebo názvů.

V následujícím příkladu je zadána číselná hodnota do buňky "A1" na listu pojmenovaném "Sheet2".

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

V Pythonu lze tento příklad implementovat následovně:

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

K listům lze přistupovat také pomocí indexů (začínajících od nuly), které označují pořadí listu v souboru Calcu.

V Basicu použijte místo metody getByName Sheets(sheetIndex), jak ukazuje následující příklad:

        oSheet = ThisComponent.Sheets(0)

Podobným způsobem lze totéž provést v Pythonu:

        sheet = doc.Sheets[0]

## Pomocí knihovny ScriptForge

K získávání a nastavování hodnot buněk lze použít službu Calc knihovny ScriptForge, a to následovně:

        ' Načte knihovnu ScriptForge
        GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
        ' Získá přístup k aktuálnímu dokumentu Calcu
        oDoc = CreateScriptService("Calc")
        ' Nastaví hodnoty buněk A1 a A2
        oDoc.setValue("A1", "Hello")
        oDoc.setValue("A2", 123)

Metodu setValue lze použít pro zadání číselných i textových hodnot. Chcete-li nastavit vzorec, použijte metodu setFormula.

Pomocí služby Calc je možné získávat a nastavovat hodnoty buněk jediným řádkem kódu. V následujícím příkladu se získá hodnota buňky "A1" a zobrazí se jako zpráva.

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

Knihovna ScriptForge rovněž zjednodušuje přístup k oblastem na jiných listech, jak ukazuje následující příklad:

        Dim val1, val2
        ' Získá hodnotu buňky "A1" z listu pojmenovaného "Sheet1"
        val1 = oDoc.getValue("Sheet1.A1")
        ' Získá hodnotu buňky "B3" z listu pojmenovaného "Sheet2"
        val2 = oDoc.getValue("Sheet2.B3")
        ' Umístí výsledek do buňky "A1" na listu "Report"
        Dim result : result = val1 * val2
        oDoc.setValue("Report.A1", result)

V Pythonu lze tyto příklady implementovat následovně:

        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)

Související témata

Knihovna ScriptForge

Služba SFDocuments.Calc

Programování pomocí skriptů Pythonu