Skip to content
This repository was archived by the owner on Feb 27, 2026. It is now read-only.

Commit 6413339

Browse files
authored
Merge pull request #32 from koalaylj/dev
[feature]:主从表支持。
2 parents fa33c63 + 0b2aa31 commit 6413339

File tree

12 files changed

+581
-359
lines changed

12 files changed

+581
-359
lines changed

README.md

Lines changed: 100 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,10 @@
22
> 让excel支持复杂的json格式, 将xlsx文件转成json。
33
44
### 更新日志
5-
> 本次大版本更新为不兼容更新,不兼容部分涉及对象列、对象数组列和数组列。
6-
* 2018-6-5 v1.0.0
7-
* feature: sheet名字以`!`开头则不导出此表。
8-
* feature: 列名字以`!`开头则不导出此列。
9-
* feature: 对象列支持对象嵌套,写法和JS中对象写法一致。
10-
* feature: 数组可嵌套数组和对象,和JS中数组写法一致(除了最外层不需要写中括号[])。
11-
* fix: 去掉自定义数组分隔符。
12-
* fix: excel单元格空的时候json中无此列的key。
13-
* modify: 去掉对象数组列类型,统一为数组。
14-
* modify: 去掉无用依赖,更新依赖库,精简代码。
5+
* 2018-6-8 v1.1.0
6+
- feature: 外键功能支持。
7+
- feature: 引入了一个新的库,更新(`git pull`)完需要运行下`npm install`安装依赖。
8+
- fix: 少量bug修复。
159

1610
### 分支
1711

@@ -53,7 +47,12 @@ npm install
5347
"dest": "./json"
5448
},
5549

56-
"ts":false,//是否导出d.ts(for typescript)
50+
/**
51+
* 是否导出d.ts(for typescript)
52+
* 一张表格只导出一个d.ts文件
53+
* true:压缩,false:不压缩(便于阅读的格式)
54+
*/
55+
"ts":false,//
5756

