天天看点

js 预览 excel,js-xlsx的使用

js-xlsx 介绍

由sheetjs出品的<code>js-xlsx</code>是一款非常方便的只需要纯js即可读取和导出excel的工具库,功能强大,支持格式众多,支持<code>xls</code>、<code>xlsx</code>、<code>ods</code>(一种openoffice专有表格文件格式)等十几种格式。本文全部都是以<code>xlsx</code>格式为例。

兼容性如下图:

js 预览 excel,js-xlsx的使用

<code>dist</code>目录下有很多个js文件,一般情况下用<code>xlsx.core.min.js</code>就够了,<code>xlsx.full.min.js</code>则是包含了所有功能模块。

js 预览 excel,js-xlsx的使用

直接<code>script</code>标签引入即可:

读取excel

读取excel主要是通过<code>xlsx.read(data, {type: type});</code>方法来实现,返回一个叫<code>workbook</code>的对象,type主要取值如下:

<code>base64</code>: 以base64方式读取;

<code>binary</code>: binarystring格式(byte n is data.charcodeat(n))

<code>string</code>: utf8编码的字符串;

<code>buffer</code>: nodejs buffer;

<code>array</code>: uint8array,8位无符号数组;

<code>file</code>: 文件的路径(仅nodejs下支持);

直接上代码:

<code>workbook</code>里面有什么东西呢,我们打印出来看一下:

js 预览 excel,js-xlsx的使用

可以看到,<code>sheetnames</code>里面保存了所有的sheet名字,然后<code>sheets</code>则保存了每个sheet的具体内容(我们称之为<code>sheet object</code>)。每一个<code>sheet</code>是通过类似<code>a1</code>这样的键值保存每个单元格的内容,我们称之为单元格对象(<code>cell object</code>):

js 预览 excel,js-xlsx的使用

每一个<code>sheet object</code>表示一张表格,只要不是<code>!</code>开头的都表示普通<code>cell</code>,否则,表示一些特殊含义,具体如下:

<code>sheet['!ref']</code>:表示所有单元格的范围,例如从a1到f8则记录为<code>a1:f8</code>;

<code>sheet[!merges]</code>:存放一些单元格合并信息,是一个数组,每个数组由包含<code>s</code>和<code>e</code>构成的对象组成,<code>s</code>表示开始,<code>e</code>表示结束,<code>r</code>表示行,<code>c</code>表示列;

等等;

关于单元格合并,看懂下面这张图基本上就没问题了:

js 预览 excel,js-xlsx的使用

结果如下:

js 预览 excel,js-xlsx的使用

每一个单元格是一个对象(<code>cell object</code>),主要有<code>t</code>、<code>v</code>、<code>r</code>、<code>h</code>、<code>w</code>等字段(详见这里):

t:表示内容类型,<code>s</code>表示string类型,<code>n</code>表示number类型,<code>b</code>表示boolean类型,<code>d</code>表示date类型,等等

v:表示原始值;

f:表示公式,如<code>b2+b3</code>;

h:html内容

w:格式化后的内容

r:富文本内容<code>rich text</code>

等等

普通方法:

根据<code>!ref</code>确定excel的范围,再根据<code>!merges</code>确定单元格合并(如果有),最后输出整个table,比较麻烦,幸运的是,插件自身已经写好工具类<code>xlsx.utils</code>给我们直接使用,无需我们自己遍历,工具类输出主要包括如下:

js 预览 excel,js-xlsx的使用

有些不常用,常用的主要是:

<code>xlsx.utils.sheet_to_csv</code>:生成csv格式

<code>xlsx.utils.sheet_to_txt</code>:生成纯文本格式

<code>xlsx.utils.sheet_to_html</code>:生成html格式

<code>xlsx.utils.sheet_to_json</code>:输出json格式

常用的主要是<code>sheet_to_csv</code>或者<code>sheet_to_html</code>,转csv的话会忽略格式、单元格合并等信息,所以复杂表格可能不适用。转html的话会保留单元格合并,但是生成的是<code>代码,而不是</code>,需要对表格进行一些定制时不太方便,所以具体还是要视情况来采用合适的工具类。

这里写一个采用转csv方式输出结果的简单示例,可点击这里查看在线demo:

导出excel

导出分为2种,一种是基于现有excel修改,一种是全新生成,前者比较简单,我们这里着重讲后者。

导出excel文件,主要是如何生成一个<code>sheet</code>,我们这里写一个最简单的csv转excel示例:

拿到上面的blob对象就可以直接下载了

所以,最终下载实现如下:

其实上面这些代码都不需要我们手写,官方已经提供好了现成的工具类给我们使用,主要包括:

<code>aoa_to_sheet</code>: 这个工具类最强大也最实用了,将一个二维数组转成sheet,会自动处理number、string、boolean、date等类型数据;

<code>table_to_sheet</code>: 将一个<code>table dom</code>直接转成sheet,会自动识别<code>colspan</code>和<code>rowspan</code>并将其转成对应的单元格合并;

<code>json_to_sheet</code>: 将一个由对象组成的数组转成sheet;

<code>aoa_to_sheet</code>示例:

<code>table_to_sheet</code>就更简单了,直接<code>xlsx.utils.table_to_sheet($('table')[0])</code>即可;

一般来说,前端生成<code>excel</code>而不是<code>csv</code>最主要目的都是为了解决csv不能实现单元格合并的问题,要不然直接导出csv文件就好了,何必引入几百kb的插件。

假设我们要生成如下格式的excel文件,其中<code>a1-c1</code>进行单元格合并:

js 预览 excel,js-xlsx的使用

代码如下:

需要注意的地方就是被合并的单元格要用<code>null</code>预留出位置,否则后面的内容(本例中是第四列<code>其它信息</code>)会被覆盖。