js基于FileSaver.js 浏览器导出Excel文件的示例
发布时间 - 2026-01-11 02:48:04 点击率:次本文介绍了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)
# 就会
# 几次
# 还没
# 才会
# 给大家
# 做个
# 等他
# 但对
# 自己喜欢
# 转换成
# 也给
# 创建一个
# 大家多多
# 要等到
# 按了
# 转化成
# 下载完
# 发生了
# 大文件
# 离开了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
js代码实现下拉菜单【推荐】
如何用IIS7快速搭建并优化网站站点?
如何在IIS管理器中快速创建并配置网站?
如何在自有机房高效搭建专业网站?
,南京靠谱的征婚网站?
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
如何快速生成专业多端适配建站电话?
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
英语简历制作免费网站推荐,如何将简历翻译成英文?
Linux系统命令中tree命令详解
iOS UIView常见属性方法小结
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
高端建站三要素:定制模板、企业官网与响应式设计优化
QQ浏览器网页版登录入口 个人中心在线进入
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
Laravel storage目录权限问题_Laravel文件写入权限设置
如何快速搭建安全的FTP站点?
如何快速搭建自助建站会员专属系统?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
如何快速生成高效建站系统源代码?
海南网站制作公司有哪些,海口网是哪家的?
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
大学网站设计制作软件有哪些,如何将网站制作成自己app?
如何破解联通资金短缺导致的基站建设难题?
Laravel如何使用Service Container和依赖注入?(代码示例)
Laravel怎么为数据库表字段添加索引以优化查询
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
如何在Windows 2008云服务器安全搭建网站?
IOS倒计时设置UIButton标题title的抖动问题
如何批量查询域名的建站时间记录?
焦点电影公司作品,电影焦点结局是什么?
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
*服务器网站为何频现安全漏洞?
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
浅述节点的创建及常见功能的实现
如何快速搭建高效简练网站?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
详解jQuery停止动画——stop()方法的使用
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
高性能网站服务器部署指南:稳定运行与安全配置优化方案
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
西安专业网站制作公司有哪些,陕西省建行官方网站?
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧

