Arkusze i xlwt


22 lipca 2015


Przykład użycia biblioteki xlwt (scalanie, zwijanie wierszy, zamrażanie wierszy i kolumn, zmiana stylu komórki)

Podczas realizacji jednego z projektów musiałem generować plik Excela. Nie byłoby w tym nic dziwnego gdyby nie fakt, że arkusz miał być kolorowany, wiersze scalone, zwijane a niektóre kolumny zamrożone. 
Wykorzystałem bibliotekę xlwt (https://pypi.python.org/pypi/xlwt), która w pełni pomogła mi zrealizować wszystkie wymagania.
Poniżej dodaję przykładowy kod, który realizuje opisane funkcjonalności.

Po instalacji xlwt proponuję obejrzeć przykłady (w katalogu zainstalowanej biblioteki), które prezentują inne możliwości tej biblioteki.

# -*- coding: utf-8 -*-
#import biblioteki
import xlwt

#zestaw danych do arkusza 
xls_data={'artists': [{'artist': 'The Prodigy', 
                       'albums':[
                           {'title': 'The Day Is My Enemy', 'year':'2015', 
                            'tracks':["Nasty",]},
                           {'title': 'Invaders Must Die', 'year':'2009',
                            'tracks':["Invaders Must Die","Omen",]},
                           {'title': 'The Fat Of The Land ', 'year':'1997', 
                            'tracks':["Breathe","Firestarter",]}]},
                      {'artist': 'The Chemical Brothers', 
                       'albums':[
                           {'title': 'Born In The Echoes', 'year':'2015',
                            'tracks':["Go","EML Ritual",]},
                           {'title': 'Further','year':'2010',
                            'tracks':["Horse Power","Snow", ]},
                           {'title': 'Surrender', 'year':'1999',
                            'tracks': ["Out of Control","Hey Boy Hey Girl",]},
                           {'title': 'Dig Your Own Hole','year':'1997',
                            'tracks': ["Block Rockin' Beats","Elektrobank","Setting Sun",]}]
                      }],
           }


#utworzenie obszaru roboczego
wb = xlwt.Workbook(encoding="utf-8")
#utworzenie arkusza z możliwością edycji (będzie można nadpisać zawartość danej komórki)
ws = wb.add_sheet('Artists Sheet', cell_overwrite_ok=True)
#ustawienie styli dla komórek (wiersza bedącego nagłówkiem oraz pozostałych wierszy)
normal_cell_style = xlwt.easyxf('align: horiz center; align: vert center;')
header_style = xlwt.easyxf('font: bold 1, name Tahoma; align: horiz center;')
artist_style = xlwt.easyxf('pattern: pattern solid, fore_colour gray25;')
track_style = xlwt.easyxf('pattern: pattern solid, fore_colour light_blue;')

#tytuły dla pól w nagłówku
header = ['year', 'title', 'tracks']

#index pierwszego wiersza    
row_idx = 0

#utworzenie nagłówka
for idx, field in enumerate(header):  
        ws.write(row_idx, idx, field, header_style)
        
#tablica będzie zawierała informacje o indeksach wierszy, w których zapisano dane o albumach        
album_rows = []

row_idx = row_idx + 1
max_cols = 0        
        
for idx, artist_data in enumerate(xls_data['artists']):
    #zapis informacji o artyście oraz połączenie 2 komórek w wierszu
    ws.write_merge(row_idx, row_idx,0,len(header)-2, artist_data['artist'], artist_style)
    
    row_idx = row_idx + 1
    
    for x, album in enumerate(artist_data['albums']):
        album_rows.append(row_idx)
        #zapis informacji o albumie
        ws.write(row_idx, 0, album['year'], normal_cell_style)
        ws.write(row_idx, 1, album['title'], normal_cell_style)
        
        #zapis informacji o utworach
        tracks_col = 2
        for track in album['tracks']:
            ws.write(row_idx, tracks_col, track, track_style)
            tracks_col = tracks_col + 1
            if tracks_col > max_cols:
                max_cols = tracks_col
        
        row_idx = row_idx + 1

            
#"zamrożenie" nagłówka oraz dwóch kolumn (podczas przewijania arkusza pozostaną na swoim miejscu)
ws.set_horz_split_pos(1)
ws.set_vert_split_pos(2)
ws.set_panes_frozen(True)

#ustawienie szerokości dla column
for i in range(max_cols):
    ws.col(i).width = 256*25
    
#ukrywanie wierszy oraz określenie poziomu dla rozwijania wierszy 
for row in album_rows:
    ws.row(row).hidden = 1
    ws.row(row).level = 1
    ws.row(row).collapse = 1
    
#zapis do pliku    
wb.save('example.xls')

Co zawiera blog?

Na blogu umieszczam wpisy dotyczące mojej pracy, zainteresowań. Głowna tematyka to programowanie oraz recenzje płyt oraz książek.

Django REST framework and AngularJS


Tutorial prezentujący wykorzystanie Django REST framework oraz AngularJS. Repozytorium dostępne ...

Boards Of Canada - Music Has The Right ...


Jedna z najważniejszych płyt IMD, ambient, downtempo

ACL


Rozszerzone uprawnienia w systemie plików.

Efektywny Python. 59 sposobów na lepszy kod


Czy warto sięgnąć po książkę Bretta Slatkina i poznać sposoby ...

Odrzucone pokolenie


Fotografia: Copyright 1995 XL Records.
Czasami mam dosyć wpółczesnej muzyki ...

Domena, zmiany i plany


Nowy rok już niedługo. Aby dobrze go rozpocząć warto pewne ...