这里贴出JavaScript导出csv文件(excel)的代码。

  1. /**
  2. * 导出excel
  3. * @param {Object} title 标题列key-val
  4. * @param {Object} data 值列key-val
  5. * @param {Object} fileName 文件名称
  6. */
  7. function JSONToExcelConvertor(title, data, fileName) {
  8. var CSV = '';
  9. var row = "";
  10.  
  11. for (var i = 0; i < title.length; i++) {
  12. if(title[i].title){
  13. row += title[i].title + ',';
  14. }
  15. }
  16. row = row.slice(0, -1);
  17. CSV += row + '\r\n';
  18.  
  19. for (var i = 0; i < data.length; i++) {
  20. var row = "";
  21. for (var j = 0; j < title.length; j++) {
  22. if(title[j].title){
  23. row += '"' + (data[i][title[j].field] ? data[i][title[j].field] : "") + '"\t,';
  24. }
  25. }
  26. row.slice(0, row.length - 1);
  27. CSV += row + '\r\n';
  28. }
  29.  
  30. if (CSV == '') {
  31. alert("Invalid data");
  32. return;
  33. }
  34.  
  35. var fileName = fileName;
  36. var uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURI(CSV);
  37. var link = document.createElement("a");
  38. link.href = uri;
  39.  
  40. link.style = "visibility:hidden";
  41. link.download = fileName + ".csv";
  42. document.body.appendChild(link);
  43. link.click();
  44. document.body.removeChild(link);
  45. }

上面的写法,如果excel中的数据太多,就会导致无法导出的结果,原因是浏览器对URL的长度有限制,因此要使用Blob对象和window.URL.createObjectURL()方法做一下改造。

window.URL.createObjectURL()方法可以直接生成blob:开头的链接,该链接产生于浏览器端,不会占用服务器资源。

  1. /**
  2. * 导出excel
  3. * @param {Object} title 标题列key-val
  4. * @param {Object} data 值列key-val
  5. * @param {Object} fileName 文件名称
  6. */
  7. function JSONToExcelConvertor(title, data, fileName) {
  8. var CSV = '';
  9. var row = "";
  10.  
  11. for (var i = 0; i < title.length; i++) {
  12. if(title[i].title){
  13. row += title[i].title + ',';
  14. }
  15. }
  16. row = row.slice(0, -1);
  17. CSV += row + '\r\n';
  18.  
  19. for (var i = 0; i < data.length; i++) {
  20. var row = "";
  21. for (var j = 0; j < title.length; j++) {
  22. if(title[j].title){
  23. row += '"' + (data[i][title[j].field] ? data[i][title[j].field] : "") + '"\t,';
  24. }
  25. }
  26. row.slice(0, row.length - 1);
  27. CSV += row + '\r\n';
  28. }
  29.  
  30. if (CSV == '') {
  31. alert("Invalid data");
  32. return;
  33. }
  34.  
  35. var fileName = fileName;
  36. var uri = new Blob(['\ufeff' + CSV], {type:"text/csv"});
  37. var link = document.createElement("a");
  38. link.href = URL.createObjectURL(uri);
  39.  
  40. link.style = "visibility:hidden";
  41. link.download = fileName + ".csv";
  42. document.body.appendChild(link);
  43. link.click();
  44. document.body.removeChild(link);
  45. }

然而,虽然window.URL.createObjectURL()方法在IE10、 IE11以及Microsoft Edge中能生成的blob:链接,但是却不能把它加到一个<a>节点上,也不能直接在浏览器地址栏打开访问,否则会得到【SCRIPT5:拒绝访问。】错误。甚至,IE9根本不支持调用window.URL.createObjectURL()方法创建Blob URLs。

