本文介绍了js基于FileSaver.js 浏览器导出Excel文件,分享给大家,也给自己做个笔记

限制一:不同浏览器对 blob 对象有不同的限制
具体看看下面这个表格(出自FileSaver.js):
| Browser | Constructs as | Filenames | Max Blob Size | Dependencies |
|---|---|---|---|---|
| Firefox 20+ | Blob | Yes | 800 MiB | None |
| Firefox < 20 | data: URI | No | n/a | Blob.js |
| Chrome | Blob | Yes | 500 MiB | None |
| Chrome for Android | Blob | Yes | 500 MiB | None |
| Edge | Blob | Yes | ? | None |
| IE 10+ | Blob | Yes | 600 MiB | None |
| Opera 15+ | Blob | Yes | 500 MiB | None |
| Opera < 15 | data: URI | No | n/a | Blob.js |
| Safari 6.1+* | Blob | No | ? | None |
| Safari < 6 | data: URI | No | n/a | Blob.js |
限制二:构建完 blob 对象后才会转换成文件
这一点限制对小文件(几十kb)可能没什么影响,但对稍微大一点的文件影响就很大了。试想,用户要下载一个 100mb 的文件,如果他点击了下载按钮之后没看到下载提示的话,他肯定会继续按,等他按了几次之后还没看到下载提示时,他就会抱怨我们的网站,然后离开了。
然而事实上下载的的确确发生了,只是要等到下载完文件之后才能构建 blob 对象,再转化成文件。而且,用户再触发多几次下载就会造成一些资源上的浪费。
因此,如果是要下载大文件的话,还是推荐直接创建一个 <a> 标签拉~
写 html 也好,写 JavaScript 动态创建也好,用自己喜欢的方式去创建就好了。
FileSaver.js
/* FileSaver.js
* A saveAs() FileSaver implementation.
* 1.3.2
* 2016-06-16 18:25:19
*
* License: MIT
* See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
*/
/*global self */
/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
var saveAs = saveAs || (function(view) {
"use strict";
// IE <10 is explicitly unsupported
if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
return;
}
var
doc = view.document
// only get URL when necessary in case Blob.js hasn't overridden it yet
, get_URL = function() {
return view.URL || view.webkitURL || view;
}
, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
, can_use_save_link = "download" in save_link
, click = function(node) {
var event = new MouseEvent("click");
node.dispatchEvent(event);
}
, is_safari = /constructor/i.test(view.HTMLElement) || view.safari
, is_chrome_ios =/CriOS\/[\d]+/.test(navigator.userAgent)
, throw_outside = function(ex) {
(view.setImmediate || view.setTimeout)(function() {
throw ex;
}, 0);
}
, force_saveable_type = "application/octet-stream"
// the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to
, arbitrary_revoke_timeout = 1000 * 40 // in ms
, revoke = function(file) {
var revoker = function() {
if (typeof file === "string") { // file is an object URL
get_URL().revokeObjectURL(file);
} else { // file is a File
file.remove();
}
};
setTimeout(revoker, arbitrary_revoke_timeout);
}
, dispatch = function(filesaver, event_types, event) {
event_types = [].concat(event_types);
var i = event_types.length;
while (i--) {
var listener = filesaver["on" + event_types[i]];
if (typeof listener === "function") {
try {
listener.call(filesaver, event || filesaver);
} catch (ex) {
throw_outside(ex);
}
}
}
}
, auto_bom = function(blob) {
// prepend BOM for UTF-8 XML and text/* types (including HTML)
// note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});
}
return blob;
}
, FileSaver = function(blob, name, no_auto_bom) {
if (!no_auto_bom) {
blob = auto_bom(blob);
}
// First try a.download, then web filesystem, then object URLs
var
filesaver = this
, type = blob.type
, force = type === force_saveable_type
, object_url
, dispatch_all = function() {
dispatch(filesaver, "writestart progress write writeend".split(" "));
}
// on any filesys errors revert to saving with object URLs
, fs_error = function() {
if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {
// Safari doesn't allow downloading of blob urls
var reader = new FileReader();
reader.onloadend = function() {
var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');
var popup = view.open(url, '_blank');
if(!popup) view.location.href = url;
url=undefined; // release reference before dispatching
filesaver.readyState = filesaver.DONE;
dispatch_all();
};
reader.readAsDataURL(blob);
filesaver.readyState = filesaver.INIT;
return;
}
// don't create more object URLs than needed
if (!object_url) {
object_url = get_URL().createObjectURL(blob);
}
if (force) {
view.location.href = object_url;
} else {
var opened = view.open(object_url, "_blank");
if (!opened) {
// Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html
view.location.href = object_url;
}
}
filesaver.readyState = filesaver.DONE;
dispatch_all();
revoke(object_url);
}
;
filesaver.readyState = filesaver.INIT;
if (can_use_save_link) {
object_url = get_URL().createObjectURL(blob);
setTimeout(function() {
save_link.href = object_url;
save_link.download = name;
click(save_link);
dispatch_all();
revoke(object_url);
filesaver.readyState = filesaver.DONE;
});
return;
}
fs_error();
}
, FS_proto = FileSaver.prototype
, saveAs = function(blob, name, no_auto_bom) {
return new FileSaver(blob, name || blob.name || "download", no_auto_bom);
}
;
// IE 10+ (native saveAs)
if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {
return function(blob, name, no_auto_bom) {
name = name || blob.name || "download";
if (!no_auto_bom) {
blob = auto_bom(blob);
}
return navigator.msSaveOrOpenBlob(blob, name);
};
}
FS_proto.abort = function(){};
FS_proto.readyState = FS_proto.INIT = 0;
FS_proto.WRITING = 1;
FS_proto.DONE = 2;
FS_proto.error =
FS_proto.onwritestart =
FS_proto.onprogress =
FS_proto.onwrite =
FS_proto.onabort =
FS_proto.onerror =
FS_proto.onwriteend =
null;
return saveAs;
}(
typeof self !== "undefined" && self
|| typeof window !== "undefined" && window
|| this.content
));
// `self` is undefined in Firefox for Android content script context
// while `this` is nsIContentFrameMessageManager
// with an attribute `content` that corresponds to the window
if (typeof module !== "undefined" && module.exports) {
module.exports.saveAs = saveAs;
} else if ((typeof define !== "undefined" && define !== null) && (define.amd !== null)) {
define("FileSaver.js", function() {
return saveAs;
});
}
调用方法
function expToExcel(){
var content = $("#report").html();
var blob = new Blob(["Hello, world!"], { type: "text/plain;charset=utf-8" });
saveAs(blob, "hello world.txt");
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# FileSaver
# 导出Excel文件
# FileSaver导出Excel
# JS基于FileSaver.js插件实现文件保存功能示例
# JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
# JavaScript实现导入导出excel的示例代码
# Javascript模块导入导出详解
# js实现导入导出功能实例代码(FileSave.js)
# 就会
# 几次
# 还没
# 才会
# 给大家
# 做个
# 等他
# 但对
# 自己喜欢
# 转换成
# 也给
# 创建一个
# 大家多多
# 要等到
# 按了
# 转化成
# 下载完
# 发生了
# 大文件
# 离开了
相关文章:
如何批量查询域名的建站时间记录?
如何快速上传自定义模板至建站之星?
网站制作新手教程,新手建设一个网站需要注意些什么?
开封网站制作公司,网络用语开封是什么意思?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
网站设计制作企业有哪些,抖音官网主页怎么设置?
h5在线制作网站电脑版下载,h5网页制作软件?
济南企业网站制作公司,济南社保单位网上缴费步骤?
家庭建站与云服务器建站,如何选择更优?
建站之星展会模板:智能建站与自助搭建高效解决方案
阿里云网站制作公司,阿里云快速搭建网站好用吗?
制作宣传网站的软件,小红书可以宣传网站吗?
如何通过网站建站时间优化SEO与用户体验?
Python lxml的etree和ElementTree有什么区别
制作电商网页,电商供应链怎么做?
TestNG的testng.xml配置文件怎么写
宁波免费建站如何选择可靠模板与平台?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
建站之星收费标准详解:套餐费用及年费价格表一览
如何选择CMS系统实现快速建站与SEO优化?
如何高效搭建专业期货交易平台网站?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
宝塔面板创建网站无法访问?如何快速排查修复?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何用搬瓦工VPS快速搭建个人网站?
自助网站制作软件,个人如何自助建网站?
创业网站制作流程,创业网站可靠吗?
网站专业制作公司有哪些,做一个公司网站要多少钱?
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
Python如何创建带属性的XML节点
如何将凡科建站内容保存为本地文件?
制作表格网站有哪些,线上表格怎么弄?
北京网站制作网页,网站升级改版需要多久?
建站之星3.0如何解决常见操作问题?
音乐网站服务器如何优化API响应速度?
婚礼视频制作网站,学习*后期制作的网站有哪些?
建站主机解析:虚拟主机配置与服务器选择指南
如何在自有机房高效搭建专业网站?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
ui设计制作网站有哪些,手机UI设计网址吗?
攀枝花网站建设,攀枝花营业执照网上怎么年审?
如何在西部数码注册域名并快速搭建网站?
如何选择高效可靠的多用户建站源码资源?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
网站制作公司排行榜,四大门户网站排名?
,巨量百应是干嘛的?
动图在线制作网站有哪些,滑动动图图集怎么做?
如何在云指建站中生成FTP站点?
*请认真填写需求信息,我们会在24小时内与您取得联系。