如何优雅的处理Excel数据 | 社区征文

前言

相信很多人都遇到过游戏数据处理困难的问题

比如…当策划给了你一个很复杂的excel时

最常用的解决方案是将excel转换为json

这边给大家推荐一款excel转json工具

e24bce05ec8fb651ec40a92cd6dc5d3f10eaa79e

excel-convert是一个开源、可自定义解析的excel转换工具

它的优点在于可以对解析方式进行自定义


环境

NodeJS

开始使用

一.创建一个nodejs项目

npm i excel-convert -S

二.新建一个excel表格

然后填入这些数据,并保存到node项目的一级目录下

2022-03-18-10-30-46-image 2022-03-18-10-33-38-image

其中@表示这个是一个正向的表格,$k表示这一行为键,$t表示这一行为数据的类型

工具内置以下常用数据类型

类型 示例 默认值
number 1 0
string 123 ‘’
boolean true false
number[] 1,2,3,4 [ ]
string[] a,b,c,d [ ]
boolean[] true,false,true [ ]
object {“num”:1} null

数据类型的默认值都可以通过以下方法修改

setDefaultTypeValue(type, value)

具体的使用方式可以参考工具介绍GitHub - kaxifakl/excel-convert


三.转换数据

新建一个index.js,填入以下代码,然后运行node index.js

let excelconvert = require('excel-convert');

let fs = require('fs');

let buffer = fs.readFileSync('test.xlsx');
let jsonData = excelconvert.convert(new Uint8Array(buffer), 'test.xlsx');

console.log(jsonData);

不出意外命令行中会打印出以下结果,其中Sheet1为工作表的名字

{
  Sheet1: [  
    { id: 1, name: '张三' },
    { id: 2, name: '李四' },
    { id: 3, name: '王五' }
  ]
}

当一个excel中有多个工作表时,结果可能是这样的

{
  Sheet1: [  
    { id: 1, name: '张三' },
    { id: 2, name: '李四' },
    { id: 3, name: '王五' }
  ],
  Sheet2: [  
    { id: 1, name: '张三' },
    { id: 2, name: '李四' },
    { id: 3, name: '王五' }
  ],
  ...
}

四.数据结构转换

在导出json数据对象后,接下来的数据转变可完全自定义

工具中也提供了常用的将数组转为对象的方法

excelconvert.arrayToObject(jsonData.Sheet1, 'id')
// {
//     '1': { id: 1, name: '张三' },
//     '2': { id: 2, name: '李四' },
//     '3': { id: 3, name: '王五' }
// }

五.自定义解析

当我们需要定制数据类型时,我们就需要用到自定义解析

比如我们需要一个数据包含年龄、性别的结构

{age:number,sex:string}

我们在表格中添加了新的数据类型info,它的第一个数据是年龄,第二个数据是性别

2022-03-18-11-17-11-image

同时,我们需要在转换之前添加新的info这个数据类型的解析方式

let excelconvert = require('excel-convert');

let fs = require('fs');

//添加自定义数据类型解析
excelconvert.addCustomTypeParse("info", (data) => {
    let args = data.split(',');  //data 20,男
    return { age: parseFloat(args[0]), sex: args[1] }
})

let buffer = fs.readFileSync('./test.xlsx');

let jsonData = excelconvert.convert(new Uint8Array(buffer), 'test.xlsx');

console.log(jsonData);

最后可以得到结果

{
    "Sheet1": [
        {
            "id": 1,
            "name": "张三",
            "custom": {
                "age": 20,
                "sex": "男"
            }
        },
        {
            "id": 2,
            "name": "李四",
            "custom": {
                "age": 21,
                "sex": "男"
            }
        },
        {
            "id": 3,
            "name": "王五",
            "custom": {
                "age": 24,
                "sex": "女"
            }
        }
    ]
}

六.常用优化

1.将nodejs工程放于cocos工程下,通过nodejs和工具将excel转换为json或者ts文件,将文件直接指向到cocos项目assets下

2.使用ts文件可以有字段提示,使用json则需要加载一次json文件

3.制定统一的文件名、工作表名格式

4.关于数据加密,可以将json转换为进制文件,或对json字符串进行加密,成熟的工具有BJSON,Protobuf等

结语

最后祝大家能在新的一年里能够拥抱双休,远离加班!

8赞

感谢分享!

感谢最后一句话的祝福

已经进入双休了

ReferenceError: globalThis is not defined 不能用啊

module.exports = excelconvert;

// globalThis.excelconvert = module.exports = excelconvert;

修改这样就好了 我怀疑你在让我帮你修改bug

原来是社区征文…加油苹果手表一定是你的

棒棒棒棒哒~

nodejs下咋会没有globalThis呢

人生苦短,我用node-xlsx

需要更新下nodejs到v12以上

多个选择其实也不错

为什么不直接解析csv 变成json呢?

有个叫做鲁班excel的处理工具,各个语言都能适配,以前我也自己写,后面都用这个了

一般都是用python 自己撸 自定义格式

直接把.xlsx格式作为.bin加载 然后写个小demo批量上传 用jszip读取里面的xml(只有.xlsx改为压缩包后缀后里面是.xml格式的工作表) 之后自定义解析想怎么写怎么写 最后保存为json再用jszip压缩后down下来搞定

与其用别人的“自定义解析”和“花样格式” 不如朴实无华一点或者自己撸一个

另外拓展.xlsx格式的加载有个好处 就是测试环境下策划可以直接拉项目到本地直接调表测数值

项目中策划配表一般都用excel

先赞后看,加油