1

您好我有一个简单的视图,它返回一个查询集的 csv 文件,该文件是使用 utf-8 编码从 mysql db 生成的:

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”。

我试过这篇博文,但没有帮助。我也知道xlwt 包,但我很好奇是否有一种方法可以使用我目前拥有的 CSV 方法来纠正输出。

非常感谢任何帮助。

4

3 回答 3

0

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

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

    import unicodecsv as csv
    
于 2012-05-29T09:39:46.263 回答
0

看起来所有版本的 Excel 都没有统一的解决方案。

  1. 您最好的选择是使用openpyxl,但这相当复杂,并且需要单独处理 excel 用户的下载,这不是最佳选择。

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

还有另一个类似的帖子

于 2012-05-27T17:01:08.127 回答
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
于 2019-10-01T06:40:04.573 回答