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
标签:node,xlsx,GitHub,const,todayDate,worksheet,Excel,js From: https://www.cnblogs.com/chenxiaomeng/p/17305459.html