Заголовок django csv и проблема формата строки - PullRequest
0 голосов
/ 07 марта 2011

Я пытаюсь создать загрузку в формате csv, но результат загрузки выдает меня в другом формате

def csv_download(request):
    import csv
    import calendar
    from datetime import *
    from dateutil.relativedelta import relativedelta

    now=datetime.today()
    month = datetime.today().month
    d = calendar.mdays[month]

    # Create the HttpResponse object with the appropriate CSV header.
    response = HttpResponse(mimetype='text/csv')
    response['Content-Disposition'] = 'attachment; filename=somefilename.csv'
    m=Product.objects.filter(product_sellar = 'jhon')
    writer = csv.writer(response)
    writer.writerow(['S.No'])
    writer.writerow(['product_name'])
    writer.writerow(['product_buyer'])
    for i in xrange(1,d):

       writer.writerow(str(i) + "\t")



    for f in m:
         writer.writerow([f.product_name,f.porudct_buyer])

    return response

Вывод вышеуказанного кода:

product_name
1
2
4
5
6
7
8
9
1|10
1|1
1|2
.
.
.
2|7


mgm | x_name
wge | y_name

Я выгляжу как положено

s.no   porduct_name product_buyser  1     2   3   4   5   6   7   8 9 10 .....27 total
  1   mgm            x_name         2      3      8                                13
  2  wge             y_name                   4       9                            13

Можете ли вы помочь мне с загрузкой CSV выше?если возможно, подскажите, пожалуйста, как суммировать все итоговые данные отдельных пользователей на конец?

Пример:

у нас есть таблица продаж, в которую каждый день будет добавляться информация о продавце

данные таблицы выглядят так:

 S.no product_name product_seller sold Date
  1     paint        jhon           5   2011-03-01
  2     paint        simth          6   2011-03-02 

Я создал таблицу, в которой она отображается в формате ниже, и я пытаюсь создать загрузку CSV

s.no prod_name   prod_sellar 1-03-2011  2-03-2011   3-03-2011   4-03-2011 total
    1     paint         john       10        15               0               0     25
    2     paint         smith      2          6               2               0     10

1 Ответ

0 голосов
/ 07 марта 2011

Пожалуйста, прочитайте документацию к CSV-модулю , в частности, API объекта записи .

Вы заметите, что объект csv.writer занимает список с элементами, представляющими их положение в строке с разделителями. Таким образом, чтобы получить желаемый результат, вам нужно передать следующий список:

writer = csv.writer(response)
writer.writerow(['S.No', 'product_name', 'product_buyer'] + range(1, d) + ['total'])

Это даст вам желаемый вывод заголовка.

Возможно, вы захотите изучить класс csv.DictWriter , если хотите заполнить только некоторые части строки. Это намного чище. Вот как бы вы это сделали:

writer = csv.DictWriter(response, 
                        ['S.No', 'product_name', 'product_buyer'] + range(1, d) + ['total'])

Тогда, когда ваша команда записи будет выглядеть так:

for f in m:
    writer.writerow({'product_name': f.product_name, 'product_buyer': f.product_buyer})
...