【问题标题】:Django csv output in ExcelExcel中的Django csv输出
【发布时间】:2012-05-27 16:48:32
【问题描述】:

您好,我有一个简单的视图,它返回一个查询集的 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”。

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

非常感谢任何帮助。

【问题讨论】:

    标签: django csv utf-8


    【解决方案1】:

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

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

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

    还有一个similar post

    【讨论】:

    • 我尝试了几种不同的编码。 cp1250 与其他人一样产生以下错误:'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)
    • 您能否将结果(2 行)渲染到变量并在此处发布,以便我尝试?
    • 这里是前两行的简化“.values_list”:[(u'Abutilon depauperatum', u'Espa\xf1ola'), (u'Abutilon depauperatum', u'Espa\xf1ola')]
    • 您的 windows 代码页 cp1252 是哪个?导出为 utf-8 并使用 iconv:iconv -f utf-8 -t cp1252 a.csv > b.csv
    • 对不起,你得再解释一下。
    【解决方案2】:

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

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

      import unicodecsv as csv
      

    【讨论】:

      【解决方案3】:

      我发现 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-04
        • 1970-01-01
        相关资源
        最近更新 更多