Django CSV 标头和行格式问题
我正在尝试创建一个可以下载的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
你会发现,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})