在Node.js中利用js-xlsx处理xlsx文件

  • Post author:
  • Post category:其他




简介

本文介绍用 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': { ... },
            ...
        }
    }
}



用法



基础用法

  1. 用 XLSX.readFile 打开 Excel 文件,返回 workbook
  2. 用 workbook.SheetNames 获取表名
  3. 用 workbook.Sheets[xxx] 通过表名获取表格
  4. 按自己的需求去处理表格
  5. 生成新的 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对应关系表格")
}



参考资料

在这里插入图片描述

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

听说 👉 点赞 👈 的人运气不会太差,每一天都会元气满满哦 嘿嘿!!! ❤️ ❤️ ❤️

大家的支持就是我坚持下去的动力。点赞后不要忘了👉 关注 👈我哦!



版权声明:本文为qq_35844400原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。