Ошибка типа для DateField - библиотека Django XLWT - PullRequest
0 голосов
/ 07 февраля 2019

Я использую библиотеку xlwt для экспорта данных в формате Excel.Когда я добавляю company_created в value_list моего набора запросов, я получаю сообщение об ошибке -

Ошибка TypeEr в / company / csv / не может вычесть наивные даты со смещением и со смещением

company_created - это поле даты в модели.

import xlwt

from django.http import HttpResponse
from django.contrib.auth.models import User

def GenerateCompanyCSV(request):
    response = HttpResponse(content_type='application/ms-excel')
    response['Content-Disposition'] = 'attachment; filename="users.xls"'

    wb = xlwt.Workbook(encoding='utf-8')
    ws = wb.add_sheet('Users')

    # Sheet header, first row
    row_num = 0

    font_style = xlwt.XFStyle()
    font_style.font.bold = True

    columns = ['Company Name', 'Company Email', 'Count of people','Created Date', 'Current Monthly Payment', 'Is TABopts Customer', 'Status', ]

    for col_num in range(len(columns)):
        ws.write(row_num, col_num, columns[col_num], font_style)

    # Sheet body, remaining rows
    font_style = xlwt.XFStyle()

    rows = Company.objects.exclude(id=1).exclude(
                    company_is_deleted=True
                ).annotate(
                    number_of_company_users=Count('userprofile')
                ).values_list(
                    'company_name', 
                    'company_email', 
                    'number_of_company_users',
                    'company_created',
                    'company_monthly_payment', 
                    'company_tab_opts',
                    'company_status',

                )
    for row in rows:
        row_num += 1
        for col_num in range(len(row)):
            ws.write(row_num, col_num, row[col_num], font_style)

    wb.save(response)
    return response

1 Ответ

0 голосов
/ 07 февраля 2019

Я нашел взлом, и это мое решение: измените цикл for, если у вас есть поле даты.

date_format = xlwt.XFStyle()
date_format.num_format_str = 'dd/mm/yyyy'

for row in rows:
        row_num += 1
        print('row_num', row_num)
        for col_num in range(len(row)):

            if isinstance(row[col_num], datetime.date):
                 ws.write(row_num, col_num, row[col_num].replace(tzinfo=None), font_style)
            else:
                ws.write(row_num, col_num, row[col_num], font_style)
...