Inhalte

# Lesen und Schreiben von Werten in Bereiche

Makros in LibreOffice-Calc müssen häufig Werte aus/in Tabellen lesen und schreiben. Auf dieser Hilfeseite werden die verschiedenen Ansätze für den Zugriff auf Tabellen und Bereiche zum Lesen oder Schreiben ihrer Werte beschrieben.

Alle auf dieser Seite vorgestellten Beispiele können sowohl in Basic als auch in Python implementiert werden.

## Zugriff auf eine einzelne Zelle

Im folgenden Beispiel wird der numerische Wert 123 in die Zelle "A1" der aktuellen Tabelle eingegeben.

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

Das Gleiche kann mit Python erreicht werden:

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

Beachten Sie, dass in den vorherigen Beispielen auf die Zelle mit ihrem Bereichsnamen "A1" zugegriffen wird. Es ist auch möglich, über Indizes auf Zellen zuzugreifen, als wäre die Tabelle eine Matrix, in der Spalten und Zeilen ab Null indiziert sind.

Dies kann mit der Methode getCellByPosition(colIndex, rowIndex) erreicht werden, die einen Spalten- und einen Zeilenindex aufnimmt. Das folgende Beispiel in Basic ändert den Textwert in Zelle "C1" (Spalte 2, Zeile 0).

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

Dieses Beispiel kann in Python wie folgt implementiert werden:

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

Der Hauptunterschied zwischen Python- und Basic-Skripten besteht darin, wie Sie mithilfe der Kontextvariablen XSCRIPTCONTEXT Zugriff auf das Tabellen-Objekt erhalten. Danach sind alle Methoden und Eigenschaften in Basic und Python identisch.

## Werte, Zeichenfolgen und Formeln

Calc-Zellen können drei Arten von Werten haben: numerisch, Zeichenfolgen und Formeln. Jeder Typ hat seine eigenen Set- und Get-Methoden:

Typ | Get Method | Set Method
--- | --- | ---
Nummerisch | getValue() | setValue(newValue)
Text | getString() | setString(newString)
Formel | getFormula() | setFormula(newFormula)

Datums- und Währungswerte werden in Calc als numerische Werte behandelt.

Das folgende Beispiel fügt numerische Werte in die Zellen "A1" und "A2" ein und fügt eine Formel in die Zelle "A3" ein, welche die Multiplikation dieser Werte zurückgibt.

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

## Zugriff auf Bereiche in verschiedenen Tabellen

In den vorherigen Beispielen wurde nur die aktive Tabelle zum Ausführen von Operationen verwendet. Es ist möglich, auf Zellbereiche in verschiedenen Tabellen über ihre Indizes oder Namen zuzugreifen.

Im folgenden Beispiel wird ein numerischer Wert in die Zelle "A1" der Tabelle mit dem Namen "Sheet2" eingegeben.

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

Dieses Beispiel kann auch wie folgt in Python implementiert werden:

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

Auf Tabellen kann auch mit nullbasierten Indizes zugegriffen werden, die angeben, welche Tabelle unter Berücksichtigung der Reihenfolge, in der sie in der Calc-Datei erscheinen, angezeigt wird.

In Basic verwenden Sie anstelle der Methode getByName die Methode Sheets(sheetIndex), wie unten gezeigt:

        oSheet = ThisComponent.Sheets(0)

Dies kann auf ähnliche Weise in Python erfolgen:

        sheet = doc.Sheets[0]

## Verwenden der Bibliothek ScriptForge

Der Calc-Dienst der Bibliothek ScriptForge kann verwendet werden, um Zellenwerte wie folgt zu erhalten und zu setzen:

        ' Lädt die Bibliothek ScriptForge
        GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
        ' Erhält Zugriff auf das aktuelle Calc-Dokument
        oDoc = CreateScriptService("Calc")
        ' Legt den Wert der Zellen A1 und A2 fest
        oDoc.setValue("A1", "Hello")
        oDoc.setValue("A2", 123)

Die Methode setValue kann verwendet werden, um sowohl numerische als auch Textwerte festzulegen. Verwenden Sie zum Festlegen einer Zellformel die Methode setFormula.

Mit dem Calc-Dienst kann das Abrufen und Festlegen von Zellenwerten mit einer einzigen Codezeile erfolgen. Das folgende Beispiel ruft den Wert aus Zelle "A1" ab und zeigt ihn in einem Meldungsfeld an.

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

Die Bibliothek ScriptForge vereinfacht auch den Zugriff auf Bereiche in verschiedenen Tabellen, wie im folgenden Beispiel gezeigt:

        Dim val1, val2
        ' Ruft Zelle "A1" aus der Tabelle mit dem Namen "Sheet1" ab
        val1 = oDoc.getValue("Sheet1.A1")
        ' Ruft Zelle "B3" aus der Tabelle mit dem Namen "Sheet2" ab
        val2 = oDoc.getValue("Sheet2.B3")
        ' Platziert das Ergebnis in Zelle "A1" der Tabelle "Report"
        Dim result : result = val1 * val2
        oDoc.setValue("Report.A1", result)

Die obigen Beispiele können auch wie folgt in Python implementiert werden:

        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)

Verwandte Themen

Die Bibliothek ScriptForge

Dienst SFDocuments.Calc

Programmierung mit Python-Skripten