您好我有一个简单的视图,它返回一个查询集的csv文件,该文件是使用utf-8编码从mysql数据库生成的:
def export_csv(request):
...
response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename=search_results.csv'
writer = csv.writer(response, dialect=csv.excel)
for item in query_set:
writer.writerow(smart_str(item))
return response
return render(request, 'search_results.html', context)
这可以作为CSV文件使用,可以在文本编辑器,LibreOffice等中打开而不会出现问题。
但是,我需要提供一个可以在Windows中的MS Excel中打开而没有错误的文件。如果我在查询集中有拉丁字符的字符串,例如'Española',则Excel中的输出为'Española'。
我试过这个blogpost,但没有用。我也知道xlwt package,但我很好奇是否有一种方法可以使用我目前的CSV方法来校正输出。
任何帮助都非常感激。
答案 0 :(得分:0)
对于所有版本的Excel,似乎没有统一的解决方案。
你最好的选择是跟openpyxl一起去,但这是相当复杂和需要的 单独处理excel用户的下载并非最佳。
尝试在文件的beginnign(0xEF,0xBB,0xBF)添加字节顺序标记。请参阅microsoft-excel-mangles-diacritics-in-csv-files
还有另一个similar post。
答案 1 :(得分:0)
你可以给python-unicodecsv
一个。它取代了python csv
模块,它不能优雅地处理Unicode。
将其导入您的视图文件,例如:
import unicodecsv as csv
答案 2 :(得分:0)
我发现Excel有3种方法可以正确打开Unicode csv文件:
因此,这应该使其能够在Python 3.7和Django 2.2中工作
import codecs
...
def export_csv(request):
...
response = HttpResponse(content_type='text/csv', charset='utf-16-le')
response['Content-Disposition'] = 'attachment; filename=search_results.csv'
response.write(codecs.BOM_UTF16_LE)
writer = csv.writer(response, dialect='excel-tab')
for item in query_set:
writer.writerow(smart_str(item))
return response