全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

js基于FileSaver.js 浏览器导出Excel文件的示例

本文介绍了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小时内与您取得联系。