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常用方法与技巧