Django csv在Excel中输出

时间:2012-05-27 16:48:33

标签: django csv utf-8

您好我有一个简单的视图,它返回一个查询集的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方法来校正输出。

任何帮助都非常感激。

3 个答案:

答案 0 :(得分:0)

对于所有版本的Excel,似乎没有统一的解决方案。

  1. 你最好的选择是跟openpyxl一起去,但这是相当复杂和需要的 单独处理excel用户的下载并非最佳。

  2. 尝试在文件的beginnign(0xEF,0xBB,0xBF)添加字节顺序标记。请参阅microsoft-excel-mangles-diacritics-in-csv-files

  3. 还有另一个similar post

答案 1 :(得分:0)

你可以给python-unicodecsv一个。它取代了python csv模块,它不能优雅地处理Unicode。

  1. 将unicodecsv文件夹设置为somewewere,您可以将其导入或通过setup.py
  2. 安装
  3. 将其导入您的视图文件,例如:

    import unicodecsv as csv
    

答案 2 :(得分:0)

我发现Excel有3种方法可以正确打开Unicode csv文件:

  1. 使用utf-16-le字符集
  2. 在导出文件的开头插入utf-16字节顺序标记
  3. 在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