在浏览器和node中使用 GitHub的js-xlsx库进行Excel文件处理(一)

发布时间 2023-04-11 10:54:35作者: 陈晓猛

1.简介

js-xlsx 库是目前 Github 上 star 数量最多的处理 Excel 的库,功能强大,提供了各种对表格的操作,但是这个项目文档有些乱,提供的demo也只具备最基本的功能。

Demo地址: http://oss.sheetjs.com/js-xlsx
Github上源码地址: http://git.io/xlsx

支持解析的格式有:

Excel 2007+ XML Formats (XLSX/XLSM)
Excel 2007+ Binary Format (XLSB)
Excel 2003-2004 XML Format (XML “SpreadsheetML”)
Excel 97-2004 (XLS BIFF8)
Excel 5.0/95 (XLS BIFF5)
OpenDocument Spreadsheet (ODS)

支持输出格式有:

XLSX
CSV (and general DSV)
JSON and JS objects (various styles)

2.安装

1.在node环境中,加载xlsx的模块只包含基本的特性,如果需要用到一些不常见额外特性,得自己安装。

2.在浏览器中,可以添加js引用来使用这些额外的特性。比如:

<script src="dist/cpexcel.js"></script>
<script src="dist/ods.js"></script>

这些额外特性文件都包含在源码的dist/ directory文件夹里面。在这个文件夹里面,还有xlsx的各种版本核心代码,完整版,精简版,压缩版等。

3.xlsx.js使用了ES5的功能,比如Array和forEach等,为了兼容低版本的浏览器,使用了shim技术。在加载xlsx.js文件之前加载shim.js(在dist/ directory文件夹里面),还有xlsx只能解析xls,也就是97-03的excel表格,如果要解析xlsx,也就是03之后的excel表格,需要引入jszip.js文件,而且需要在xlsx之前加载。如下:

<script src="jszip.js"></script>
<script src="shim.js"></script>
<script src="xlsx.js"></script> 

 

名词解释:
workbook对象:指的是整份 Excel 文档。我们在使用 js-xlsx 读取 Excel 文档之后就会获得 workbook 对象。
worksheet 对象:指的是 Excel 文档中的表。我们知道一份 Excel 文档中可以包含很多张表,而每张表对应的就是 worksheet 对象。
cell 对象:指的就是 worksheet 中的单元格,一个单元格就是一个 cell 对象。

3.解析表格

接下来会一步步分析怎么解析操作表格。node环境、浏览器环境分开讲。

1) node环境中

1.安装xlsx模块,命令行窗口中输入:npm install xlsx

2.用 XLSX.readFile 打开 Excel 文件,返回 workbook

首先加载xlsx模块,然后使用readFile打开excel文件,特别需要注意路径问题,如果没有指明路径,

readFile默认打开excel文件的根路径是你安装node模块的位置(电脑里面node_modules文件的位置),而不是你项目源代码文件的路径。我的excel文件不在默认的根路径下,使用相对路径(注意斜杠方向啊):

这边我是放在项目内的某个文件夹内,由于我的文件是根据时间来生成的 所以加了一个日期参数

const todayDate = new Date()
        console.log(todayDate)
        const year = todayDate.getFullYear()
        let month = todayDate.getMonth()+1
        if(month<9){
            month='0'+month
        }
        const date = todayDate.getDate()
        const workbook1 = xlsx.readFile("./testdata/downloadResources/OPS_A_RealInfo-"+year+month+date+".csv")

3.用 workbook.SheetNames 获取表名,代码:

const sheetNames = workbook1.SheetNames
console.log('sheetNames',sheetNames)

console.log(sheetNames)打印如图所示:

 

 

4.用 workbook.Sheets[xxx] 通过表名获取表格,代码:

const worksheet = workbook1.Sheets[sheetNames[i]]
const worksheet = workbook1.Sheets[sheetNames[0]]
console.log(worksheet)

 

 可以看出,worksheet是一个对象,里面包含名称/值对,值对的值仍然是对象。

所以如果要遍历所有的数据,我们可以先forEach所有的表,再遍历表里面的所有的值

参考的源码:https://github.com/fortime/js-xlsx

 const sheet_name_list = workbook1.SheetNames;
        sheet_name_list.forEach(function(y) { /!* iterate through sheets *!/
            const worksheet = workbook1.Sheets[y];
            for (let z in worksheet) {
                /!* all keys that do not begin with "!" correspond to cell addresses *!/
                if(z[0] === '!') continue;
/* 带!的属性(比如!ref)是表格的特殊属性,用来输出表格的信息,不是表格的内容,所以去掉 */
// console.log(y + "!" + z + "=" + JSON.stringify(worksheet[z].v)); console.log(z,JSON.stringify(worksheet[z].v)); } });

输出的运行结果:

 

 

如果只是检验其中的某一些列的话,就只需要 打开指定的文件 并且对值进行assert校验

   async readExcelData() {
        const todayDate = new Date()
        const year = todayDate.getFullYear()
        let month = todayDate.getMonth()+1
        if(month<9){
            month='0'+month
        }
        const date = todayDate.getDate()
        const workbook1 = xlsx.readFile("./testdata/downloadResources/OPS_A_RealInfo-"+year+month+date+".csv")
        const sheetNames = workbook1.SheetNames;
        const worksheet= workbook1.Sheets[sheetNames[0]]
        const cell_C2 = worksheet['C2'].v
        const cell_C3 = worksheet['C3'].v
        const cell_H2 = worksheet['H2'].v
        const cell_H3 = worksheet['H3'].v
        assert.equal(cell_C2,'OPS-A1')
        assert.equal(cell_C3,'OPS-A1')
        assert.equal(cell_H2,'DC:62:94:19:4D:FD')
        assert.equal(cell_H3,'DC:62:94:19:4D:FD')
    }

 

如果要自动生成和处理excel表 可以参考这个文章

https://blog.csdn.net/guochunyang/article/details/108845980