Tak. LibreOffice Calc może uruchamiać kod Pythona jako makro w procesie LibreOffice, a makro LibreOffice Basic może również wywoływać funkcję Pythona za pośrednictwem frameworka skryptowego LibreOffice. Jeśli celem jest odczyt lub zmiana komórek w otwartym arkuszu kalkulacyjnym, makro Pythona działające w procesie jest zazwyczaj najprostszym punktem wyjścia. Użyj wywołania Basic-to-Python, gdy istniejące makro Basic ma przekazać jedno zadanie do funkcji Pythona wielokrotnego użytku.
Te podejścia różnią się od uruchamiania zwykłego skryptu systemowego Pythona za pomocą polecenia powłoki. Standardowy zewnętrzny proces Pythona nie otrzymuje automatycznie obiektu dokumentu Calca. Aby uzyskać dostęp do skoroszytu, należy uruchomić makro Pythona za pośrednictwem LibreOffice lub celowo połączyć proces zewnętrzny z instancją LibreOffice za pomocą UNO.
Co oznacza „uruchom Pythona wewnątrz makra Calc”?
LibreOffice obsługuje wiele języków skryptowych za pośrednictwem swojego frameworka skryptowego. W makrze Pythona LibreOffice dostarcza obiekt kontekstu UNO, który umożliwia skryptowi dotarcie do bieżącego dokumentu i jego arkuszy. Makro Pythona to funkcja w .pymodule; krotka modułu g_exportedScriptsidentyfikuje funkcje, które LibreOffice powinien wyświetlać jako uruchamialne makra.
Makro Pythona może zostać uruchomione samodzielnie z menu makr Calca. Nie musi być wywoływane przez Basic. Jeśli masz już makro Basic i chcesz, aby wywoływało Pythona, dostawca skryptów LibreOffice lub nowsza Session.ExecutePythonScriptusługa ScriptForge mogą połączyć oba języki.
Które podejście powinieneś wybrać?
- Użyj makra Pythona bezpośrednio, gdy zadanie dotyczy głównie Pythona i wymaga bieżącego dokumentu Calc. Pozwala to uniknąć przekazywania języków i jest najłatwiejsze do debugowania jako jeden skrypt.
- Wywołaj Pythona z poziomu Basica, jeśli masz już kod Basica, przyciski lub zdarzenia dokumentu, które powinny pozostać na swoim miejscu, a chcesz, aby pomocnik Pythona wykonał skoncentrowane obliczenie lub operację na danych.
- Użyj zewnętrznego procesu Pythona, jeśli potrzebujesz osobnego środowiska programistycznego lub pakietów Pythona, które nie są zawarte w LibreOffice. Skonfiguruj jawne połączenie z UNO; nie zakładaj, że skrypt uruchomiony z terminala widzi otwarty arkusz kalkulacyjny.
Na przykład, małe narzędzie do czyszczenia arkusza kalkulacyjnego można napisać w całości jako makro Pythona. Jeśli istniejący przycisk Basic już uruchamia raport, zachowaj makro przycisku i pozwól mu wywołać funkcję Pythona, która oblicza sumę raportu.
Jak utworzyć makro Pythona edytujące komórki programu Calc?
LibreOffice przechowuje osobiste skrypty Pythona w profilu użytkownika, skrypty aplikacji w katalogu instalacyjnym, a skrypty dokumentów w dokumencie. Na pierwszy test, osobisty skrypt jest wygodny, ponieważ jest dostępny z dowolnego otwartego dokumentu LibreOffice dla tego samego użytkownika. Nie jest on jednak przesyłany z plikiem ODS, więc inna osoba nie otrzyma go automatycznie wraz z arkuszem kalkulacyjnym.
Znajdź osobisty folder skryptów Pythona dla swojego systemu w Pomocy LibreOffice w sekcji „Organizacja i lokalizacja skryptów Pythona”. Typowe lokalizacje to m.in. %APPDATA%\LibreOffice\4\user\Scripts\pythonsystemy Windows i ~/.config/libreoffice/4/user/Scripts/pythonLinux. Rzeczywisty profil może się różnić; użyj lokalizacji udokumentowanej dla instalacji, zamiast tworzyć drugi katalog profilu na podstawie domysłów.
Utwórz plik o nazwie znajdującej się calc_tools.pyw osobistym folderze skryptów Pythona, a następnie dodaj ten prosty przykład:
def double_a1(args=None):
doc = XSCRIPTCONTEXT.getDocument()
sheet = doc.getCurrentController().getActiveSheet()
source = sheet.getCellRangeByName("A1")
target = sheet.getCellRangeByName("B1")
target.setValue(source.getValue() * 2)
g_exportedScripts = (double_a1,)
Odczytuje wartość liczbową z komórki A1 aktywnego arkusza i zapisuje dwukrotnie większą wartość do komórki B1. XSCRIPTCONTEXTJest ona przekazywana do makra Pythona w LibreOffice w czasie wykonywania; nie jest to zwykła zmienna globalna Pythona, gdy ten sam plik jest uruchamiany poza LibreOffice. Funkcja publiczna jest wymieniona g_exportedScriptsw selektorze makr.
Zapisz plik, a następnie otwórz lub wróć do programu Calc i wybierz Narzędzia > Makra > Uruchom makra . W zależności od wersji LibreOffice lub tłumaczenia platformy, etykieta menu może być pojedyncza. Wybierz Moje makra > calc_tools > double_a1 i uruchom. Najpierw wpisz liczbę w komórce A1, a następnie sprawdź, czy komórka B1 zawiera podwojoną wartość. Jeśli moduł się nie pojawi, sprawdź, czy rozszerzenie pliku to .py, czy plik znajduje się w folderze Pythona odpowiedniego profilu i czy obsługa skryptów Pythona jest zainstalowana. Ponowne uruchomienie LibreOffice po dodaniu nowego modułu może pomóc odświeżyć listę skryptów.
W jaki sposób makro języka Basic może wywołać funkcję języka Python?
Aby wykonać wywołanie z języka Basic do Pythona, umieść moduł Pythona w folderze osobistych skryptów i wywołaj jego funkcję za pośrednictwem Sessionusługi ScriptForge. Ten przykład dodaje dwie wartości w Pythonie i zapisuje wynik w komórce B1 w bieżącym arkuszu Calc.
W calc_tools.py, zdefiniuj funkcję:
def add_values(first, second):
return float(first) + float(second)
g_exportedScripts = (add_values,)
Następnie utwórz podstawowe makro w programie Calc i użyj:
Sub RunPythonHelper()
Dim session As Object
Dim result As Variant
Dim sheet As Object
session = CreateScriptService("Session")
result = session.ExecutePythonScript( _
session.SCRIPTISPERSONAL, _
"calc_tools.py$add_values", _
12, 30)
sheet = ThisComponent.CurrentController.getActiveSheet()
sheet.getCellRangeByName("B1").setValue(result)
End Sub
Uruchom RunPythonHelperz selektora makr Basic. Jeśli wywołanie się powiedzie, B1 powinien wyświetlić 42. Odwołanie do skryptu ma postać module.py$function_name: w przypadku modułu w podfolderze lub innym miejscu przechowywania należy użyć składni i stałej lokalizacji udokumentowanej dla danej wersji ScriptForge. Zachowaj argumenty i zwracaj wartości dla typów danych, które oba języki mogą reprezentować w sposób czytelny, takich jak liczby, ciągi znaków i proste sekwencje.
CreateScriptServiceUdokumentowane pomocniki sesji ScriptForge są dostępne w nowoczesnych wersjach LibreOffice, ale nazwy menu i dołączone komponenty mogą się różnić w starszych kompilacjach lub kompilacjach pakietów dystrybucyjnych. Jeśli ta usługa jest niedostępna, należy użyć udokumentowanej metody dostawcy skryptów UNO w LibreOffice, która pobiera XScriptz URI skryptu i wywołuje go. Unikaj kopiowania fragmentu kodu do innej lokalizacji makra bez zmiany ustawienia lokalizacji.
Czy kod Pythona powinien być osobisty, współdzielony czy osadzony?
| Składowanie | Najlepiej pasuje | Kompromis |
| Moje Makra / profil użytkownika | Własne narzędzia wielokrotnego użytku w różnych dokumentach | Nie jest automatycznie uwzględniane podczas wysyłania arkusza kalkulacyjnego |
| Makra aplikacji | Skrypty zarządzane dla wielu użytkowników w ramach jednej instalacji | Zwykle do instalacji lub konserwacji wymagany jest dostęp administratora |
| Makra dokumentów | Kod przeznaczony do powiązania z jednym dokumentem | Odbiorcy mogą być zobowiązani do zezwalania na makra, testowania przenośności i zachowania bezpieczeństwa w docelowej wersji pakietu LibreOffice |
W przypadku przepływu pracy zespołowej, przed utworzeniem skoroszytu wokół osobistego makra, zdecyduj, w jaki sposób odbiorcy otrzymają i zaufają kodowi. Jeśli logika Pythona musi towarzyszyć arkuszowi kalkulacyjnemu, przetestuj przechowywanie makr i monity bezpieczeństwa dokumentu w tych samych wersjach LibreOffice, z których korzystają odbiorcy. W przypadku wdrażania zarządzanego, administrator może spakować skrypty dla użytkowników lub rozpowszechnić rozszerzenie w ramach standardowych mechanizmów kontroli oprogramowania w organizacji.
Dlaczego makro może zniknąć lub nie działać?
- Brak opcji lub modułu Pythona. W niektórych dystrybucjach GNU/Linux framework skryptowy Pythona LibreOffice jest opcjonalnym pakietem. Sprawdź instrukcje dotyczące pakowania LibreOffice w dystrybucji, jeśli makra Pythona nie pojawiają się w oknie dialogowym makr.
- Skrypt został zapisany w niewłaściwym profilu. LibreOffice może korzystać z wielu profili użytkowników. Sprawdź ścieżkę profilu dla bieżącej instalacji i zapisz moduł w jego
Scripts/pythonkatalogu.
- Funkcja nie jest eksportowana. Dodaj ją do
g_exportedScriptsfunkcji, którą chcesz uruchomić z selektora makr. Upewnij się, że składnia krotki zawiera przecinek na końcu krotki jednoelementowej.
- Skrypt działa poza LibreOffice.
XSCRIPTCONTEXT Istnieje dla makra uruchomionego przez LibreOffice, a nie wtedy, gdy ten sam plik jest uruchamiany poleceniem systemowym python. Użyj programu uruchamiającego makra lub skonfiguruj udokumentowane połączenie UNO.
- Zabezpieczenia makr blokują osadzony kod. Sprawdź ustawienia zabezpieczeń makr w LibreOffice i włączaj kod tylko z zaufanego źródła. Obniżenie globalnego poziomu zabezpieczeń nie jest dobrym sposobem na rozwiązanie problemu.
- Zaimportowany moduł nie widzi kontekstu dokumentu. Dokumenty LibreOffice, które
XSCRIPTCONTEXTnie są przekazywane do zaimportowanych modułów. Przekaż potrzebny obiekt dokumentu lub arkusza do funkcji pomocniczych zamiast oczekiwać, że zaimportowane moduły odczytają ten globalny obiekt.
- Brak widocznego wyjścia konsoli. Standardowe wyjście Pythona nie jest dostępne po uruchomieniu makra z menu Narzędzia > Makra. Aby uzyskać informację zwrotną, zapisz wynik w komórce, skorzystaj z usługi dialogowej LibreOffice lub zaloguj się do wybranej ścieżki pliku.
Jak bezpiecznie zweryfikować wynik?
Przetestuj z kopią arkusza kalkulacyjnego i znanymi danymi wejściowymi. Upewnij się, że makro Pythona pojawia się w programie uruchamiającym, uruchom je raz i porównaj komórkę wyjściową z ręcznie obliczonym wynikiem. W przypadku wywołania z języka Basic do Pythona przetestuj jedno proste dane wejściowe i upewnij się, że zwrócona wartość jest zapisywana w odpowiednim arkuszu. Unikaj rozpoczynania od skryptów, które usuwają arkusze, nadpisują duże zakresy lub wykonują polecenia systemu operacyjnego.
Gdy test się powiedzie, zdecyduj, jak skrypt zostanie zainstalowany na innych komputerach i udokumentuj wszelkie wymagane biblioteki Pythona lub założenia dotyczące wersji LibreOffice. Do makr wewnątrzprocesowych używane jest środowisko Pythona dołączone do LibreOffice; pakiety zainstalowane dla osobnego systemowego interpretera Pythona mogą być dla niego niedostępne. Jeśli potrzebujesz pakietów z innego interpretera, skorzystaj z podejścia external-process/UNO i przemyślanie skonfiguruj to połączenie.
Oficjalne referencje