文档章节

blob 导出csv 用execl打开出现乱码

黑魔法
 黑魔法
发布于 2016/12/07 11:26
字数 1230
阅读 524
收藏 0
点赞 0
评论 0

解决方式,在传入blob的字符前加”\uFEFF”;,具体代码如下

ExcellentExport.js的方法,利用base64下载文件。支持chrome ,opera,firefox. 于是决定拿来为我所用!

说明一下,这个js的好处是:一句js脚本,就能前台下载,完全无须后台。

但外国人不了解中文的csv用excel打开直接乱码。 但用记事本打开,再直接保存,或另存为ansi都可以让中文不乱码。

js里默认应该是utf-8,昨天试了用utf-8转gb2312,失败了!

于是找到这个:

utf-8保存的csv格式要让Excel正常打开的话,必须加入在文件最前面加入BOM(Byte order mark),具体楼主你可以搜索一下关于BOM的介绍。

ANSI的话是可以做到正常显示和保存,但是这是有前提的,就是必须在你的电脑(区域和语言设置)把对非Unicode字符处理设置为Chinese,如果是English的话,显示照样是乱码。

Unicode的csv,Excel就根本不支持,打开虽然可以显示不乱码,但是已经不是按逗号显示在不同的单元格里面了,而是按行显示在第一个单元格里面。     

再找到这个:

什么是BOM 
    BOM(byte-order mark),即字节顺序标记,它是插入到以UTF-8、UTF16或UTF-32编码Unicode文件开头的特殊标记,用来识别Unicode文件的编码类型。具体编码如下表:
BOM                  Encoding  
EF BB BF         UTF-8 
FE FF                UTF-16 (big-endian) 
FF FE                UTF-16 (little-endian) 
00 00 FE FF     UTF-32 (big-endian) 
FF FE 00 00     UTF-32 (little-endian)

   微软建议所有的 Unicode 文件应该以 ZERO WIDTH NOBREAK SPACE(U+FEFF)字符开头。这作为一个“特征符”来识别文件中使用的编码和字节顺序。BOM的本意不错,但它并不是一个通用标准,从而导致了很多不兼容的问题。

经过用winhex等验证,乱码的csv直接保存后,记事本会自动增加BOM前缀。于是弄了一上午都在想办法在“要输出的文本”前增加上EF BB BF. 弄一上午,肯定是失败啦,否则也用不了一上午。失败的方法是:

base64(String.fromCharCode(0xef, 0xbb, 0xbf) +我要输出的文本)

或是根据winhex对正确文件的显示,在里面补充一些个0x00,都不行。因为EF BB BF无论怎么加,一经编码都变成了:茂禄驴(16进制是:C3 AF C2 BB C2 BF 00).

吃过饭回来,想到BASE64可以保存图片。那么我要是用这工具分别编码一下正确和乱码的文件不就行了。

于是用:http://www.fishlee.net/Tools/GetImageBase64Code  来试了下,结果真找到了不同。

记事本另存的正确结果:77u/5bqP5Y+3LOS/oeaBrw0K5ae

直接保存,无BOM头的结果:5bqP5Y+3LOS/oeaBrw0K5ae

 

释一下:ExcellentExport.js的思路,就是构造这样一个a标签:
<a target="_blank" href="data:application/csv;base64,5bqP5YNCg==" download="ok.csv" style="display: none;"><span>00</span></a>
把文字base64后,指定文件名,就可能通过<a>来前台下载文件了。完全无须后端。

之后最大的问题是csv乱码,遇到过的朋友一定会知道的。而js不比后台程序,转码是很不方便的。

导出CSV后,字母和数字正常,中文成了乱码,一番google发现,有人提出用BOM的方式解决,主要是在导出路径添加后缀 \uFEFF

function JSONToCSVConvertor(JSONData, ReportTitle, ShowLabel) {
 2             //If JSONData is not an object then JSON.parse will parse the JSON string in an Object
 3             var arrData = typeof JSONData != 'object' ? JSON.parse(JSONData) : JSONData;
 4 
 5             var CSV = '';
 6             //Set Report title in first row or line
 7 
 8             CSV += ReportTitle + '\r\n\n';
 9 
10             //This condition will generate the Label/Header
11             if (ShowLabel) {
12                 var row = "";
13 
14                 //This loop will extract the label from 1st index of on array
15                 for (var index in arrData[0]) {
16 
17                     //Now convert each value to string and comma-seprated
18                     row += index + ',';
19                 }
20 
21                 row = row.slice(0, -1);
22 
23                 //append Label row with line break
24                 CSV += row + '\r\n';
25             }
26 
27             //1st loop is to extract each row
28             for (var i = 0; i < arrData.length; i++) {
29                 var row = "";
30 
31                 //2nd loop will extract each column and convert it in string comma-seprated
32                 for (var index in arrData[i]) {
33                     row += '"' + arrData[i][index] + '",';
34                 }
35 
36                 row.slice(0, row.length - 1);
37 
38                 //add a line break after each row
39                 CSV += row + '\r\n';
40             }
41 
42             if (CSV == '') {
43                 alert("Invalid data");
44                 return;
45             }
46 
47             //Generate a file name
48             var fileName = "";
49             //this will remove the blank-spaces from the title and replace it with an underscore
50             fileName += ReportTitle.replace(/ /g, "_");
51 
52             //Initialize file format you want csv or xls
53             var uri = 'data:text/csv;charset=utf-8,\uFEFF' + encodeURI(CSV);
54 
55             // Now the little tricky part.
56             // you can use either>> window.open(uri);
57             // but this will not work in some browsers
58             // or you will not get the correct file extension    
59 
60             //this trick will generate a temp <a /> tag
61             var link = document.createElement("a");
62             link.href = uri;
63 
64             //set the visibility hidden so it will not effect on your web-layout
65             link.style = "visibility:hidden";
66             link.download = fileName + ".csv";
67 
68             //this part will append the anchor tag and remove it after automatic click
69             document.body.appendChild(link);
70             link.click();
71             document.body.removeChild(link);
72         }

 

 