Microsoft Internet Explorer / Microsoft Edge和高大上的Google Chrome / Mozilla Firefox对于window.URL.createObjectURL()方法创建Blob链接最直观的区别在于得到的blob:链接形式不一样,分别在微软浏览器和标准浏览器中运行new Blob()代码,会得到两种Blob链接形式,第一种为chrome和firefox生成的带有当前域名的标准blob:链接形式,第二种为Microsoft IE和Microsoft Edge生成的不带域名的blob:链接。那么我们就可以通过window.URL.createObjectURL(new Blob()) . indexOf(location.host) < 0表达式来检测是否是IE或早期生成Object URL不带域名的Edge,如果表达式返回true则是IE或Edge旧版本。

事实上,Blob URL不被支持是出于IE浏览器对安全性的考虑(IE浏览器真安全啊,牛逼),然后它自己提供了一套API用来创建或下载Blob文件:msSaveOrOpenBlob。

  1. /**
  2. * 导出excel
  3. * @param {Object} title 标题列key-val
  4. * @param {Object} data 值列key-val
  5. * @param {Object} fileName 文件名称
  6. */
  7. function JSONToExcelConvertor(title, data, fileName) {
  8. var CSV = '';
  9. var row = "";
  10.  
  11. for (var i = 0; i < title.length; i++) {
  12. if(title[i].title){
  13. row += title[i].title + ',';
  14. }
  15. }
  16. row = row.slice(0, -1);
  17. CSV += row + '\r\n';
  18.  
  19. for (var i = 0; i < data.length; i++) {
  20. var row = "";
  21. for (var j = 0; j < title.length; j++) {
  22. if(title[j].title){
  23. row += '"' + (data[i][title[j].field] ? data[i][title[j].field] : "") + '"\t,';
  24. }
  25. }
  26. row.slice(0, row.length - 1);
  27. CSV += row + '\r\n';
  28. }
  29.  
  30. if (CSV == '') {
  31. alert("Invalid data");
  32. return;
  33. }
  34.  
  35. var fileName = fileName;
  36. var uri = new Blob(['\ufeff' + CSV], {type:"text/csv"});
  37.  
  38. if (window.navigator && window.navigator.msSaveOrOpenBlob) { // for IE
  39. window.navigator.msSaveOrOpenBlob(CSV, fileName + ".csv");
  40. } else { // for Non-IE(chrome、firefox etc.)
  41. var link = document.createElement("a");
  42. link.href = URL.createObjectURL(uri);
  43.  
  44. link.style = "visibility:hidden";
  45. link.download = fileName + ".csv";
  46. document.body.appendChild(link);
  47. link.click();
  48. document.body.removeChild(link);
  49. }
  50. }

因此就得出上面最终的代码。

"就算临别也要通电话。"

javascript导出csv文件(excel)的更多相关文章

  1. mysql导出csv文件excel打开后数字用科学计数法显示且低位变0的解决方法

    Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法:如果数字大于15位,它不仅用于科学技术费表示,还会只保留高15位,其他位都变0. Excel打开csv文件时,只要字段值都是数字,它 ...

  2. thinkphp导出csv文件,用表格输出excel

    1.thinkphp导出csv文件 导出csv文件可能就那几行代码,今天有个问题困扰我好久,就是导出之后出现一些html代码,这个不应该,view里面是空的,controller中最后也没有$this ...

  3. 网页前端导出CSV,Excel格式文件

    通过自己实际测试有以下几种方法 方法一通过a标签实现,把要导出的数据用“\n”和“,”拼接成一个字符串,然后把字符串放到href中,这种方法只支持chrome,firefox等非ie浏览器 html页 ...

  4. PHP 导出 CSV 文件用 Excel 打开出现中文乱码

    本篇文章由:http://xinpure.com/php-export-csv-file-opened-by-excel-appear-garbled/ 乱码情况 写了一段导出 CSV 文件的代码,可 ...

  5. 【转载】JS导出CSV文件

    转自:http://www.cnblogs.com/dengnan/p/3990211.html 通过自己实际测试有以下几种方法 方法一通过a标签实现,把要导出的数据用“\n”和“,”拼接成一个字符串 ...

  6. php使用ajax导出CSV或者EXCEl(thinkphp)方法

    首先我强烈推荐看到这篇文章的你将导出文件设置为csv格式的文件 实际测试导出csv文件的速度是excel文件的10几倍左右 首先我先介绍csv文件的导出的方法: 如果你单纯是在数据导出界面上通过用户点 ...

  7. Web 端 js 导出csv文件(使用a标签)

    前言 导出文件,使用最多的方式还是服务器端来处理.比如jsp 中使用response 的方式. 但是,有时候可能就想使用web 前端是否也可以把页面上的内容导出来呢? 比如说,导出页面的一个表格. 这 ...

  8. PHP导出CSV文件出现乱码的解决方法

    在做项目时碰到使用外语的情况下,我们就会使用UTF-8编码.但是,在用PHP导出CSV文件时,如果写入的数据是使用UTF-8编码的日语.韩语之类的外文,就会出现乱码. 要解决PHP生成CSV文件的乱码 ...

  9. 导出csv文件数字会自动变科学计数法的解决方法

    其实这个问题跟用什么语言导出csv文件没有关系.Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法:如果数字大于15位,它不仅用于科学技术费表示,还会只保留高15位,其他位都变0.解决 ...

