语雀弃用SpreadJs?ExcelJS如何?

家好,很高兴又见面了,我是"前端‬进阶‬",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

前端‬进阶

前言

开始介绍ExcelJS之前,先说一个在线表格编辑的研发案例。

一开始在做在线表格时,语雀团队采用的是“SpreadJs+二次开发”的模式,后来发现功能越来越难做,维护和开发成本上升。于是,2019年5月语雀团队弃用了SpreadJs,开始自研。所以,本文也不再聚焦SpreadJs(如果有兴趣可以阅读文末资料),而是向大家介绍另一个在线表格控件ExcelJS。话不多说,直接开始。

1.什么是ExcelJS?

ExcelJS 是一个 JavaScript 包,充当 Excel 工作簿管理器。 根据其官方文档,exceljs 可以读取、操作电子表格数据和样式并将其写入 XLSX 和 JSON。 它是从 Excel 电子表格文件作为项目进行逆向工程。

ExcelJS具有以下能力:

此外,exceljs 更新及时并且完全免费,这一点和handsontable等在线表格解决方案相比确实有比较大的吸引力。

2.ExcelJS项目状态

从NPM的官方数据来看,ExcelJS的周下载量稳定在699,538左右,同时处于稳定的上升期。

ExcelJS项目的NPM的官方数据

与ExcelJS的直接竞争者handsontable的周下载量124,151相比,ExcelJS的下载量也有5.6倍之多。

ExcelJS的直接竞争者handsontable的周下载量

同时,从Github的统计数据来看,项目的star达到了惊人的10.6k,而且fork数量也达到了1.4K。

而同类产品handsontable的star达到了17.5k,fork数量也达到了2.8k。从这点来说,Github的数据指标和NPM的真实下载量之间还是有一定的差异。不过,也从侧面反映了handsontable、ExcelJS都是非常优秀的在线表格开发工具。

3.ExcelJS使用

3.1 不同环境安装ExcelJS

const ExcelJS = require('exceljs');

如果在Node环境使用,还需要导入相应的polyfill。

// exceljs需要导入的polyfill
require('core-js/modules/es.promise');
require('core-js/modules/es.string.includes');
require('core-js/modules/es.object.assign');
require('core-js/modules/es.object.keys');
require('core-js/modules/es.symbol');
require('core-js/modules/es.symbol.async-iterator');
require('regenerator-runtime/runtime');
// 基础polyfill
const ExcelJS = require('exceljs/dist/es5');

3.2 如何使用ExcelJS

创建一个新的工作簿

通过如下代码可以快速创建工作簿。

const workbook = new ExcelJS.Workbook();
// 添加工作簿属性
workbook.creator = 'Ng Wai Foong';
workbook.lastModifiedBy = 'Bot';
workbook.created = new Date(2021, 8, 30);
workbook.modified = new Date();
workbook.lastPrinted = new Date(2021, 7, 27);

添加新工作表

可以通过以下代码将新工作表添加到之前创建的工作簿中:

const worksheet = workbook.addWorksheet('New Sheet');
// 红色标签颜色
const worksheet = workbook.addWorksheet('New Sheet', {properties:{tabColor:{argb:'FFC0000'}}});
// 隐藏网格线
const worksheet = workbook.addWorksheet('New Sheet', {views: [{showGridLines: false}]});
// 冻结第一行和第一列
const worksheet = workbook.addWorksheet('New Sheet', {views:[{state: 'frozen', xSplit: 1, ySplit:1}]});
// pageSetup 设置为 A4 - 横向
const worksheet =  workbook.addWorksheet('New Sheet', {
  pageSetup:{paperSize: 9, orientation:'landscape'}
});
// 页眉和页脚
const worksheet = workbook.addWorksheet('New Sheet', {
  headerFooter: {oddFooter: "Page &P of &N";, oddHeader: 'Odd Page'}
});

文件输入输出

exceljs 提供了一些辅助函数,用于根据用例读取和加载文件。一般来说,它分为:

请注意,与文件 I/O 相关的操作会返回一个 Promise,并且必须与 await 关键字一起调用。如果您在函数内部使用它,请确保将函数设置为异步。

假设你有一个本地的excel文件,可以按如下方式进行读写:

// file读取
await workbook.xlsx.readFile(filename);
// file写
await workbook.xlsx.writeFile(filename);

如果有数据流,可以使用以下代码片段:

// 读取stream
await workbook.xlsx.read(stream);
// 写stream
await workbook.xlsx.write(stream);

在处理缓冲区时,您应该改为调用 load 和 writeBuffer 函数:

// buffer读取
await workbook.xlsx.load(data);
// buffer写
const buffer = await workbook.xlsx.writeBuffer();

这是读取上传的 excel 文件的示例。 fileList 是从 input 标签中获取的 FileList 对象。只需实例化一个新的二进制大对象 (BLOB) 并获取底层缓冲区。然后,将其传递给加载函数,如下所示:

const blob = new Blob([fileList[0]], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' });
const buffer = await blob.arrayBuffer();
const workbook = new ExcelJS.Workbook();
await workbook.xlsx.load(buffer);

4.本文总结

本文主要和大家介绍下Excel 工作簿管理器的JavaScript包exceljs,同时给出了几个简单的用法示例。因为笔者也没有在生产项目中使用、部署过exceljs,所以只是做了一个简短的介绍,但是文末的参考资料提供了大量优秀文档以供学习,如果有兴趣可以自行阅读。如果大家有什么疑问欢迎在评论区留言。


参考资料

https://github.com/exceljs/exceljs

https://github.com/handsontable/handsontable

https://builtin.com/software-engineering-perspectives/exceljs

ttps://www.grapecity.com.cn/developer/spreadjs

展开阅读全文

页面更新:2024-04-25

标签:下载量   在线   进阶   页眉   函数   表格   文件   项目   数据   工作

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top