简介

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

js-xlsx将注意力集中到了数据转换和导出上,所以它支持相当多种类的数据解析和导出.不仅仅局限于支持xlsx格式.

支持的导入格式

支持的导出格式

它可以:

  • 解析符合格式的数据
  • 导出符合格式的数据
  • 利用中间层操作数据

可以运行在:

  • 浏览器端
  • Node端

浏览器端特色

  • 纯浏览器端解析数据
  • 纯浏览器端导出数据

Node端特色

  • 读写文件
  • 流式读写

本篇文章力求精简,主要讨论一下js-xlsx的工作流程和基本概念以及使用方式.

概念

js-xlsx提供了一个中间层用于操作数据,他将不同类型的文件抽象成同一个js对象,从而规避了操作不同种类数据数据之间的复杂性.

并且围绕着这个对象提供了一系列的抽象功能,本小节主要讨论这些数据对象与Excel数据之间的关系.

而浏览器端和Node端的区别仅仅在于怎样导入文件和导出文件上而已,对于数据的操作,双方的接口是一致的.

引入

js-xlsx的引入非常简单,浏览器端引入可以是最基本script标签的形式.

<script lang="javascript" src="dist/xlsx.full.min.js"></script>

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

npm install xlsx --save

在Node中如下引入:

const xlsx = require('xlsx');

详细文档地址

对应关系

在这个表格中我列举了Excel与js-xlsx之间的关系:

Excel名词 js-xlsx中的抽象类型
工作簿 workBook
工作表 Sheets
Excel引用样式(单元格地址) cellAddress
单元格 cell

有了这个基本的对应关系我们就可以轻松的理解后续的操作,例如在我们使用Excel的过程中,获取一个数据的流程如下:

  1. 打开工作簿
  2. 打开一个工作表
  3. 选中一片区域或者一个单元格
  4. 针对数据进行操作
  5. 保存(另存为)

那么在js-xlsx中获取一个单元格内容的操作如下:

// 先不要关心我们的workbook对象是从哪里来的
var first_sheet_name = workbook.SheetNames[0]; // 获取工作簿中的工作表名字
var address_of_cell = 'A1'; // 提供一个引用样式(单元格下标) var worksheet = workbook.Sheets[first_sheet_name]; // 获取对应的工作表对象 var desired_cell = worksheet[address_of_cell]; // 获取对应的单元格对象 var desired_value = (desired_cell ? desired_cell.v : undefined);// 获取对应单元格中的数据

数据格式

图片:工作簿的数据结构

一旦我们的Excel文件被解析那么这个Excel表中的所有内容都会被解析上面的这个对象.而且这整个过程是同步完成的.

所以我们可以使用键的方式来直接获取数据,在上面的例子中我们就利用键一层层的向下获取数据.

上图中常用的键一共有两个:

  • SheetNames以字符串数组的形式保存了所有的工作表的名称
  • Sheets下的内容都是工作表对象,而键名就是SheetNames中包含的名字

而Excel的数据单位由小到大有如下排序如下:

  • 单元格
  • 工作表
  • 工作簿

单元格格式

在Excel中单元格有多种格式,而js-xlsx会将其解析为对应的JavaScript的格式.

常见格式如下:

描述
v 源数据(未经处理的数据)
w 格式化后的文本(如果能够被格式化)
t 单元格类型(具体类型请看下方的表格)
r 解码后的富文本(如果可以被解码)
h 渲染成HTML格式的富文本(如果可以被解码)
c 单元格注释
z 格式化成字符串的数值(如果需要的话)

完整格式链接.

解析后单元格数据格式:

这个数据在Excel中保存在A1的位置上,文本类型,单元格内容为xm.

单元格地址

js-xlsx使用有两种方式来描述操作中的单元格区域.

一种是单元格地址对象(Cell address object)另外一种是地址范围(Cell range).

地址对象格式如下:

const start = { c: 0, r: 0 };
const end = { c: 1, r: 1 };

上方地址对象对应的地址范围如下:

const range = 'A1:B2';

我们不难发现两者之间对应的关系:

  • 地址对象描述的是一个起始坐标(从0开始)到结束坐标之间的范围.
  • 地址范围就是Excel中的引用样式.

注意:这两个概念会在工作表读写中使用到.

API

js-xlsx提供的接口非常清晰主要分为两类:

  • xlsx对象本身提供的功能

    • 解析数据
    • 导出数据
  • utils工具类

    • 将数据添加到数据表对象上
    • 将二维数组以及符合格式的对象或者HTML转为工作表对象
    • 将工作簿转为另外一种数据格式
    • 行,列,范围之间的转码和解码
    • 工作簿操作
    • 单元格操作

