# -*- coding: utf-8 -*- """ http://www.simplistix.co.uk/presentations/python-excel.pdf """ import xlwt import datetime from django.core.exceptions import ObjectDoesNotExist HEADER_STYLE = xlwt.easyxf('font: bold on') DEFAULT_STYLE = xlwt.easyxf() CELL_STYLE_MAP = ( (datetime.date, xlwt.easyxf(num_format_str='DD/MM/YYYY')), (datetime.time, xlwt.easyxf(num_format_str='HH:MM')), (bool, xlwt.easyxf(num_format_str='BOOLEAN')), ) def multi_getattr(obj, attr, default=None): attributes = attr.split(".") for i in attributes: try: obj = getattr(obj, i) except AttributeError: if default: return default else: return '-' return obj def get_column_cell(obj, name): try: attr = multi_getattr(obj, name) except ObjectDoesNotExist: return '' if hasattr(attr, '_meta'): # A Django Model (related object) return unicode(attr).strip() elif hasattr(attr, 'all'): # A Django queryset (ManyRelatedManager) return ', '.join(unicode(x).strip() for x in attr.all()) return attr def queryset_to_workbook(queryset, columns, report_date = None): # defining styles for different types of cells main_style = xlwt.Style.easyxf( "font: name Calibri, height 600, bold False;" "borders: left thin, right thin, top thin, bottom thin;" "alignment: horizontal left, vertical center, indent 7;" "pattern: pattern solid, fore_colour white;" ) header_style = xlwt.Style.easyxf( 'font: name Calibri, height 400, bold False;' 'borders: left no_line, right no_line, top thin, bottom thin;' 'alignment: horizontal center, shrink_to_fit True;' 'pattern: pattern solid, fore_color gray_ega;', ) odd_style = xlwt.Style.easyxf( 'font: name Calibri, height 300, bold False;' 'borders: left thin, right thin, top thin, bottom thin;' 'alignment: horizontal center, wrap True;' 'pattern: pattern solid, fore_color white;', ) even_style = xlwt.Style.easyxf( 'font: name Calibri, height 300, bold False;' 'borders: left thin, right thin, top thin, bottom thin;' 'alignment: horizontal center, wrap True;' 'pattern: pattern solid, fore_color silver_ega;', ) # creating workbook and adding sheet workbook = xlwt.Workbook() report_date = report_date or datetime.date.today() sheet_name = u'My calendar {0}'.format(report_date.strftime('%Y-%B')) sheet = workbook.add_sheet(sheet_name) # drawing head part with image sheet.write_merge(0, 6, 0, 6, u'Мой календарь собитий на %s года' % report_date.strftime("%B %Y"), main_style) for i in range(7): sheet.row(i).set_style(xlwt.Style.easyxf('font:height 300;')) sheet.insert_bitmap('/home/www/proj/media/logo.bmp', row=0, col=5, x=0, y=0, scale_x=0.3, scale_y=2) # drawing headers header_list = [u'#', u'Название события',u'Даты',u'Краткое описание',u'Место проведения', u'Заметка', u'Ссылка на событие'] for i, column in enumerate(columns): sheet.write(8, i, header_list[i], header_style) sheet.col(i).width = 8000 sheet.col(0).width = 2000 # fill data for x, obj in enumerate(queryset, start=9): for y, column in enumerate(columns): try: value = getattr(obj, column) except: value = "-" if x % 2 == 0: style = even_style else: style = odd_style sheet.write(x, y, value, style) return workbook