Skip to content

Commit

Permalink
feature:add #id type
Browse files Browse the repository at this point in the history
  • Loading branch information
zk-luke committed Oct 31, 2017
1 parent 30d3e48 commit 2109d3c
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 9 deletions.
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
> 让excel支持表达复杂的json格式,将xlsx文件转成json。
### 日志
* 2017-10-31 v0.3.1
* 修复: 对象类型列,对象值里面有冒号值解析错误。
* 功能: 增加#id类型,主键索引(json格式以map形式输出,无id的表以数组格式输出)。
* 功能: 输出的json是否压缩可以在config.json里面配置。

* 2017-10-26 v0.3.0
* 修复中文自动追加拼音问题。
* 修复日期解析错误。
Expand Down Expand Up @@ -119,6 +124,7 @@ npm install
* boolean-array 布尔数组。
* string-array 字符串数组。
* object-array 对象数组。
* id 主键类型(当表中有这个类型的时候,json会以map格式输出,否则以数组格式输出)。

### 表头规则
* 基本数据类型(string,number,bool)时候,一般不需要设置会自动判断,但是也可以明确声明数据类型。
Expand All @@ -129,6 +135,8 @@ npm install
* 基本类型数组:此列表头的命名形式 `列名#[]`
* 对象:此列表头的命名形式 `列名#{}`
* 对象数组:此列表头的命名形式`列名#[{}]`
* 主键::此列表头的命名形式`列名#id`


### 数据规则
* 关键符号都是半角符号。
Expand Down
57 changes: 49 additions & 8 deletions lib/xlsx-to-json.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,31 @@ const moment = require('moment');

let arraySeparator;

/**
* sheet(table) 的类型
* 影响输出json的类型
* 当有#id类型的时候 表输出json的是map形式(id:{xx:1})
* 当没有#id类型的时候 表输出json的是数组类型 没有id索引
*/
const SheetType = {
/**
* 普通表
*/
NORMAL: 0,

/**
* 有主外键关系的主表
* primary key
*/
PRIMARY: 1,

/**
* 有主外键关系的附表
* foreign key
*/
FOREIGN: 2
};

module.exports = {

/**
Expand All @@ -20,11 +45,9 @@ module.exports = {
toJson: function(src, dest, config) {

let headIndex = config.xlsx.head - 1;
let separator = config.xlsx.arraySeparator;
arraySeparator = config.xlsx.arraySeparator;
let uglifyJson = config.json.uglify;

arraySeparator = separator;

if (!fs.existsSync(dest)) {
fs.mkdirSync(dest);
}
Expand Down Expand Up @@ -100,7 +123,8 @@ function parseHead(sheet, headIndex) {
let head = {
names: [],
types: [],
index: headIndex
index: headIndex,
sheetType: SheetType.NORMAL
};

headRow.forEach(cell => {
Expand All @@ -109,8 +133,11 @@ function parseHead(sheet, headIndex) {

if ((cell + '').indexOf('#') !== -1) {
let pair = cell.split('#');
name = pair[0];
name = pair[0].trim();
type = pair[1].toLowerCase().trim();
if (type === 'id') {
head.sheetType = SheetType.PRIMARY;
}
}

head.types.push(type);
Expand All @@ -123,6 +150,7 @@ function parseHead(sheet, headIndex) {
function parseRow(row, rowIndex, head) {

let result = {};
let id;

row.forEach((cell, index) => {

Expand All @@ -134,10 +162,11 @@ function parseRow(row, rowIndex, head) {
switch (type) {
case 'id': // number string boolean
if (isNumber(cell)) {
result[name] = Number(cell);
id = Number(cell);
} else {
result[name] = cell;
id = cell;
}
result[name] = id;
break;
case 'basic': // number string boolean
if (isNumber(cell)) {
Expand Down Expand Up @@ -185,7 +214,19 @@ function parseRow(row, rowIndex, head) {
}
}
});
return result;

switch (head.sheetType) {
case SheetType.NORMAL:
return result;
case SheetType.PRIMARY:
let map = {};
map[id] = result;
return map;
default:
throw '无法识别表格类型!';
}

// return result;
}

/**
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"main": "index.js",
"name": "xlsx2json",
"main": "index.js",
"version": "0.3.0",
"description": "convert complex xlsx to json",
"homepage": "https://github.com/koalaylj/xlsx2json",
Expand Down

0 comments on commit 2109d3c

Please sign in to comment.