简介
本文介绍用 Node.js 中的 js-xlsx 库来处理 Excel 文件。 js-xlsx 库是目前 Github 上 star 数量最多的处理 Excel 的库,功能强大,但上手难度稍大。
安装
cnpm install xlsx
附上cnpm的安装命令
npm install -g cnpm –registry=https://registry.npm.taobao.org
概念
在使用这个库之前,先介绍库中的一些概念。
workbook
对象,指的是整份 Excel 文档。我们在使用
js-xlsx
读取 Excel 文档之后就会获得
workbook
对象。
worksheet
对象,指的是 Excel 文档中的表。我们知道一份 Excel 文档中可以包含很多张表,而每张表对应的就是
worksheet
对象。
cell
对象,指的就是
worksheet
中的单元格,一个单元格就是一个
cell
对象。
它们的关系如下:
// workbook
{
SheetNames: ['sheet1', 'sheet2'],
Sheets: {
// worksheet
'sheet1': {
// cell
'A1': { ... },
// cell
'A2': { ... },
...
},
// worksheet
'sheet2': {
// cell
'A1': { ... },
// cell
'A2': { ... },
...
}
}
}
用法
基础用法
- 用 XLSX.readFile 打开 Excel 文件,返回 workbook
- 用 workbook.SheetNames 获取表名
- 用 workbook.Sheets[xxx] 通过表名获取表格
- 按自己的需求去处理表格
- 生成新的 Excel 文件
具体方法
读取EXCEL文件
import XLSX from 'xlsx';
const workbook = XLSX.readFile('someExcel.xlsx', opts);
获取 Excel 文件中的表
// 获取 Excel 中所有表名
const sheetNames = workbook.SheetNames; // 返回 ['sheet1', 'sheet2']
// 根据表名获取对应某张表
const worksheet = workbook.Sheets[sheetNames[0]];
通过
worksheet[address]
来操作表格,以
!
开头的 key 是特殊的字段。
// 获取 A1 单元格对象
let a1 = worksheet['A1']; // 返回 { v: 'hello', t: 's', ... }
// 获取 A1 中的值
a1.v // 返回 'hello'
// 获取表的有效范围
worksheet['!ref'] // 返回 'A1:B20'
worksheet['!range'] // 返回 range 对象,{ s: { r: 0, c: 0}, e: { r: 100, c: 2 } }
// 获取合并过的单元格
worksheet['!merges'] // 返回一个包含 range 对象的列表,[ {s: { r: 0, c: 0 }, c: { r: 2, c: 1 } } ]
实战
var xlsx = require('xlsx')
var fs = require("fs")
var moment = require("moment")
var os = require("os")
//查找是否存在指定文件夹路径
if(fs.existsSync('./excel/字段枚举值配置表格')){
//读取文件夹下的所有文件名称
fs.readdir('./excel/字段枚举值配置表格/', function (err, files) {
if (err) {
throw err
}
console.log(files)
//查找是否存在指定SQL文件夹路径
if(fs.existsSync('./sql')){
//创建SQL存储文件
fs.writeFile("./sql/字段枚举值配置.sql","" ,function(err) {
if(err) {
return console.log(err)
}
console.log("创建SQL存储文件成功")
})
}else{
//创建文件夹
fs.mkdirSync('./sql', function(err){
if(err){
console.log(err);
return;
}
//创建SQL存储文件
fs.writeFile("./sql/字段枚举值配置.sql","" ,function(err) {
if(err) {
return console.log(err);
}
console.log("创建SQL存储文件成功")
})
})
}
//主表自增DOC_ENTRY
var num = 1;
//遍历文件名数组,拼接SQL语句
files.forEach(function(d,n){
let workbook = xlsx.readFile('./excel/字段枚举值配置表格/'+d)
let sheetNames = workbook.SheetNames
sheetNames.forEach(function(sheetName,n) {
var worksheet = workbook.Sheets[sheetName]
var data = xlsx.utils.sheet_to_json(worksheet)
let fieldsName = "DOC_ENTRY ,GROUP_NAME ,BUSINESS_OBJ ,BUSINESS_DEC ,FIELDS_NAME ,BUSINESS_REMARK ,CREATE_DATE"
let fieldsValue = "("+num+",'模板名称','业务对象','对象描述','对象字段','备注','"+moment(Date.now()).format('YYYY-MM-DD HH:mm:ss')+"')"+os.EOL
let sql = `INSERT INTO MDM_SYNC_ENUM_GROUP(${fieldsName}) VALUES ${fieldsValue}`
//向存储文件追加SQL语句
fs.appendFileSync("./sql/字段枚举值配置.sql", sql)
data.forEach(function(d,i){
let fieldsLineName = "DOC_ENTRY ,LINE_ID ,FIELDS_VALUE ,ENUM_NAME ,ENUM_ODATA ,ENUM_TYPE ,ENUM_VALUE"
let fieldsLineValue = "("+num+","+num+"00"+i+",'0','"+data[i].Object+"','"+data[i].Emun+"','Interger','"+i+"')"+os.EOL
let sql = `INSERT INTO MDM_SYNC_ENUM_GROUP_LINE(${fieldsLineName}) VALUES ${fieldsLineValue}`
fs.appendFileSync("./sql/字段枚举值配置.sql", sql)
})
num = num +1
})
})
})
}else{
//创建文件夹
fs.mkdirSync('./excel/字段枚举值配置表格', function(err){
if(err){
console.log(err);
return;
}
})
console.log("未找到'excel/字段枚举值配置表格'文件夹,已创建该文件夹,请在'excel/字段枚举值配置表格'文件夹中放入SAP对应关系表格")
}
参考资料
-
https://github.com/SheetJS/js-xlsx
-
http://stackoverflow.com/questions/30859901/parse-xlsx-with-node-and-create-json
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
听说 👉 点赞 👈 的人运气不会太差,每一天都会元气满满哦 嘿嘿!!! ❤️ ❤️ ❤️
大家的支持就是我坚持下去的动力。点赞后不要忘了👉 关注 👈我哦!