让excel 表达复杂json格式,并导出json。
发布于 10个月前 作者 koalaylj 1784 次浏览

xlsx2json

项目地址 xlsx2json master

作用

  • 让excel表达复杂的json格式
  • 将excel转成json
  • 将json导入mongo数据库。

为什么要做这个项目?

开发游戏的时候,策划用的是excel,而我们的数据库是mongo。 我们的工作流是策划写excel,导出json,然后导入mongo数据库。

因为excel是二维的,无法表达mongo文档里面数组属性等复杂结构。 按excel结构来设计mongo数据库,和关系型数据库以同样的方式设计mongo, 会使设计mongo受限并无法使用某些nosql特性。

网上搜了下,有一个clojure项目 excel-to-json 可以完成这个功能。但是不懂clojure表示压力很大而且有些功能不符合我们的需求。 基于以上原因,就搞了这个项目。某些想法也是借鉴了excel-to-json ,在此表示感谢。

使用说明

需要将mongo的bin目录和nodejs安装目录放到环境变量下。

  • 查看帮助:执行node index.js -h 查看使用帮助;
  • 导出json:执行 node index.js [-e|--export] 即可将 ./excel/*.xlsx 文件导出到 ./json 下。 或者直接双击export.bat
  • json导入mongo:先要修改下index.js里数据库配置 db, 执行node index.js -i|--import即可将./json下所有的json文件导入到数据库中。 collection的名字就是json文件的名字。 或者直接双击import.bat

示例1 test.xlsx

iddescflagotherid#[]words#[]map#[]data#{}hero#[{}]
123descriptiontrue1,2哈哈,呵呵true,truea:123;b:45id:2;level:30,id:3;level:80
456描述false3,5,8shit,my godfalse,truea:11;b:22id:9;level:38,id:17;level:100

输出如下:

[{
    "id": 123,
    "desc": "description",
    "flag": true,
    "otherid": [1, 2],
    "words": ["哈哈", "呵呵"],
    "map": [true, true],
    "data": {
        "a": 123,
        "b": 45
    },
    "hero": [
      {"id": 2,"level": 30}, 
      {"id": 3,"level": 80}
    ]
}, {
    "id": 456,
    "desc": "描述",
    "flag": false,
    "otherid": [3, 5, 8],
    "words": ["shit", "my god"],
    "map": [false, true],
    "data": {
        "a": 11,
        "b": 22
    },
    "hero": [
      {"id": 9, "level": 38 }, 
      {"id": 17,"level": 100}
    ]
}]

支持以下数据类型

  • number 数字类型
  • boolean 布尔
  • string 字符串
  • object 对象 {a:1,b:false} // 对象内暂时不能有数组,也不能对象嵌套对象,此功能正在加入。
  • number-array 数字数组
  • boolean-array 布尔数组
  • string-array 字符串数组
  • object-array 对象数组

表头规则

  • 字段是基本数据类型(string,number,boolean)时候,不需要特殊设置。
  • 字段是基本类型数组:此列表头的命名形式 列名#[]
  • 字段是对象:此列表头的命名形式 列名#{}
  • 字段是对象数组:此列表头的命名形式列名#[{}]

数据规则

  • 关键符号都是半角符号。
  • 数组使用逗号,分割。
  • 对象属性使用分号;分割。

原理说明

  • 依赖 node-xlsx 这个npm项目解析xlsx文件。
  • 其实xlsx就是个zip文件,解压出来都是xml。 有一个xml存的string,有相应个xml存的sheet。 通过解析xml解析出excel数据(json格式),这个就是node-xlsx 做的工作。
  • 本项目只需利用 node-xlsx 解析xlsx文件,然后拼装自定的json数据。

补充

  • 实验环境:win7_x64 + nodejs_v0.10.25
  • 如有问题可以到QQ群内讨论:223460081
  • 项目中的某些工具函数测试用例请参见我的gist js:validate & js:convert。

项目当前状态

  • 进行中的功能:增加嵌套对象和嵌套数组支持。
  • 添加测试用例。
9 回复

熟悉markdown童鞋,能指导下table怎么写么。我那里不知道为什么空出来那么大一块空白??

table 应该是解析器问题了… 得问 @jiyinyiyong

Table 问题… 编译出来很多的 <p></p>, 不清楚具体原因, 不过原文用了 HTML 标签而不是 Markdown 的格式… 是有点怪, 我到晚上看下, 另外表格布局也要加强的 https://github.com/cnodejs/nodeclub/issues/319

我用github那种方式整table在这里显示不对,就看发帖页面右面那个 “Markdown 文档”的连接 看得table的用法,table还有别的写法么?

语法应该没什么问题了…应该就是解析器生成问题了…

对了…那个是标准md文档…table 得用 标签才行…那写起来多累啊… 其实这里支持GFM 的格式,表格 可以这样优雅的写

|表头1|表头2|
|:--|:--|
|内容1|内容2|
表头1表头2
内容1内容2

@youxiachai 嗯 好了 太感谢啦~,原来得用,之前没写冒号 结果乱了。

回到顶部