利用a标签导出csv文件
原文
简书原文:https://www.jianshu.com/p/a8687610cda3
大纲
1、需求分析
2、通过a标签实现文件导出
3、实现方式
1、需求分析
导出文件,使用最多的方式还是服务器端来处理。比如jsp中使用response的方式。
但是,有时候可能就想使用web前端是否也可以把页面上的内容导出来呢?比如说,导出页面的一个表格。
这个需求肯定是有答案的,只是对于各浏览器处理会稍微不一样。(主要是IE和其他浏览器的区别)。
在IE中使用ActiveXObject 实现,在firefox 和Chrome 中使用a标签(或者js)就可以实现了。
前端导出文件大部分还是通过服务器端的方式生成文件,然后传递到客户端。但很多情况下当我们导出CSV时并不需要后端参与,甚至没有后端。
做过WebGIS的同学经常会碰到这种场景,用户的兴趣点数据以csv文件形式上传到web应用中以表格形式展示,并可以编辑属性信息,编辑完成后需要将数据下载到本地。特别是对一些敏感数据,用户不希望传递到应用服务器端,整个过程完全在客户端进行。
2、通过a标签实现文件导出
2.1、通过a标签实现导出文件有两种方式
1、通过href属性来实现文件导出
2、通过download属性来实现文件导出(IE不兼容)
3、通过navigator.msSaveBlob来实现(IE专属,谷歌火狐不兼容)
2.2、需要注意
1、IE有独有的方法
2、谷歌和火狐推荐使用结合Bolb、createObjectURL的方式(需要注意这两者可能在低版本浏览器不兼容的情况)
3、需要注意的是在将数据导出成csv的时候需要先将数据转换成对应的格式,这样才能整齐导出
3、实现方式
3.1、IE浏览器
3.1.1、IE浏览器(IE10以下)
IE10以下,利用execCommand方法来保存csv文件
在实际应用中浏览器会打开一个新窗口,并弹出保存文件对话框,而对话框中保存类型时,只有html和text两项可选,此时需要在文件名中手动加上“.csv”后缀。
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="author" content="oscar999">
<title>
</title>
</head>
<body>
<a id="mylink" href="#" onclick="clickDownload()">download</a>
</body>
<script>
function clickDownload(){
var text = "栏位1,栏位2,栏位3\n值1,值2,值3";
var fileName = "test.csv" var oWin = window.top.open("about:blank", "_blank");
oWin.document.write('sep=,\r\n' + text);
oWin.document.close();
oWin.document.execCommand('SaveAs', true, fileName);
oWin.close();
}
</script>
</html>
3.1.2、IE浏览器(IE10以上)
IE10以及Edge浏览器使用navigator.msSaveBlob(blob);虽然这些浏览器也支持execCommand的方法,但可以避免需要手动添加文件后缀。
msSaveBlob是IE的私有方法,只有IE10及以上和Edge浏览器支持。
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="author" content="oscar999">
<title>
</title>
</head>
<body>
<a id="mylink" href="#" onclick="clickDownload()">download</a>
</body>
<script>
function clickDownload(){
var text = "栏位1,栏位2,栏位3\n值1,值2,值3";
var BOM = "\uFEFF";
var fileName = "test.csv"//名字不要写错,尤其是后缀,这关系到下载的文件格式
var csvData = new Blob([BOM + text], { type: 'text/csv' });
navigator.msSaveBlob(csvData, fileName);
}
</script>
</html>
3.2、Firefox、Chrome、Safari
3.2.1、 download基本使用模式
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="author" content="oscar999">
<title>
</title>
</head>
<body>
<a id="mylink" href="#" onclick="clickDownload()">download</a>
</body>
<script>
function clickDownload(){
var text = "栏位1,栏位2,栏位3\n值1,值2,值3";
var BOM = "\uFEFF";
var fileName = "test.csv"
var csvData = new Blob([BOM + text], { type: 'text/csv' }); let downloadLink = document.createElement('a');
downloadLink.href = 'data:attachment/csv;charset=utf-8,' + BOM + encodeURIComponent(text);
downloadLink.target = '_blank';
downloadLink.download = fileName;
downloadLink.click();
}
</script>
</html>
3.2.2、利用a标签的href和download属性
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="author" content="oscar999">
<title>
</title>
</head>
<body>
<a id="mylink" href="#" onclick="clickDownload()">download</a>
</body>
<script>
function clickDownload(){
var text = "栏位1,栏位2,栏位3\n值1,值2,值3";
var BOM = "\uFEFF";
var fileName = "test.csv"
var csvData = new Blob([BOM + text], { type: 'text/csv' }); let downloadLink = document.createElement('a');
downloadLink.href = 'data:attachment/csv;charset=utf-8,' + BOM + encodeURIComponent(text);
downloadLink.target = '_blank';
downloadLink.download = fileName;
downloadLink.click();
}
</script>
</html>
3.2.3、对href的属性进行设置——使用createObjectURL创建连接,适用于较大的文件
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="author" content="oscar999">
<title>
</title>
</head>
<body>
<a id="mylink" href="#" onclick="clickDownload()">download</a>
</body>
<script>
function clickDownload(){
var text = "栏位1,栏位2,栏位3\n值1,值2,值3";
var BOM = "\uFEFF";
var fileName = "test.csv"
var csvData = new Blob([BOM + text], { type: 'text/csv' });
let downloadLink = document.createElement('a');
downloadLink.href = window.URL.createObjectURL(csvData);
downloadLink.download = fileName;
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
}
</script>
</html>
3.3.4、数据转换成Blob形式再设置为href的值
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="author" content="oscar999">
<title>
</title>
</head>
<body>
<a id="mylink" href="#" download="downlaod.csv">download</a>
</body>
<script>
var data = "栏位1,栏位2,栏位3\n值1,值2,值3";
var blob = new Blob([data], { type: 'text/csv' }); //new way
var csvUrl = URL.createObjectURL(blob);
document.getElementById("mylink").href = csvUrl;
</script>
</html>
参考网址
https://www.cnblogs.com/dojo-lzz/p/4837041.html
http://blog.csdn.net/oscar999/article/details/16342699
利用a标签导出csv文件的更多相关文章
- Web 端 js 导出csv文件(使用a标签)
前言 导出文件,使用最多的方式还是服务器端来处理.比如jsp 中使用response 的方式. 但是,有时候可能就想使用web 前端是否也可以把页面上的内容导出来呢? 比如说,导出页面的一个表格. 这 ...
- web前端导出csv文件
前言 导出文件,使用最多的方式还是服务器端来处理.比如jsp 中使用response 的方式. 但是,有时候可能就想使用web 前端是否也可以把页面上的内容导出来呢? 比如说,导出页面的一个表格. 这 ...
- 【转载】JS导出CSV文件
转自:http://www.cnblogs.com/dengnan/p/3990211.html 通过自己实际测试有以下几种方法 方法一通过a标签实现,把要导出的数据用“\n”和“,”拼接成一个字符串 ...
- Spring Boot下的一种导出CSV文件的代码框架
1.前言 CSV,逗号分隔值(Comma-Separated Values),即为逗号分隔的文本文件.如果值中含有逗号.换行符.制表符(Tab).单引号及双引号,则需要用双引号括起来:如果值中包含 ...
- 导出csv文件示例
导出csv文件示例 csv文件默认以英文逗号,做为列分隔符换行符\n作为行分隔符,写入到一个.csv文件即可.含有英文逗号,和换行符会发生数据输出会出现混乱,下面列出一些处理方法.特殊字符处理1.含有 ...
- mysql SQLyog导入导出csv文件
1.选择数据库表 --> 右击属性 --> 备份/导出 --> 导出表数据作为 --> 选择cvs --> 选择下面的“更改” --> 字段 --> 变量长度 ...
- PHP 读取/导出 CSV文件
工作中经常会有遇到导入/导出的需求,下面是常用的方法.读取CSV文件,可以分页读取,设置读取行数,起始行数即可.导出CSV文件,用两种方法进行实现. /** * 读取CSV文件 * @param st ...
- PHP导出CSV文件出现乱码的解决方法
在做项目时碰到使用外语的情况下,我们就会使用UTF-8编码.但是,在用PHP导出CSV文件时,如果写入的数据是使用UTF-8编码的日语.韩语之类的外文,就会出现乱码. 要解决PHP生成CSV文件的乱码 ...
- [转]PL/SQL Developer 导入导出csv文件
PL/SQL Developer 可以导入或者导出CSV文件. 导入CSV文件步骤: 1.选择tools->text importer.... 2.选择第二个Data to oracle选项卡, ...
随机推荐
- hdu 1863 畅通project kruskal || prim
简单最小生成树,畅通project.这三道题目都是练习最小生成树的. 注意一下推断是否有通路时,kruskal能够推断每一个点的祖先是否同样.prim能够推断每一个点是否都加进集合里面了,也就是说是否 ...
- if 的理解
1. if 实现集合的划分 比如著名的 Prim 算法(最小生成树),从某一确定的点出发,每次新加入的点,都是在已访问过的结点(u∈U)和未访问过(v∈V−U)的结点之间的边.这里的未被访问(V−U) ...
- 78.pipe多管道云端,客户端通信
压力测试截图: 云端 定义管道缓存区大小,最多连接数量(线程个数),当前线程个数,管道名字 //缓冲区大小 #define SIZE 4096 //最多连接数量 #define MAX_CONNECT ...
- Encoding encoding = Encoding.GetEncoding("gb2312"); 与byte[] ping = Encoding.UTF8.GetBytes(inputString);区别
Encoding encoding = Encoding.GetEncoding("gb2312"); 与byte[] ping = Encoding.UTF8.GetBytes( ...
- JSON.parse和eval()的区别
eval方法不检查给的字符串是否符合json的格式,parse会检查json语法格式. 比如一个json字符串data: { "a": 1, "b": &quo ...
- C# Unity依赖注入利用Attribute实现AOP功能
使用场景? 很多时候, 我们定义一个功能, 当我们要对这个功能进行扩展的时候, 按照常规的思路, 我们一般都是利用OOP的思想, 在原有的功能上进行扩展. 那么有没有一种东西, 可以实现当我们需要扩展 ...
- 基于Eclipse的Android JNI层測试应用开发过程记录
前言 本文记录一个Java层与JNI层參数与数据交互的应用程序开发过程.为实现一个功能完整的带Java与JNI的应用程序打下基础. 本文如果读者已搭建好Android的Eclipse与NDK开发环境, ...
- C++ Traits 技术
Tarits.特性的复数. c++萃取技术就是指它. 实现方式是模板特化. STL中涉及到iterator的地方常常能用到它. gcc的STL与VS的STL略有区别. vs中下列代码,把鼠标放在ite ...
- POJ 1012:Joseph
Joseph Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 50068 Accepted: 19020 Descript ...
- amaze样例页面分析(一)
amaze样例页面分析(一) 一.总结 1.从审查(inspect)中是很清楚的可以弄清楚这些part之间的结构关系的 2.一者在于弄清楚他们之间的结构关系,二者在于知道结构的每一部分是干嘛的 3.i ...