读取数据并解析

这里提供一个简单的Node例子(Node10+):

const xlxs = require('xlsx');
const {readFile} = require('fs').promises; (async function (params) { // 获取数据
const excelBuffer = await readFile('./books.xlsx'); // 解析数据
const result = xlxs.read(excelBuffer,{
type:'buffer',
cellHTML:false,
}); console.log('TCL: result', result); })();

还可以使用utils.book_new()创建一个新的工作簿对象:

const
xlsx = require('xlsx'),
{ utils } = xlsx; const workBook= utils.book_new(); // 创建一个工作簿

然后使用跟多的工具来操作工作簿对象:

// 接着上面的例子

const ws_data = [
[ "S", "h", "e", "e", "t", "J", "S" ],
[ 1 , 2 , 3 , 4 , 5 ]
]; const workSheet = XLSX.utils.aoa_to_sheet(ws_data);// 使用二维数组创建一个工作表对象 utils.book_append_sheet(workBook,workSheet,'工作表名称');// 向工作簿追加一个工作表 console.log(workBook);

详细的解析文档

详细解析选项

数据填充

工作表是实际存放数据的地方,在大部分情况下我们的操作都是对于工作表对象的操作.

js-xlsx提供了多种方式来操作数据,这里提供最常见的几种操作:

  • 利用现有的数据结构创建工作表

    • 二维数组作为数据源
    • JSON作为数据源
  • 修改工作表数据

    • 二维数组作为数据源
    • JSON作为数据源

创建工作表

const workSheet = utils.aoa_to_sheet([[1,2,3,new Date()],[1,2,,4]],{
sheetStubs:false,
cellStyles:false,
cellDates:true // 解析为原生时间
}); console.log(workSheet);

二维数组的关系非常容易理解,数组中的每一个数组代表一行.

图片:二维数组结果

const workSheet =
utils.json_to_sheet([
{ '列1': 1, '列2': 2, '列3': 3 },
{ '列1': 4, '列2': 5, '列3': 6 }
],{
header:['列1','列2','列3'],
skipHeader:true// 跳过上面的标题行
}) console.log(workSheet);

图片:JSON效果

详细文档地址

修改数据表数据

const workSheet =
utils.json_to_sheet([
{ '列1': 1, '列2': 2, '列3': 3 },
{ '列1': 4, '列2': 5, '列3': 6 }
],{
header:['列1','列2','列3'],
skipHeader:true// 跳过上面的标题行
}) utils.sheet_add_aoa(workSheet,[
[7,8,9],
['A','B','C']
],{
origin:'A1' // 从A1开始增加内容
}); console.log(workSheet);

图片:二维数组结果

const workSheet =
utils.json_to_sheet([
{ '列1': 1, '列2': 2, '列3': 3 },
{ '列1': 4, '列2': 5, '列3': 6 }
],{
header:['列1','列2','列3'],
skipHeader:true// 跳过上面的标题行
}) utils.sheet_add_json(workSheet,[
{ '列1': 7, '列2': 8, '列3': 9 },
{ '列1': 'A', '列2': 'B', '列3': 'C' }
],{
origin:'A1',// 从A1开始增加内容
header: ['列1', '列2', '列3'],
skipHeader: true// 跳过上面的标题行
}); console.log(workSheet);

图片:JSON效果

详细文档地址

数据导出

数据导出分为两个部分:

  • 利用工具类将工作簿对象转为其他数据结构
  • 调用write或者writeFile方法

转换为其他的数据结构

这里就不提供详细的用例了,可以转换的格式如下:

详细文档地址

输出文件

这里提供一个简单的Node例子(Node10+):

const
xlsx = require('xlsx'),
{ utils } = xlsx; const {writeFile} =require('fs').promises; const workBook= utils.book_new();
const workSheet = utils.aoa_to_sheet([[1,2,3]],{
cellDates:true,
}); // 向工作簿中追加工作表
utils.book_append_sheet(workBook, workSheet,'helloWorld'); // 浏览器端和node共有的API,实际上node可以直接使用xlsx.writeFile来写入文件,但是浏览器没有该API
const result = xlsx.write(workBook, {
bookType: 'xlsx', // 输出的文件类型
type: 'buffer', // 输出的数据类型
compression:true // 开启zip压缩
}); // 写入文件
writeFile('./hello.xlsx',result)
.catch((error)=>{
console.log(error);
});

write方法文档以及输出选项

支持的输出文件格式

有关js-xlsx的其他优秀文章

https://www.cnblogs.com/liuxi...

引用

https://github.com/SheetJS/js...

