Wrocław, 25.05.2017 Technologie informacyjne: Excel i Python Wydział Matematyki Politechniki Wrocławskiej Andrzej Giniewicz
Dzisiaj na zajęciach... Makra w pakiecie Excel, część 2: język Python. 1/30
Biblioteka xlwings Biblioteka xlwings 2/30
Jak zdobyć? Najłatwiej korzystając z dystrybucji Pythona o nazwie Anaconda: https://www.anaconda.com/download/ Szczególnie polecam aktualizację wersji do Anaconda 5.1 dla Pythona 3.6. Biblioteka xlwings 3/30
Dlaczego Anaconda? posiada graficzną aplikację do uruchamiania różnych narzędzi (na przykład Jupyter Notebook i Spyder) oraz wirtualnymi środowiskami (każdy projekt może mieć swoje własne wersje zależności, nieprzeszkadzając pozostałym aplikacjom), posiada skompilowaną wersję xlwings 0.11.8, która dostarcza funkcjonalności wykorzystywanej na zajęciach, do obliczeń wykorzystuje bibliotekę Intel MKL nawet kilkadziesiąt razy przyśpieszającą niektóre obliczenia (źródło: https://dpinte.wordpress.com/2010/03/ 16/numpymkl-vs-matlab-performance/), działa na wszystkich głównych systemach operacyjnych. Biblioteka xlwings 4/30
Pobieranie xlwings Po instalacji dystrybucji Anaconda uruchamiamy Anaconda Command Prompt i wpisujemy conda install xlwings lub uruchamiamy Anaconda Navigator i na liście dostępnych pakietów odnajdujemy xlwings i klikamy zainstaluj. Jeśli ścieżki i środowisko są standardowe, xlwings zainstaluje się do C:\Anaconda\libs\site-packages\xlwings Biblioteka xlwings 5/30
Aktywowanie makr Pythona w Excel Załóżmy, że makro mamy zapisane w pliku makro.py i chcemy uruchomić w nim funkcję moje_makro. Jak to zrobić? 1. Aktywujemy kartę Deweloper (klikamy kartę Plik, potem Opcje, Dostosowanie wstążki w obszarze Karty główne zaznaczamy Deweloper). 2. Na karcie Deweloper klikamy Visual Basic, co otwiera edytor makr. 3. W edytorze wybieramy kolejno File oraz Import File..., po czym wskazujemy na plik xlwings.bas znajdujący się w katalogu instalacji xlwings (domyślnie C:\Anaconda\libs\site-packages\xlwings\xlwings.bas). 4. W edytorze makr klikamy Insert oraz Module. Biblioteka xlwings 6/30
Błędy? To była jedyna metoda do wersji 0.10.x. Od wersji 0.11.0 do 0.11.7 została zastąpiona inną metodą, ale w wersji 0.11.8 (13 maja 2018) znów działa dodawania xlwings.bas, więc jest to metoda najbardziej uniwersalna. Biblioteka xlwings 7/30
Po nowemu W Anaconda Command Prompt powinna być dostępna komenda xlwings. Tą komendą możemy: stworzyć pusty plik na projekt ze wszystkim przygotowanym (stara metoda) xlwings quickstart nazwa -s stworzyć pusty plik na projekt ze wszystkim przygotowanym (nowa metoda) xlwings quickstart nazwa -s zainstalować lub zaktualizować dodatek do excela xlwings addin install/update/remove/status Biblioteka xlwings 8/30
Uruchamianie makra W miejsce kodu wklejamy Sub MojeMakro() RunPython("import makro; makro.moje_makro()") End Sub Wszystko zapisujemy, zamykamy edytor makr i następnie zapisujemy dokument jako plik z rozszerzeniem xlsm (Excel z obsługą makr). Biblioteka xlwings 9/30
Uruchamianie makra W miejsce kodu wklejamy Sub MojeMakro() RunPython("import makro; makro.moje_makro()") End Sub Wszystko zapisujemy, zamykamy edytor makr i następnie zapisujemy dokument jako plik z rozszerzeniem xlsm (Excel z obsługą makr). Aby uruchomić makro, klikamy na przycisk Makra w zakładce Deweloper, następnie z listy dostępnych makr wybieramy to zadanej nazwie (na przykład MojeMakro). Biblioteka xlwings 9/30
Uwagi Excel jest bardzo mocno skojarzony z VBA trzeba stworzyć makro VBA, które jest pośrednikiem i uruchamia funkcję RunPython. Plik Pythona oraz dane Excela powinny być w tym samym katalogu. Można to objeść: 1. instalując moduł Pythona w środowisku (do odpowiedniego katalogu site-packages), 2. ustawiając zmienną sys.path (dodając ścieżkę do pliku.py), 3. wklejając zawartość pliku jako napis do funkcji RunPython. Wersja pliku xlwings.bas musi odpowiadać wersji biblioteki xlwings zainstalowanej w systemie. Biblioteka xlwings 10/30
Co gdy nie odpowiada? Może się tak stać na przykład w przykładach z listy zadań. Jeśli xlwings.bas nie odpowiada wersji biblioteki, otwieramy excela, usuwamy moduł i dodajemy nowy. Reszta powinna zostać bez zmian. Biblioteka xlwings 11/30
Domyślne środowisko Domyślnie xlwings zapisuje log w katalogu %APPDATA%\xlwings_log.txt. Istnieje możliwość ustawienia tej oraz innych opcji. Więcej informacji w dokumentacji: http://docs.xlwings.org/en/stable/vba.html. Biblioteka xlwings 12/30
Podstawy Istnieją trzy możliwości komunikacji: 1. wywoływanie Excela z poziomu Pythona, 2. wywoływanie Pythona z poziomu Excela, 3. tworzenie funkcji użytkownika (formuł). Biblioteka xlwings 13/30
Podstawy Istnieją trzy możliwości komunikacji: 1. wywoływanie Excela z poziomu Pythona, 2. wywoływanie Pythona z poziomu Excela, 3. tworzenie funkcji użytkownika (formuł). Na początku skryptu umieszczamy import: import xlwings as xw from xlwings import Book, Sheet, Range Biblioteka xlwings 13/30
Nawiązanie połączenia Nawiązywanie połączenia odbywa się poprzez użycie klasy Book Biblioteka xlwings 14/30
Nawiązanie połączenia Nawiązywanie połączenia odbywa się poprzez użycie klasy Book: Book() tworzy nowy skoroszyt, Book( Zeszyt1 ) łączy się z istniejącym, otwartym, niezapisanym skoroszytem, Book( plik.xlsx ) łączy się z istniejącym, otwartym, zapisanym skoroszytem, Book(r ścieżka ) łączy się z istniejącym, nieotwartym, zapisanym skoroszytem, Book.caller() łączy się ze skoroszytem, który uruchomił funkcję lub makro. Biblioteka xlwings 14/30
Nawiązanie połączenia Nawiązywanie połączenia odbywa się poprzez użycie klasy Book: Book() tworzy nowy skoroszyt, Book( Zeszyt1 ) łączy się z istniejącym, otwartym, niezapisanym skoroszytem, Book( plik.xlsx ) łączy się z istniejącym, otwartym, zapisanym skoroszytem, Book(r ścieżka ) łączy się z istniejącym, nieotwartym, zapisanym skoroszytem, Book.caller() łączy się ze skoroszytem, który uruchomił funkcję lub makro. Do tworzenia formuł używamy dekoratora func, podając go przed nazwą funkcji. Biblioteka xlwings 14/30
Typowe makro Excel->Python import xlwings as xw from xlwings import Book def nazwa ( ) : wb = Book. c a l l e r ( ) # kod Biblioteka xlwings 15/30
Typowe makro Python->Excel import xlwings as xw from xlwings import Book wb = Book ( " p l i k " ) # kod Biblioteka xlwings 16/30
Typowe makro Formuła import xlwings as xw from xlwings import Book @xw. func def nazwa ( argumenty ) : # kod return wynik Biblioteka xlwings 17/30
Arkusze Do operacji na arkuszach służy klasa Sheet, dostępna pod wb.sheets. wb.sheets zwraca listę wszystkich arkuszy, wb.sheets.add( nazwa ) tworzy nowy arkusz. wb.sheets["nazwa"] wybiera arkusz o zadanej nazwie, wb.sheets[1] wybiera arkusz o zadanym numerze, Sheet(...).activate() aktywuje arkusz, Sheet(...).delete() kasuje arkusz (zgłasza wyjątek, gdy arkusz nie istnieje), Sheet(...).name pozwala sprawdzić lub ustawić nazwę, Sheet(...).clear() czyście zawartość i formatowanie arkusza, Biblioteka xlwings 18/30
Zakresy Do operacji na zakresach służy klasa Range, dla konkretnego arkusza sheet. Range( A1 ) wybiera komórkę A1 aktywnego arkusza, Range((1, 1)) wybiera komórkę A1 aktywnego arkusza, Range( A1:C5 ) wybiera zakres aktywnego arkusza, Range((1, 1), (3, 5)) wybiera zakres aktywnego arkusza, sheet.range( A1 ) wybiera komórkę A1 arkusza, sheet.range((1, 1)) wybiera komórkę A1 arkusza, sheet.range( A1:C5 ) wybiera zakres arkusza, sheet.range((1, 1), (3, 5)) wybiera zakres arkusza, zakres.current_region pozwala rozszerzyć zaznaczenie. Biblioteka xlwings 19/30
Co z zakresem? Z zakresu możemy wyciągnąć lub wstawić dane: zakres.value wyciąga wartości, zakres.value = x podstawia wartości. Domyślnie, xlwings wydobywa: float dla komórek liczbowych, str dla komórek tekstowych, datetime dla komórek z datą, None dla komórek pustych, listę dla wiersza, listę list dla kolumny lub tabeli. Biblioteka xlwings 20/30
Sterowanie konwersją Dla zakresów: Range (... ). options ( opcje konwersji ). value Dla argumentów funkcji i wartości zwracanych: @xw. func @xw. arg ( x, opcje d l a argumentu x ) @xw. arg ( y, opcje d l a argumentu y ) @xw. r e t ( opcje d l a return ) def dodaj ( x, y ) : return x + y Biblioteka xlwings 21/30
Przydatne opcje numbers=int traktuj liczbę jako całkowitą, dates=datetime.date używaj date zamiast datetime, empty= NA używaj NA zamiast None jako wartości puste, transpose=true transponuj dane dict potraktuj 2 kolumny lub 2 wiersze jako party klucz-wartość, np.array zwróć tablicę NumPy zamiast list, pd.series zwróć szereg Pandas zamiast list, pd.dataframe zwróć ramkę danych Pandas zamiast listy list. Więcej o konwersji w dokumentacji: http://docs.xlwings.org/en/stable/converters.html. Biblioteka xlwings 22/30
Rysunki Istnieje możliwość tworzenia rysunków za pośrednictwem biblioteki Matplotlib (http://matplotlib.org/gallery.html). import m a t p l o t l i b. pyplot as p l t from xlwings import Book f i g u r e = p l t. f i g u r e ( ) # kod : wstaw rysunek do a k t u a l n e g o okna M a t p l o t l i b sheet = Book ( ). sheets [ 0 ] sheet. p i c t u r e s. add ( f i g, name=" MojWykres ", update=true ) Biblioteka xlwings 23/30
Sporo więcej Na przykład możemy z poziomu Pythona wywołać makro VBA, mamy narzędzia do zarządzania środowiskiem, dzięki py2exe możemy zamknąć Pythona razem z potrzebnymi bibliotekami w jednym pliku wykonywalnym (w celu dystrybucji),... Biblioteka xlwings 24/30
Sporo więcej Na przykład możemy z poziomu Pythona wywołać makro VBA, mamy narzędzia do zarządzania środowiskiem, dzięki py2exe możemy zamknąć Pythona razem z potrzebnymi bibliotekami w jednym pliku wykonywalnym (w celu dystrybucji),... Więcej informacji można znaleźć na stronie http://xlwings.org/. Biblioteka xlwings 24/30
Analiza kodu makra from datetime import datetime from xlwings import Book def c l e a r _ d a t a ( ) : sheet_name = " K l i e n t " output = " KlientC " wb = Book. c a l l e r ( ) t r y : wb. sheets [ output ]. detele ( ) except : pass wb. sheets. add ( output, a f t e r =sheet_name ) sheet = wb. sheets. a c t i v e #... Biblioteka xlwings 25/30
Analiza kodu makra #... t a b l e = wb. sheets [ sheet_name ]. range ( A1 ). c u r r e n t _ r e g i o n [ names, dates, i d s ] = t a b l e. options ( transpose=true ). value names = names [ 1 : ] dates = dates [ 1 : ] i d s = i d s [ 1 : ] #... Biblioteka xlwings 26/30
Analiza kodu makra #... f i r s t n a m e s = [ ] surnames = [ ] for data i n names : p a r t s = [ part. c a p i t a l i z e ( ) for part i n data. s p l i t ( " " ) i f part ] f i r s t n a m e s. append ( " ". j o i n ( p a r t s [ : 1 ] ) ) surnames. append ( p a r t s [ 1]) dates = [ datetime. s t r p t i m e ( data, %d %m %Y ) for data i n dates ] #... Biblioteka xlwings 27/30
Analiza kodu makra #... Range ( output, A1 : D1 ). value = [ " Imie ", " Nazwisko ", " Data ", "Numer" ] sheet. range ( A1 : D1 ). c o l o r = (150, 150, 150) sheet. range ( A2 ). options ( transpose=true ). value = \ f i r s t n a m e s sheet. range ( B2 ). options ( transpose=true ). value = \ surnames sheet. range ( C2 ). options ( transpose=true ). value = \ dates sheet. range ( D2 ). options ( transpose=true ). value = \ i d s sheet. range ( A1 ). c u r r e n t _ r e g i o n. a u t o f i t ( ) Biblioteka xlwings 28/30
W następnym odcinku... Niespodzianka? :) Biblioteka xlwings 29/30
Pytania? Biblioteka xlwings 30/30