5857
"json": {
5958
/**
@@ -70,10 +69,10 @@ npm install
7069
* 执行`node index.js -h` 查看使用帮助。
7170
* 命令行传参方式使用:执行 node `index.js --help` 查看。
7271

73-
#### 示例1(参考./excel/test.xlsx)
72+
#### 示例1 基本功能(参考./excel/basic.xlsx)
7473
![excel](./docs/image/excel-data.png)
7574

76-
输出如下(因为设置了id列,输出hash map格式,如果无id列则输出数组格式):
75+
输出如下(因为设置了`#id`列,输出`JsonHash`格式,如果无`#id`列则输出数组格式):
7776

7877
```json
7978
{
@@ -112,15 +111,67 @@ npm install
112111
}
113112
```
114113

114+
如果将第一列的`id#id`换成`id#string`则会输出`JsonArray`格式:
115+
116+
```json
117+
[
118+
{
119+
"id": "1111",
120+
"name": "风暴之灵",
121+
"slogen": ["风暴之灵已走远","在这场风暴里没有安全的港湾啊,昆卡!"],
122+
"skill": {
123+
"R": {
124+
"name": "残影",
125+
"冷却时间": [3.5,3.5,3.5,3.5],
126+
"作用范围": 260,
127+
"主动技能": true,
128+
"levels": [
129+
{"level": 1,"damage": 140,"mana": 70},
130+
{"level": 2,"damage": 180,"mana": 80}
131+
]
132+
},
133+
"E": {
134+
"name": "电子漩涡",
135+
"冷却时间": [21,20,19,18],
136+
"主动技能": true,
137+
"levels": [
138+
{"level": 1,"time": 1,"cost": 100,"distance": 100},
139+
{"level": 2,"time": 1.5,"cost": 110,"distance": 150}
140+
]
141+
}
142+
}
143+
},
144+
{
145+
"id": "1112",
146+
"name": "幽鬼",
147+
"slogen": null,
148+
"skill": null
149+
}
150+
]
151+
```
152+
153+
### 示例2 复杂表格拆分(参考./excel/master-slave.xlsx)
154+
155+
![excel](./docs/image/master-slave.png)
156+
157+
如果一个表格某一列是`#[]` 或者`#{}`类型的时候,防止表格过于复杂,可将主表拆分。如上图所示。
158+
159+
比如上图中的 `表1``boss#{}``reward#[]`列比较复杂,可以将之拆为三个表:`表2、3、4`,将`表1`中的 `boss#{}`拆成`表3``表1`中的`reward#[]`拆成表4。`表2`为主表,`表3、4`为从表。
160+
161+
162+
115163
### 支持以下数据类型
116164

117-
* number 数字类型。
118-
* boolean 布尔。
119-
* string 字符串。
120-
* date 日期类型。
121-
* object 对象,同JS对象一致。
122-
* array 数组,同JS数组一致。
123-
* id 主键类型(当表中有id类型时,json会以hash map格式输出,否则以数组格式输出)。
165+
* `number` 数字类型。
166+
* `boolean` 布尔。
167+
* `string` 字符串。
168+
* `date` 日期类型。
169+
* `object `对象,同JS对象一致。
170+
* `array` 数组,同JS数组一致。
171+
* `id` 主键类型(当表中有id类型时,json会以hash格式输出,否则以array格式输出)。
172+
* `id[]` 主键数组,只存在于从表中。
173+
174+
124175

125176
### 表头规则
126177

@@ -129,18 +180,40 @@ npm install
129180
* 数字类型:命名形式 `列名#number`
130181
* 日期类型:`列名#date` 。日期格式要符合标准日期格式。比如`YYYY/M/D H:m:s` or `YYYY/M/D` 等等。
131182
* 布尔类型:命名形式 `列名#bool`
132-
* 数组:命名形式 `列名#[]`
133-
* 对象:命名形式 `列名#{}`
134-
* 主键:命名形式`列名#id` ,设置此将会输出为hash map 格式,否则为数组格式。
183+
* 数组:命名形式 `列名#[]`
184+
* 对象:命名形式 `列名#{}`
185+
* 主键:命名形式`列名#id` ,表中只能有一列。
186+
* 主键数组:命名形式`列名#id[]`,表中只能有一列,只存在于从表中。
135187
* 列名字以`!`开头则不导出此列。
136188

189+
190+
191+
### sheet规则
192+
193+
- sheet名字以``开头则不导出此表。
194+
- 从表的名字 `从表名字@主表名字`,主表必须在从表的前面。
195+
196+
197+
198+
### 主从表相关规则(master/slave)
199+
200+
- master表必须是hash类型,即必须有`#id`列。
201+
- slave表名字 `slave名字@master名字`,master表的顺序必须在slave表的前面。
202+
- slave表中必须要有`#id`列或者`#id[]`列。
203+
- 如果将master表中的`#{}列`拆分,则slave表中应为`#id`,值为master表的id。
204+
- 如果将master表中的`#[]列`拆分,则slave表中应为`#id[]`,值为master表的id。
205+
- 具体请看示例`./excel/master-salve.xlsx`
206+
207+
208+
137209
### 注意事项
138210

139211
* 解析excel字符串的时候用到`eval()`函数,如果生产环境下excel数据来自用户输入,会有注入风险请慎用。
140-
* 关键符号都是英文半角符号,和JS中一致。
141-
* 对象写法同JS中对象写法一致。
142-
* 数组写法同JS中数组写法一致(只是最外层数组不需要写中括号[])。
143-
* sheet名字以``开头则不导出此表。
212+
* 关键符号都是英文半角符号,和JSON要求一致。
213+
* 对象写法同JavaScript中对象写法一致(不会JS的同学可理解为JSON的key不需要双引号其他和JSON一样)。
214+
* 数组写法同JavaScript中数组写法一致(不会JS的同学可理解为JSON的key不需要双引号其他和JSON一样)。
215+
216+
144217

145218
### TODO
146219

config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"src": "./excel/**/[^~$]*.xlsx",
55
"dest": "./json"
66
},
7-
"ts": false,
7+
"ts": true,
88
"json": {
99
"uglify": false
1010
}

docs/image/master-slave.png

60 KB
Loading
Binary file not shown.

excel/master-slave.xlsx

17.8 KB
Binary file not shown.

index.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,15 @@ function exportJson(args) {
5959
throw err;
6060
}
6161

62-
files.forEach(function (element, index, array) {
63-
xlsx.toJson(path.join(__dirname, element), path.join(__dirname, config.xlsx.dest), config);
62+
files.forEach(item => {
63+
xlsx.toJson(path.join(__dirname, item), path.join(__dirname, config.xlsx.dest));
6464
});
6565

6666
});
6767
} else {
6868
if (args instanceof Array) {
69-
args.forEach(function (element, index, array) {
70-
xlsx.toJson(path.join(__dirname, element), path.join(__dirname, config.xlsx.dest), config);
69+
args.forEach(item => {
70+
xlsx.toJson(path.join(__dirname, item), path.join(__dirname, config.xlsx.dest));
7171
});
7272
}
7373
}

0 commit comments

Comments
 (0)