【问题标题】:Create csv file using django and directly open into Excel使用 django 创建 csv 文件并直接在 Excel 中打开
【发布时间】:2012-10-09 19:43:46
【问题描述】:

我已经通过 django 创建了 csv 文件。我已将编码数据写入其中。但是当我在 excel 表中打开这个文件时,unicode 字符无法正确显示。

我也参考了这个问题 Django create CSV file that contains Unicode and can be opened directly with Excel

但没有得到正确的答案。我已经尝试了所有的答案,但没有一个成功。

我写的代码如下。

    def exportcsv(request):
        import csv
        producer_list = Producer.objects.filter()
        response = HttpResponse(mimetype='text/csv')
        response['Content-Disposition'] = 'attachment; filename=producer.csv'
        writer = csv.writer(response, delimiter=",")
        writer.writerow(codecs.BOM_UTF16_LE)
        writer.writerow(['Produsenter','Type','Land','Region'])
        for cdst in producer_list:
            writer.writerow([cdst.title.encode("UTF-8"),
                            cdst.producer_type.encode("UTF-8"),
                            cdst.country.country.encode("UTF-8"),
                            cdst.region.region.encode("UTF-8")])
        return response

然后正确创建了 csv 文件,但其中的字符未正确编码。 该字符将显示为“Tokaj Hétszölö”。

当我尝试时

writer.writerow([cdst.title.encode("iso-8859-1"),
                            cdst.producer_type.encode("iso-8859-1"),
                            cdst.country.country.encode("iso-8859-1"),
                            cdst.region.region.encode("iso-8859-1")])

然后我们将正确添加的数据也正确打开它的excel文件。 但它会给字符串中的某些字符(如 'æ' 和 ' )报错。

错误:“latin-1”编解码器无法对位置 266 中的字符 u'\u2013' 进行编码:序数不在范围内 (256)

我也试试下面的代码。

response['Content-Disposition'] = 'attachment; filename=producer.csv'
response.write(u'\ufeff'.encode('utf8'))
writer = csv.writer(response, delimiter=",")

也试试

writer.writerow(codecs.BOM_UTF16_LE)
writer.writerow(str.decode('utf8').encode('utf_16_le'))

【问题讨论】:

  • 虽然这不是一个真正的答案,但您应该尝试允许导出 xls 的 tablib。

标签: django excel csv unicode


【解决方案1】:

你应该看看unicodecsv。它为我解决了类似的麻烦。

【讨论】:

    【解决方案2】:

    我已经解决了上述问题。我写的代码如下。

    writer.writerow([cdst.title.encode("iso-8859-1"),
                     cdst.producer_type.encode("iso-8859-1"),
                     cdst.country.country.encode("iso-8859-1"),
                     cdst.region.region.encode("iso-8859-1")])
    

    使用上面的代码我得到了错误

    Error: 'latin-1' codec can't encode character u'\u2013' in position 266: ordinal not in range(256)
    

    但是这个错误是因为空字符串和'-'字符当我传递给编码时。当我在将字符串传递给编码之前设置条件并将“-”字符替换为“_”时,可以解决此问题。

    【讨论】:

      猜你喜欢
      • 2012-06-06
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 2016-01-28
      • 2013-05-12
      相关资源
      最近更新 更多