Node.js中利用js-xlsx處理xlsx文件的實現(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
概念
在使用這個庫之前,先介紹庫中的一些概念。
workbook
對象,指的是整份 Excel 文檔。我們在使用 js-xlsx
讀取 Excel 文檔之后就會獲得 workbook
對象。
worksheet
對象,指的是 Excel 文檔中的表。我們知道一份 Excel 文檔中可以包含很多張表,而每張表對應(yīng)的就是 worksheet
對象。
cell
對象,指的就是 worksheet
中的單元格,一個單元格就是一個 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'] // 返回一個包含 range 對象的列表,[ {s: { r: 0, c: 0 }, c: { r: 2, c: 1 } } ]
實戰(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)建該文件夾,請在'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文件的實現(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)的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08kafka調(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的解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-09-09node.js事件循環(huán)機(jī)制及與js區(qū)別詳解
這篇文章主要為大家介紹了node.js事件循環(huán)機(jī)制及與js區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09