© 著作权归作者所有

共有 人打赏支持
黑魔法
粉丝 10
博文 154
码字总数 43466
作品 0
武汉
前端工程师
mongo数据库导出mongoexport命令的使用

我用的MongoDB管理工具是Robo3T,今天需要从数据库中将集合数据导出,但是Robo3T我不怎么会玩,好像没有直接导出的功能,于是上网查了一下,找到了mongoexport这个命令,可以轻松导出数据在m...

itzhongxin ⋅ 2017/12/05 ⋅ 0

goalng导出excel(csv格式)

最近项目中有个小需求,需要将查询结果导出到excel。之间前java比较容易,使用POI很容易就能实现,查了下golang的文档,发现golang下边并没有导出excel的包,但是却有一个encoding/csv的包,...

oO脾气不坏Oo ⋅ 2014/07/20 ⋅ 0

将多个csv文件合成一个execl文件

1.需求 从数据库中导出了几个csv文件,但是需要一个execl文件,每张表名以csv文件名命名即可 2.准备工作 1)安装pip https://pypi.python.org/pypi/pip tar zxvf pip-8.1.2.tar.gz cd pip-8...

gongniue ⋅ 2016/08/25 ⋅ 0

生成csv文件时,2010微软excel打开乱码解决

在有时候直接需要导出数据时,设置header信息为如下: header("Content-type:application/vnd.ms-excel;charset=UTF-8"); //定义输出的文件类型 header("content-Disposition:filename=Exper...

happy_limit ⋅ 2013/05/06 ⋅ 0

求教csv导出乱码问题

写了个简易版的CsvRender 导出csv文件,excel打开中文是乱码。已经加了BOM头。 我本机是ubuntu, libreoffice打开是正常的,开虚拟机excel打开中文乱码。 public class CsvRender extends Ren...

Fred ⋅ 2012/11/15 ⋅ 4

mongoexport --csv 如何导出全字段

os:centos 6.4 x86_64 mongodb:2.4.3 现在有个mongodb 集合字段比较多,而且想全部导出来,然后再导入到execl中。使用MongoVUE 1.6.1 到成execl,由于数据超过65535,老提示导不出来,我的e...

hua_zi ⋅ 2013/10/14 ⋅ 1

日常导数据乱码解决方案

日常运营数据,大多时间是用脚本导出到xls,txt等格式; 中文乱码解决: 字符串都用utf-8编码 一些临时数据或者用SQL语句就可导出到,就通过mysqlBentch导出csv格式,效率更高 中文乱码解决: ubunt...

paul2011 ⋅ 2016/07/05 ⋅ 0

laravel-admin 导出excel乱码问题

问题: laravel-admin 中顶部导出数据为csv格式,打开后直接乱码不知道如何解决,可能是字符集问题,代码里面默认是utf8格式修改为gbk依然乱码! 可以通过phpexcel导出数据,解决导出乱码的问...

daos ⋅ 2017/12/10 ⋅ 0

postgresql----COPY之表与文件之间的拷贝

postgresql提供了COPY命令用于表与文件(和标准输出,标准输入)之间的相互拷贝,copy to由表至文件,copy from由文件至表。 示例1.将整张表拷贝至标准输出 test=# copy tbl_test1 to stdout;...

wangxuwei ⋅ 2016/10/27 ⋅ 0

在Mac系统下Excel转csv文件中文乱码问题解决

导出方式 问题的原因是编码方式不同造成的,解决问题需要借助一个工具 Numbers, 下载地址: http://soft.macx.cn/5144.htm 安装完成后用Numbers打开Excel文档; 在最上方点击:共享->导出 出现 ...

乐逍遥jun ⋅ 2016/02/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Gitee 生成并部署SSH key

1.如何生成ssh公钥 你可以按如下命令来生成 sshkey: ssh-keygen -t rsa -C "xxxxx@xxxxx.com" # Generating public/private rsa key pair...# 三次回车即可生成 ssh key 查看你的 ...

晨猫 ⋅ 51分钟前 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部