Spis treści

# Odczytywanie i zapisywanie wartości do zakresów

Makra w programie LibreOffice Calc często wymagają odczytywania i zapisywania wartości z lub do arkuszy. Ta strona pomocy opisuje różne podejścia do uzyskiwania dostępu do arkuszy i zakresów w celu odczytywania lub zapisywania ich wartości.

Wszystkie przykłady przedstawione na tej stronie można zaimplementować zarówno w języku Basic, jak i Python.

## Dostęp do pojedynczej komórki

Poniższy przykład wprowadza wartość liczbową 123 do komórki "A1" bieżącego arkusza.

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

To samo można osiągnąć za pomocą Pythona:

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

Należy zauważyć, że w poprzednich przykładach dostęp do komórki jest uzyskiwany przy użyciu nazwy zakresu "A1". Możliwy jest również dostęp do komórek za pomocą indeksów, tak jakby arkusz był macierzą, w której kolumny i wiersze są indeksowane od zera.

Można to zrobić za pomocą metody getCellByPosition(colIndex, rowIndex), która przyjmuje indeks kolumny i wiersza. Poniższy przykład w Basic zmienia wartość tekstową w komórce "C1" (kolumna 2, wiersz 0).

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

Ten przykład można również zaimplementować w Pythonie w następujący sposób:

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

Główna różnica między skryptami w języku Python i Basic polega na sposobie uzyskania dostępu do obiektu arkusza za pomocą zmiennej kontekstowej XSCRIPTCONTEXT. Następnie wszystkie metody i właściwości są identyczne w językach Basic i Python.

## Wartości, ciągi i formuły

Komórki programu Calc mogą zawierać trzy typy wartości: liczbowe, ciągi i formuły. Każdy typ ma swoje własne metody set i get:

Typ | Get Method | Set Method
--- | --- | ---
Liczbowy | getValue() | setValue(newValue)
Tekst | getString() | setString(newString)
Formuła | getFormula() | setFormula(newFormula)

Daty i wartości walut są traktowane jako wartości liczbowe w programie Calc.

Poniższy przykład wprowadza wartości liczbowe do komórek "A1" i "A2" oraz wstawia formułę do komórki "A3", która zwraca mnożenie tych wartości.

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

## Dostęp do zakresów w różnych arkuszach

W poprzednich przykładach do wykonywania operacji używano tylko aktywnego arkusza. Dostęp do zakresów komórek w różnych arkuszach można uzyskać za pomocą ich indeksów lub nazw.

Poniższy przykład wprowadza wartość liczbową do komórki "A1" arkusza o nazwie "Sheet2".

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

Ten przykład można również zaimplementować w Pythonie w następujący sposób:

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

Dostęp do arkuszy można również uzyskać za pomocą indeksów liczonych od zera, które określają, który arkusz jest wyświetlany, biorąc pod uwagę kolejność, w jakiej pojawiają się w pliku Calc.

W języku Basic zamiast metody getByName użyj metody Sheets(sheetIndex), jak pokazano poniżej:

        oSheet = ThisComponent.Sheets(0)

Można to zrobić w podobny sposób w Pythonie:

        sheet = doc.Sheets[0]

## Korzystanie z biblioteki ScriptForge

Usługa Calc biblioteki ScriptForge może służyć do pobierania i ustawiania wartości komórek w następujący sposób:

        ' Ładuje bibliotekę ScriptForge
        GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
        ' Uzyskuje dostęp do bieżącego dokumentu programu Calc
        oDoc = CreateScriptService("Calc")
        ' Ustawia wartości komórek A1 i A2
        oDoc.setValue("A1", "Hello")
        oDoc.setValue("A2", 123)

Metoda setValue może być używana do ustawiania zarówno wartości liczbowych, jak i tekstowych. Aby ustawić formułę komórki, użyj metody setFormula.

Dzięki usłudze Calc pobieranie i ustawianie wartości komórek można wykonać za pomocą jednego wiersza kodu. Poniższy przykład pobiera wartość z komórki "A1" i wyświetla ją w oknie komunikatu.

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

Biblioteka ScriptForge ułatwia również dostęp do zakresów w różnych arkuszach, jak pokazano w poniższym przykładzie:

        Dim val1, val2
        ' Pobiera komórkę "A1" z arkusza o nazwie "Sheet1"
        val1 = oDoc.getValue("Sheet1.A1")
        ' Pobiera komórkę "B3" z arkusza o nazwie "Sheet2"
        val2 = oDoc.getValue("Sheet2.B3")
        'Umieszcza wynik w komórce "A1" arkusza "Report"
        Dim result : result = val1 * val2
        oDoc.setValue("Report.A1", result)

Powyższe przykłady można również zaimplementować w Pythonie w następujący sposób:

        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)

Tematy pokrewne

Biblioteka ScriptForge

Usługa SFDocuments.Calc

Programowanie za pomocą skryptów Pythona