FileSaver.js 搭配 js-xlsx 下载 Excel

昨天在写关于下载文章的时候,本来以为关于 Excel 插件 js-xlsx 会很容易,结果一天都没弄明白。

插播
这里先插播一个知识点,说真的我没百度之前也不知道这个知识点,关于 html 中事件处理中的 this 和 event 对象。

一般情况下事件监听 this 指向这个标签,函数的参数 obj ,就是一个事件对象,通常用 event 或 e 来表示。下面的代码输出是没任何问题的。



输出结果:



我们现在稍微改一下:



事件拿到行内监听,this 指向 window,并且没有事件对象了。如果还是严选格式的话:



this为 undefined 。

总结:函数直接调用时
普通函数内部的 this 分两种情况,严格模式和非严格模式。

  • 非严格模式下,this 默认指向全局对象window
  • 而严格模式下, this为undefined

插播结束。

一、导入 Excel

我们先来看看如何导入 Excel 表格,下面的代码网上也不知道谁抄谁的了,我也不改动了,反正我参考的链接是:纯前端利用 js-xlsx 实现 Excel 文件导入导出功能示例



    
        
        
        
    

    
        
        

我建的测试 Excel 表格名字为 test.xlsx ,文件内容为:


test.xlsx

我们试着上传一下看看效果:



这个数据格式不用我多讲了吧,如果要做表格展示只需要把这个数组放入表格就 OK 了。

下面来看看一些概念和方法:

sheetJS 是前端操作 Excel 以及类似的二维表的最佳选择之一,而 js-xlsx 是它的社区版本。

首先下载 js-xlsx :去 GitHub 上 js-xlsx 找到 dist 复制出 xlsx.full.min.js引入到页面中,里面还有别的版本,我们 full 这个包包含全部功能,其他的例如 xlsx.core.min.js 只包含一些核心功能其实这个就够用了。

在 node 端,使用 npm 安装如下模块:

npm install xlsx --save

然后通过 FileReader 对象读取文件利用 js-xlsx 转成 json 数据。

XLSX 读取 excel 表格主要是通过 XLSX.read(data, {type: type});方法来实现,返回一个叫WorkBook 的对象,type主要取值如下:

  • base64: 以base64方式读取;(用到了)
  • binary: BinaryString格式(byte n is data.charCodeAt(n))(用到了)
  • string: UTF8编码的字符串;(用到了)
  • buffer: nodejs Buffer;
  • array: Uint8Array,8位无符号数组;
  • file: 文件的路径(仅nodejs下支持);

workbook (wb) 里面有什么东西呢,我们打印出来看一下:



可以看到,SheetNames 里面保存了所有 sheet 的名字,然后 Sheets 则保存了每个sheet 的具体内容(我们称之为Sheet Object)。每一个 sheet 是通过类似A1这样的键值保存每个单元格的内容,我们称之为单元格对象(Cell Object):

二、导出 Excel 表格

参考:纯前端利用 js-xlsx 实现 Excel 文件导入导出功能示例(2) -

这是个模拟导出的初始模板,源代码有个 bug ,就是点击下载弹出一个下载框,这时如果按 esc或取消按钮,不刷新页面的情况下下次再下载就会没多出一条数据:原因是作者在操作 json 的时候头插一个 json,结束忘了头删了。



    
        
        
        
    

    
    
    
    



仔细看上面实现是不是有点麻烦,所以原作者又优化了一下,顺便也把我发现的 bug 给解决了:

其中下载除了上面给出的 a 标签 download 下载法,还给出了利用** file-saver ** 进行下载的方法。两者选其一即可。



    
        
        
        
    

    
    
    
    
    


两个代码实现的效果是一样的,如下:


这里先明确一点,如果你的业务需求对导出文件的格式没有什么要求,不建议导出成xlsx格式的,直接导出成 csv 的就好了,真的会简单很多。创建一个 a 标签,写上data:text/csv;charset=utf-8 头,再把数据塞进去,encodeURI(csvContent)一下就好了,详情就不展开了,大家可以借鉴这个stackoverflow回答。

纯前端利用 js-xlsx 实现 Excel 文件导入导出功能示例 - https://www.jianshu.com/p/74d405940305

如何使用JavaScript实现纯前端读取和导出excel文件 - 我是小茗同学 - 博客园 https://www.cnblogs.com/liuxianan/p/js-excel.html#¥ネᄅ￧ヤᄄ¥ᆴリ₩ヨᄍ¥ᄋᆬ¥ナᄋ￧ᄆᄏ￧ヤ゚₩ネミ

你可能感兴趣的:(FileSaver.js 搭配 js-xlsx 下载 Excel)