生成一个 csv 字符串返回给用户下载,用 excel 打开。
# string 个数动态
csv_file = string_1 + ',' + string_2 + ',' + string_3 + ... + '\n'
response = Response(cvs_file, mimetype='text/csv', headers={'Content-disposition': 'attachment; filename=file_name+'.csv'})
return response
当前遇到的问题是当 string 中有逗号是,逗号后的字符会被当成下一列的内容。每个 string 都加双引号的话没有逗号的 string 在 excel 会显示引号。怎么才能每个 string 在各自的列呢?
当 string 里有中文时, excel 打开会有乱码,转成 utf-8 也没用。
格式的问题解决了。
import csv, cStringIO
data = [
['c1', 'c2', 'c3'],
['1', '2', '3'],
['1,1', '2,2', '3,3']
]
csv_str = cStringIO.StringIO()
write = csv.writer(csv_str, dialect='excel')
for d in data:
write.writerow(d)
csv文件在mac下的microsoft excel打开中文是乱码,textedit打开没问题。
1
raptium 2016-06-07 22:49:07 +08:00 1
虽然 csv 格式比较简单,但是……既然标准库里有 csv 模块,还是可以用一下的吧?
Excel 认 UTF-8 格式的文件似乎要 BOM 头才行,这个不确定了,我生成的直接打开从来都是乱码的…… |
2
korvin 2016-06-08 00:20:01 +08:00
我之前用 GBK 编码在 windows 和 mac 的 micsoft office 上没有乱码,在 centos 的 LibreOffice 下乱码。
|
3
dyniao 2016-06-08 08:52:50 +08:00
据说不含 BOM 的 UTF-8 才是标准形式,在 UTF-8 文件中放置 BOM 主要是微软的习惯, UTF-8 和 带 BOM 的 UTF-8 的区别就是有没有 BOM 。即文件开头有没有 U+FEFF 。编译成 base64 则为 77u/。
我的问题是这么解决的,生成的时候在 base64 ,后边添加 77u/这几个字符。 `data:application/vnd.csv;base64,5YWs5Y+46YOo6...` ↓ `data:application/vnd.csv;base64,77u/5YWs5Y+46YOo6...` |
4
Neveroldmilk 2016-06-08 09:23:06 +08:00
我记得 excel 需要设定编码类型的,否则用默认的系统编码打开照样是乱码。
|
5
Neveroldmilk 2016-06-08 09:23:33 +08:00
@korvin CentOS 默认是 en UTF-8 或者 zh UTF-8.
|