出于安全考虑,JS无法直接调用FileAPI写文件到磁盘,但是却可以通过下载来变相实现保存功能。
JS要实现下载功能,一般都是这么几个过程:生成下载的URL,动态创建一个A标签,并将其href指向生成的URL,然后触发A标签的单击事件,这样就会弹出下载对话框,从而实现了一个下载的功能。

HTML5的download属性

这个属性很重要,它可以指定下载文件名,并且可以告诉浏览器目标链接是一个下载链接,不是一个普通链接,我们看下面代码就能看出区别了:

<a href="data:text/txt;charset=utf-8,测试下载纯文本" rel="external nofollow" rel="external nofollow" rel="external nofollow" download="测试.txt" >下载1</a>
<a href="data:text/txt;charset=utf-8,测试下载纯文本" rel="external nofollow" rel="external nofollow" rel="external nofollow" >下载2</a>

可以发现,下载1按钮能够实现下载,点击下载2链接时直接在浏览器打开文件内容了。

JS生成CSV文件并下载

csv是一种逗号分隔的表格文件格式,可以很好的被Excel支持,由于其文件格式简单,所以经常用在简单的表格上面。最重要的是它是一种纯文本格式,可以很轻松地用JS来生成而不借助第三方库。

不考虑兼容性的保存CSV方法:

/*** 保存CSV文件* @params csv csv文件内容* @params saveName 保存的文件名*/
function saveCSV(csv, saveName){var a = document.createElement('a');a.href = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(csv);a.download = saveName;a.click();
}

虽然我们用的是UTF-8编码,下载后你会发现,用文本编辑器打开没问题,但是用Excel打开乱码:
原因就是少了一个ufeffBOM头,所以在data里面添加一个\ufeff解决了

文字换行问题

文字换csv的最大问题就是如何处理换行,很简单,使用`\n`,`\r`后再用encodeURIComponent编码一下就可以了。

大部分浏览器可能都没啥问题,但是一些比较老的Chrome可能下载的时候指定的download就是不生效,此时可以用blob来解决:(测试此方法测试在微软Edge浏览器和IE11下都无法下载)

考虑兼容性的保存CSV方法:

/*** 保存CSV文件* @params csv csv文件内容* @params saveName 保存的文件名*/
function saveCSV(csv, saveName)
{var blob = new Blob(['\ufeff' + csv], {type: 'text/csv,charset=UTF-8'});openDownloadDialog(blob, saveName);
}

此方法测试在微软Edge浏览器可以实现下载,但是在IE11下还是无法下载

封装下载函数