随机推荐

  1. Java虚拟机知识点【内存】

    运行时数据区 程序计数器(Program Counter)   每个线程独占自己的程序计数器.如果当前执行的方式不是native的,那程序计数器保存JVM正在执行的字节码指令的地址,如果是native ...

  2. Excel催化剂图表系列之一键完成IBCS国际商业标准图表

    在数据分析领域,最后一公里的图表输出,是一片十分广阔的领域.一直以来,笔者深知不是这一方面的能手,学习上也仅仅是浅尝而止.没有往其深入研究并有所产出.很幸运地在数据圈子能够结识到其他的志同道合的伙伴, ...

  3. Java项目案例之---登录和修改(JSP)

    登录和修改(JSP) 通过案例学习jsp的常用知识点: 1.创建一个Map集合,用于存放学生信息,将学生信息存入Map中 2.通过page将需要的包导入 3.用request.getParameter ...

  4. [小米OJ] 3. 大数相减

    题目链接 思路: 利用两个string保存相减的数,其他模拟即可. 参考了别人的一个处理减的步骤,很简洁好看. string substract(string str1, string str2) { ...

  5. Cesium 学习(一)环境搭建

    网上已有很多文章来教我们搭建Cesium的环境,我也没有必要再写一次:下面是我参照的文章的地址: 1.https://www.cnblogs.com/huqi-code/p/8287403.html  ...

  6. HttpWebRequest的使用之Get和Post的差别(C#)

    这两天做的是通过一个HttpWebRequest将采集地址发送到服务端,服务端会返回一个JSON格式的字符串,然后我这边再对这个JSON进行反序列化,得到我想要的数据.在这篇文章里我简单介绍一下Htt ...

  7. Android通过辅助功能实现抢微信红包原理简单介绍

    简书文章:https://www.jianshu.com/p/e1099a94b979 附抢红包开源项目地址,代码已全改为Kotlin了,已适配到最新微信7.0.5版本,如果对你有所帮助赏个star吧 ...

  8. RFC 2544 性能测试

    什么是RFC 2544?网络设备性能测试的一组指标,包括吞吐率.时延.丢包率.背靠背. * * * 吞吐率(Throughput). 定义:被测设备在不丢包的情况下,所能转发的最大数据流量.通常使用每 ...

  9. Kotlin学习快速入门(5)——空安全

    介绍 kotlin中,对象可分为两种类型,可为空的对象和不可为空对象 默认为不可为空对象,代码检测如果发现不可为空对象赋予了null,则会标红报错. 可为空的对象,如果调用了方法,代码检测也会标红报错 ...

  10. GridLayout and GridData

    GridLayout的风格 GridLayout类提供了GridLayout 布局中划分网格的信息,主要通过以下几个参数进行设置. 属性: NumColumns:通过“gridLayout.numCo ...