Node.js中利用js-xlsx處理xlsx文件的實(shí)現(xiàn)
簡介
本文介紹用 Node.js 中的 js-xlsx 庫來處理 Excel 文件。 js-xlsx 庫是目前 Github 上 star 數(shù)量最多的處理 Excel 的庫,功能強(qiáng)大,但上手難度稍大。
安裝
cnpm install xlsx
附上cnpm的安裝命令
npm install -g cnpm --registry=https://registry.npm.taobao.org
概念
在使用這個(gè)庫之前,先介紹庫中的一些概念。
workbook 對象,指的是整份 Excel 文檔。我們在使用 js-xlsx 讀取 Excel 文檔之后就會獲得 workbook 對象。
worksheet 對象,指的是 Excel 文檔中的表。我們知道一份 Excel 文檔中可以包含很多張表,而每張表對應(yīng)的就是 worksheet 對象。
cell 對象,指的就是 worksheet 中的單元格,一個(gè)單元格就是一個(gè) cell 對象。
它們的關(guān)系如下:
// workbook
{
SheetNames: ['sheet1', 'sheet2'],
Sheets: {
// worksheet
'sheet1': {
// cell
'A1': { ... },
// cell
'A2': { ... },
...
},
// worksheet
'sheet2': {
// cell
'A1': { ... },
// cell
'A2': { ... },
...
}
}
}
用法
基礎(chǔ)用法
- 用 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'] // 根據(jù)表名獲取對應(yīng)某張表 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'] // 返回一個(gè)包含 range 對象的列表,[ {s: { r: 0, c: 0 }, c: { r: 2, c: 1 } } ]
實(shí)戰(zhàn)
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')){
//創(chuàng)建SQL存儲文件
fs.writeFile("./sql/字段枚舉值配置.sql","" ,function(err) {
if(err) {
return console.log(err)
}
console.log("創(chuàng)建SQL存儲文件成功")
})
}else{
//創(chuàng)建文件夾
fs.mkdirSync('./sql', function(err){
if(err){
console.log(err);
return;
}
//創(chuàng)建SQL存儲文件
fs.writeFile("./sql/字段枚舉值配置.sql","" ,function(err) {
if(err) {
return console.log(err);
}
console.log("創(chuàng)建SQL存儲文件成功")
})
})
}
//主表自增DOC_ENTRY
var num = 1;
//遍歷文件名數(shù)組,拼接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+",'模板名稱','業(yè)務(wù)對象','對象描述','對象字段','備注','"+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{
//創(chuàng)建文件夾
fs.mkdirSync('./excel/字段枚舉值配置表格', function(err){
if(err){
console.log(err);
return;
}
})
console.log("未找到'excel/字段枚舉值配置表格'文件夾,已創(chuàng)建該文件夾,請?jiān)?excel/字段枚舉值配置表格'文件夾中放入SAP對應(yīng)關(guān)系表格")
}
參考資料
- https://github.com/SheetJS/js-xlsx
- http://stackoverflow.com/questions/30859901/parse-xlsx-with-node-and-create-json
到此這篇關(guān)于Node.js中利用js-xlsx處理xlsx文件的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Node xlsx文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Node.js Koa2使用JWT進(jìn)行鑒權(quán)的方法示例
這篇文章主要介紹了Node.js Koa2使用JWT進(jìn)行鑒權(quán)的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
kafka調(diào)試中遇到Connection to node -1 could not be established. Br
這篇文章主要介紹了kafka調(diào)試中遇到Connection to node -1 could not be established. Broker may not be available的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-09-09
node.js事件循環(huán)機(jī)制及與js區(qū)別詳解
這篇文章主要為大家介紹了node.js事件循環(huán)機(jī)制及與js區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09

