开发Egret游戏的时候,策划经常性使用Excel操作数据。这些数据在前端不能以个整文件读取,但是Excel的格式实际上是xml,主要改成后缀zip 解压就能看到内部文件的格式。前端所需要的格式仅仅是在Excel改造后的格式。c#开发操作Excel,微软提供了强劲的API的支持。然而在其他语法开发如PHP 或者js的库里面都有这些库来完成解析Excel的操作,非常方便。除此之外,在开发过程也有使用数据库进行数据添加。

1 安装Excel解析

进入该网址https://www.npmjs.com/package/node-xlsx , 你可以看到相应的案例使用用法。我们需要进行安装依赖库,进入cmd 运行,输入 npm install node-xlsx。该地址会较慢需要等待一会。安装完后,本地就会多了node_modules 模块,点击进入后会发现我们的依赖库已经下载到本地了。

(注:测试环境window 7 已经安装nodejs 和 python .net等常用的开发环境)

esri json格式_JSON

2 执行Excel解析

创建一个文件为exceldemo.js.

var xlsx = require("node-xlsx");
var fs = require('fs');
var list = xlsx.parse("Camp.xlsx");
//console.log(JSON.stringify(list));
console.log(list);
writeFile("all.json",JSON.stringify(list));
function writeFile(fileName,data)
{  
  fs.writeFile(fileName,data,'utf-8',complete);
  function complete(err)
  {
      if(!err)
      {
          console.log("文件生成成功");
      }   
  } 
}

成代码输入后,进行对代码测试。进行运行终端,输入 node exceldemo.js。代码很简洁,但是我们不难发现内部做了很多的工作。这些工作也帮助我们简化了Excel生成json的操作。对项目数据进行定制需求有一些作用。我们还可以使用批量读取一个文件内的所有Excel文件进行批量化处理。这些数据将有助于我们制定符合项目业务的数据内容。

3 导出JSON数据

Excel 导出JSON 在游戏开发中经常做的一件事,策划会在Excel表填写相应的数值数据,让前端根据数值配置表进行读取。前端能利用直接读取Excel访问到Excel的数据,但是这样的方式不够轻量化,解析的时间会增加。因此在业务上不适合这样的直接做法。然而各大公司会根据这样的方式配置读取他们的数据,方式是各种各样,核心一点是映射表格里面的数据提供使用满足到开发的定制需求。
下面我们做一个案例,我们先创建一个Excel表格,里面前三行用于填写一些相关的数据,用于解析使用。第一行名称,只是显示使用,第二是数据类型,第三是字段名称。其中数据类型,可以是我们熟悉整形,浮点型,字符串,还可以是数组。目前我们先支持整形,浮点型 和字符串。三个足够我们应付这个案例。

esri json格式_json_02

接下来,我们会根据上面的代码块进行进一步解析。

var xlsx = require("node-xlsx");
var fs = require('fs');
var list = xlsx.parse("Camp.xlsx");
praseExcel(list);
//解析Excel
function praseExcel(list)
{
    console.log("qqq");
    for (var i = 0; i < list.length; i++) 
    {
         var excleData = list[i].data;
         var sheetArray  = [];
         var typeArray =  excleData[1];
         var keyArray =  excleData[2];
        for (var j = 3; j < excleData.length ; j++)
        {
             var curData = excleData[j];
             if(curData.length == 0) continue;
             var item = changeObj(curData,typeArray,keyArray);
             sheetArray.push(item);
        }
        if(sheetArray.length >0) 
        writeFile(list[i].name+".json",JSON.stringify(sheetArray));
    }
   console.log("qqq");
}
//转换数据类型
function changeObj(curData,typeArray,keyArray)
{
     var obj = {};
    for (var i = 0; i < curData.length; i++) 
    {
        //字母 
        obj[keyArray[i]] = changeValue(curData[i],typeArray[i]);  
    }
    return obj;
}
function changeValue(value,type)
{
    if(value == null || value =="null") return ""
    if(type =="int") return Math.floor(value);
    if(type =="Number") return value;
    if(type =="String") return value;  
}
//写文件
function writeFile(fileName,data)
{  
  fs.writeFile(fileName,data,'utf-8',complete);
  function complete(err)
  {
      if(!err)
      {
          console.log("文件生成成功");
      }   
  } 
}

执行命令,生成一个json文档。

esri json格式_数据_03

打开后, 生成对应文档。可以看到字段和相应的数据都匹配对应上了。

esri json格式_esri json格式_04

4 批量化导出JSON数据

到了这个时候,只是导出一个文件操作。这一点往往不足以完成常规的工作。如果希望想导出更多文件,这个时候就要考虑到批量化的操作完成多表的操作。

5 最后

从案例来讲,这个库可以满足到一两个表来导出,至于复杂的表格和设计还是需求探讨。以及使用过程当中是否有一些不可抗拒的bug 还是要在使用项目中一点点碰。