[SheetJS] js-xlsx模块学习指南的更多相关文章

  1. React JS和React-Native学习指南

    自己在学习React-Native过程中整理的一份学习指南,包含 教程.开源app和资源网站等,还在不断更新中.欢迎pull requests! React-Native学习指南本指南汇集React- ...

  2. Node.js C++ 插件学习指南

    Node.js插件(addons) Node.js 插件是用 C++ 编写的动态链接共享对象,可以使用 require() 函数加载到 Node.js 中,且像普通的 Node.js 模块一样被使用. ...

  3. 封装js插件学习指南

    封装js插件学习指南 1.原生JavaScript插件编写指南 => 传送门 2.如何定义一个高逼格的原生JS插件 =>传送门 3.手把手教你用原生JavaScript造轮子 =>  ...

  4. 推荐10个很棒的AngularJS学习指南

    AngularJS 是非常棒的JS框架,能够创建功能强大,动态功能的Web app.AngularJS自2009发布以来,已经广泛应用于Web 开发中.但是对想要学习Angular JS 的人而言,只 ...

  5. 绝版珍珍藏:web前端技术学习指南

    绝版珍珍藏:web前端技术学习指南 优秀的Web前端开发工程师要在知识体系上既要有广度和深度!应该具备快速学习能力. 前端开发工程师不仅要掌握基本的Web前端开发技术,网站性能优化.SEO和服务器端的 ...

  6. (转)2019年 React 新手学习指南 – 从 React 学习线路图说开去

    原文:https://www.html.cn/archives/10111 注:本文根据 React 开发者学习线路图(2018) 结构编写了很多新手如何学习 React 的建议.2019 年有标题党 ...

  7. javascript立体学习指南

    javascript立体学习指南第一章:首先了解javascript 首先,什么是javascript? JavaStrip出生于1995年,是一种文本脚本语言,成都装修公司是一种动态的.弱类型的.基 ...

  8. Android Wear(手表)开发 - 学习指南

    版权声明:欢迎自由转载-非商用-非衍生-保持署名.作者:Benhero,博客地址:http://www.cnblogs.com/benhero/ Android Wear开发 - 学习指南 http: ...

  9. React-Native学习指南

    React-Native学习指南 本指南汇集React-Native各类学习资源,给大家提供便利.指南正在不断的更新,大家有好的资源欢迎Pull Requests! 同时还有Awesome React ...

随机推荐

  1. js 获取滚动位置,滚动到指定位置,平滑滚动

    1.获取当前滚动条位置信息 var top = dom.scrollTop; // 获取y轴上的滚动位置 var left = dom.scrollLeft; // 获取x轴上的滚动位置 2.滚动到指 ...

  2. ASP.NET超大文件上传与下载

    总结一下大文件分片上传和断点续传的问题.因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况.http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,http协议自动会将文件 ...

  3. codevs 1098 均分纸牌 2002年NOIP全国联赛提高组 x

     时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必 ...

  4. HDU 6287 Just h-index

    Time limit 3000 ms Memory limit 132768 kB OS Windows Source CCPC2018-湖南全国邀请赛-重现赛(感谢湘潭大学) 中文题意 一个序列,每 ...

  5. opencv_python_基本图像处理

    https://www.e-learn.cn/content/python/2694135 https://blog.csdn.net/Eastmount/article/details/817488 ...

  6. 有关Dispose,Finalize,GC.SupressFinalize函数-托管与非托管资源释放的模式

    //这段代码来自官方示例,删除了其中用处不大的细节using System; using System.ComponentModel; /*** * 这个模式搞的这么复杂,目的是:不管使用者有没有手动 ...

  7. 关于【C++项目:无法解析的外部符号】

    1,基本原因,[链接器]->[附加库目录]没有填写相关库的路径.或没有在[链接器]->[输入]->[附加依赖项]中填写相关库的名称 2,高级原因:如果不是1的原因,那就有可能是平台与 ...

  8. COUNT(*) vs COUNT(col)

    w https://www.percona.com/blog/2007/04/10/count-vs-countcol/

  9. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第4节 ArrayList集合_15-ArrayList集合存储基本数据

    泛型必须是引用类型,不能是基本类型 里面的泛型用int就会报错 集合里面保存的都是地址值.基本类型的数据没有地址值,所以你想要往里面存int是不可以的 基本类型可以往ArrayList里面放,但是必须 ...

  10. 16/7/8_PHP-设置cookie会话控制(session与cookie)

    设置cookie PHP设置Cookie最常用的方法就是使用setcookie函数,setcookie具有7个可选参数,我们常用到的为前5个: name( Cookie名)可以通过$_COOKIE[' ...