const openDownloadDialog = (url, saveName) => {if (typeof url === 'object' && url instanceof Blob) {url = URL.createObjectURL(url); // 创建blob地址}const aLink = document.createElement('a');aLink.href = url;aLink.download = saveName;aLink.click();
};

txt文件

下载text文件只需要修改一下文件类型就行了

function saveTXT(csv, saveName)
{var blob = new Blob(['\ufeff' + csv], {type: 'text/txt,charset=UTF-8'});openDownloadDialog(blob, saveName);
}

注意事项

保存文件的文件名后缀会影响打开方式,如果是.csv的文件名,默认打开为excel,.txt文件结尾的默认打开方式为text文件。所以这点需要注意

参考代码

我自己在项目中的封装

downLoadTools.js


const openDownloadDialog = (url, saveName) => {if (typeof url === 'object' && url instanceof Blob) {url = URL.createObjectURL(url); // 创建blob地址}const aLink = document.createElement('a');aLink.href = url;aLink.download = saveName;aLink.click();
};
export default {/*** 保存CSV文件* @params csv csv文件内容* @params saveName 保存的文件名*/saveCSV: (csv, saveName) => {const blob = new Blob(['\ufeff' + csv], {type: 'text/csv,charset=UTF-8'});openDownloadDialog(blob, `${saveName}.csv`);},saveTXT: (csv, saveName) => {// const href = 'data:text/txt;charset=utf-8,\ufeff' + encodeURIComponent(csv); // ie浏览器不支持const blob = new Blob(['\ufeff' + csv], {type: 'text/tet,charset=UTF-8'});openDownloadDialog(blob, `${saveName}.txt`);}
};

页面引用

import downLoadTools from '@/utils/downLoadTools';  // 引入downLoadTools.saveTXT(csv, '文件名');               // csv是一个字符串, 最终会下载一个 文件名.txt 的文件

js实现txt/excel文件下载相关推荐

  1. js实现txt/excel文件下载 1

    https://segmentfault.com/a/1190000015276969 转载于:https://www.cnblogs.com/alww/p/11492356.html

  2. Node.js 动态表格大文件下载实践

    前言 最近优化了几个新人写出的动态表格文件下载接口的性能瓶颈,感觉非常有必要总结一篇文章作为文档来抛砖引玉,以促进大家学习一起写出更专业的代码. HTTP 文件下载 讲具体问题之前需要先了解一些 HT ...

  3. vue 实现本地excel文件下载功能

    今天后端开发人员给了我一个excel文件,跟我说要实现excel下载功能,就是将给的excel文件下载下来. 所以我刚开始就直接还用之前用过的方法来实现,不过有一点小瑕疵,就是名字是默认的不能修改.先 ...

  4. 【翻译】将Ext JS Grid转换为Excel表格

    原文:Converting an Ext 5 Grid to Excel Spreadsheet 稍微迟来的礼物--Ext JS Grid转为Excel代码,现在支持Ext JS 5! 功能包括: - ...

  5. 如何将TXT,EXCEL或CSV数据导入ORACLE到对应表中

    如何将TXT,EXCEL或CSV数据导入ORACLE到对应表中 2011-05-12 14:19 方法一,使用SQL*Loader      这个是用的较多的方法,前提必须oracle数据中目的表已经 ...

  6. 利用js-xlsx.js插件实现Excel文件导入并解析Excel数据成json数据格式

    <!--本文转载于网络,有太多一样的文章,不知道原作者是哪位了,就不注明出处了.这里记载下来,用于自己的学习借鉴--><!DOCTYPE html><html lang= ...

  7. C# 学习 txt -- excel txt -- json

    在Unity3D 中使用,需要配置环境,\Assets\Plugins  Txt  -->  Excel using System.Collections; using System.Colle ...

  8. 基于 Next.js实现在线Excel

    如果要从头开始使用 React 构建一个完整的 Web 应用程序,需要哪些步骤? 这当然不像把大象装进冰箱那么简单,只需要分成三步:打开冰箱,拿起大象,塞进冰箱就好. 我们需要考虑细节有很多,比如: ...

  9. linux读取excel并导入mysql_mysql命令行的导入导出sql,txt,excel(都在linux或windows命令行操作)(转自筑梦悠然)...

    Mysql导入导出sql,txt,excel 首先我们通过命令行进入到mysql安装目录的bin目录下,比如我输入的命令行为: d: cd  D:/wamp/bin/mysql/mysql5.6.17 ...

最新文章

  1. 关于数据库中NULL的描述,下列哪些说法符合《阿里巴巴Java开发手册》
  2. 给Scrum Master的十个建议,你值得拥有((转自scrum中文网))
  3. 雨滴桌面时间插件_如何设置极简桌面?学会了看电脑都赏心悦目
  4. 《面向对象分析与设计》读书笔记——第一章 复杂性
  5. 周志华教授签名新书免费送!豆瓣满分森林书破解AI实践难题
  6. delphi socket 流的使用_Socket
  7. android 剪切板广播发送者,Android使用剪切板传递数据
  8. 界面无小事(八):RecyclerView增删item
  9. vstar为什么登录不了_一手的闲鱼号,为什么现在闲鱼号一号难求
  10. 有了bootstrap,为什么还要做amaze ui
  11. RabbitMQ AMQP MessageConverter 消息转换器 PDF Image Text 文本 图片 PDF json
  12. 《设计模式详解》行为型模式 - 命令模式
  13. 重温JS基础--创建对象
  14. python测试系列教程 —— 调试日志logging
  15. unistd.h中定义函数
  16. thymeleaf使用总结
  17. linux的pcan驱动安装
  18. keil和protues仿真点亮一个LED灯
  19. 99美金和299美金的开发者证书的区别
  20. 短视频创业,如何在技术上节省100万启动资金?

热门文章

  1. Zephyr内核到1.5版本的改进
  2. TCL(Tool   Command   Language)
  3. XML错误:缺少所需的空白区
  4. springmvc二: @RequestMapping
  5. jvm二:类加载,连接,初始化
  6. java: ThreadLocal简介
  7. ****** 三十五 ******、软设笔记【网络基础】-安全性、可靠性与系统性能评测-数据安全与保密...
  8. 在windowService用Process.Start()启动程序没有界面-记录
  9. 积木式开发中Session的处理问题
  10. html css常用样式