
生成一个 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 虽然 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. |