Arkusze i xlwt


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

Inne wpisy


Aplikacje hybrydowe

aktualności firmowe

ReportLab PDF

wpisy zespołu