Περιεχόμενα

# Ανάγνωση και εγγραφή τιμών σε περιοχές

Οι μακροεντολές στο LibreOffice Calc συχνά χρειάζονται ανάγνωση και εγγραφή τιμών από/σε φύλλα. Αυτή η σελίδα βοήθειας περιγράφει τις διάφορες προσεγγίσεις για την πρόσβαση σε φύλλα και περιοχές για ανάγνωση ή εγγραφή των τιμών τους.

Όλα τα παραδείγματα που παρουσιάζονται σε αυτή τη σελίδα μπορούν να υλοποιηθούν τόσο σε Basic όσο και σε Python.

## Πρόσβαση σε ένα μόνο κελί

Το παρακάτω παράδειγμα εισάγει την αριθμητική τιμή 123 στο κελί "A1" του τρέχοντος φύλλου.

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

Το ίδιο μπορεί να επιτευχθεί και με την Python:

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

Σημειώστε ότι στα προηγούμενα παραδείγματα το κελί προσπελάζεται χρησιμοποιώντας το όνομα περιοχής του "A1". Είναι επίσης δυνατή η πρόσβαση στα κελιά χρησιμοποιώντας δείκτες σαν το φύλλο να ήταν ένας πίνακας όπου οι στήλες και οι σειρές καταχωρούνται στο ευρετήριο ξεκινώντας από το μηδέν.

Αυτό μπορεί να γίνει χρησιμοποιώντας τη μέθοδο getCellByPosition(colIndex, rowIndex), η οποία περιλαμβάνει ευρετήριο στήλης και σειράς. Το παρακάτω παράδειγμα στο Basic αλλάζει την τιμή κειμένου στο κελί "C1" (στήλη 2, σειρά 0).

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

Αυτό το παράδειγμα μπορεί επίσης να εφαρμοστεί στην Python ως εξής:

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

Η κύρια διαφορά μεταξύ των σεναρίων Python και Basic έγκειται στον τρόπο απόκτησης πρόσβασης στο αντικείμενο φύλλου χρησιμοποιώντας τη μεταβλητή περιβάλλοντος XSCRIPTCONTEXT. Μετά από αυτό, όλες οι μέθοδοι και οι ιδιότητες είναι πανομοιότυπες σε Basic και Python.

## Τιμές, συμβολοσειρές και τύποι

Τα κελιά Calc μπορούν να έχουν τρεις τύπους τιμών: αριθμητικές, συμβολοσειρές και τύπους. Κάθε τύπος έχει το δικό του σύνολο και μεθόδους λήψης:

Τύπος | Get Method | Set Method
--- | --- | ---
Αριθμητικό | getValue() | setValue(newValue)
Κείμενο | getString() | setString(newString)
Τύπος | getFormula() | setFormula(newFormula)

Οι ημερομηνίες και οι τιμές νομισμάτων θεωρούνται ως αριθμητικές τιμές στο Calc.

Το ακόλουθο παράδειγμα εισάγει αριθμητικές τιμές στα κελιά "A1" και "A2" και εισάγει έναν τύπο στο κελί "A3" που επιστρέφει τον πολλαπλασιασμό αυτών των τιμών.

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

## Πρόσβαση περιοχών σε διαφορετικά φύλλα

Τα προηγούμενα παραδείγματα χρησιμοποιούσαν μόνο το ενεργό φύλλο για την εκτέλεση πράξεων. Είναι δυνατή η πρόσβαση σε περιοχές κελιών σε διαφορετικά φύλλα με βάση τους δείκτες ή τα ονόματά τους.

Το παρακάτω παράδειγμα εισάγει μια αριθμητική τιμή στο κελί "A1" του φύλλου που ονομάζεται "Φύλλο2".

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

Αυτό το παράδειγμα μπορεί επίσης να εφαρμοστεί στην Python ως εξής:

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

Τα φύλλα μπορούν επίσης να προσπελαστούν χρησιμοποιώντας δείκτες μηδενικής βάσης που υποδεικνύουν ποιο φύλλο λαμβάνοντας υπόψη τη σειρά που εμφανίζονται στο αρχείο Calc.

Στη Basic, αντί να χρησιμοποιήσετε τη μέθοδο getByName, χρησιμοποιήστε Sheets(sheetIndex) όπως φαίνεται παρακάτω:

        oSheet = ThisComponent.Sheets(0)

Αυτό μπορεί να γίνει με παρόμοιο τρόπο στην Python:

        sheet = doc.Sheets[0]

## Με χρήση της Βιβλιοθήκης ScriptForge

Η υπηρεσία Calc της βιβλιοθήκης ScriptForge μπορεί να χρησιμοποιηθεί για τη λήψη και τον ορισμό τιμών κελιών ως εξής:

        ' Φορτώνει τη βιβλιοθήκη ScriptForge
        GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
        ' Αποκτά πρόσβαση στο τρέχον έγγραφο Calc
        oDoc = CreateScriptService("Calc")
        ' Ορίζει την τιμή των κελιών A1 και A2
        oDoc.setValue("A1", "Hello")
        oDoc.setValue("A2", 123)

Η μέθοδος setValue μπορεί να χρησιμοποιηθεί για τον ορισμό τόσο αριθμητικών όσο και τιμών κειμένου. Για να ορίσετε έναν τύπο κελιού, χρησιμοποιήστε τη μέθοδο setFormula.

Με την υπηρεσία Calc, η λήψη και ο καθορισμός τιμών κελιών μπορεί να γίνει με μία μόνο γραμμή κώδικα. Το παρακάτω παράδειγμα λαμβάνει την τιμή από το κελί "A1" και την εμφανίζει σε ένα πλαίσιο μηνύματος.

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

Η βιβλιοθήκη ScriptForge καθιστά επίσης πιο εύκολη την πρόσβαση σε περιοχές σε διαφορετικά φύλλα, όπως φαίνεται στο παρακάτω παράδειγμα:

        Dim val1, val2
        ' Παίρνει το κελί "A1" από το φύλλο με το όνομα "Sheet1"
        val1 = oDoc.getValue("Sheet1.A1")
        ' Λαμβάνει το κελί "B3" από το φύλλο με το όνομα "Sheet2"
        val2 = oDoc.getValue("Sheet2.B3")
        ' Τοποθετεί το αποτέλεσμα στο κελί "A1" του φύλλου "Report"
        Dim result : result = val1 * val2
        oDoc.setValue("Report.A1", result)

Τα παραπάνω παραδείγματα μπορούν επίσης να εφαρμοστούν στην Python ως εξής:

        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)

Σχετικά θέματα

Η βιβλιοθήκη ScriptForge

Υπηρεσία SFDocuments.Calc

Προγραμματισμός με σενάρια Python