2017-10-09 68 views
1

我試圖生成一個在Excel中正確打開但使用StringIO而不是文件的CSV。StringIO生成的包含BOM的csv文件

output = StringIO("\xef\xbb\xbf") # Tried just writing a BOM here, didn't work 
    fieldnames = ['id', 'value'] 
    writer = csv.DictWriter(output, fieldnames, dialect='excel') 
    writer.writeheader() 
    for d in Data.objects.all(): 
     writer.writerow({ 
      'id': d.id, 
      'value': d.value 
     }) 
    response = HttpResponse(output.getvalue(), content_type='text/csv') 
    response['Content-Disposition'] = 'attachment; filename=data.csv') 
    return response 

這是一個Django視圖的一部分,所以我真的不想進入傾出臨時文件此業務。

我也試過如下:

response = HttpResponse(output.getvalue().encode('utf-8').decode('utf-8-sig'), content_type='text/csv') 

沒有運氣

我能做些什麼,以獲得utf-8-sig正確編碼輸出文件,以BOM,使Excel將打開文件並正確顯示多字節Unicode字符?

回答

2

HttpResponse接受bytes

output = StringIO() 
... 
response = HttpResponse(output.getvalue().encode('utf-8-sig'), content_type='text/csv') 

,或者讓Django的做編碼:

response = HttpResponse(output.getvalue(), content_type='text/csv; charset=utf-8-sig')