From 2109d3ca906a871865381a693e17c21cd0156e16 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 31 Oct 2017 21:10:06 +0800 Subject: [PATCH] feature:add #id type --- README.md | 8 +++++++ lib/xlsx-to-json.js | 57 ++++++++++++++++++++++++++++++++++++++------- package.json | 2 +- 3 files changed, 58 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 9741c11..53c7cbd 100644 --- a/README.md +++ b/README.md @@ -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 * 修复中文自动追加拼音问题。 * 修复日期解析错误。 @@ -119,6 +124,7 @@ npm install * boolean-array 布尔数组。 * string-array 字符串数组。 * object-array 对象数组。 +* id 主键类型(当表中有这个类型的时候,json会以map格式输出,否则以数组格式输出)。 ### 表头规则 * 基本数据类型(string,number,bool)时候,一般不需要设置会自动判断,但是也可以明确声明数据类型。 @@ -129,6 +135,8 @@ npm install * 基本类型数组:此列表头的命名形式 `列名#[]` 。 * 对象:此列表头的命名形式 `列名#{}` 。 * 对象数组:此列表头的命名形式`列名#[{}]` 。 +* 主键::此列表头的命名形式`列名#id` 。 + ### 数据规则 * 关键符号都是半角符号。 diff --git a/lib/xlsx-to-json.js b/lib/xlsx-to-json.js index ee674dd..cd287e6 100755 --- a/lib/xlsx-to-json.js +++ b/lib/xlsx-to-json.js @@ -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 = { /** @@ -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); } @@ -100,7 +123,8 @@ function parseHead(sheet, headIndex) { let head = { names: [], types: [], - index: headIndex + index: headIndex, + sheetType: SheetType.NORMAL }; headRow.forEach(cell => { @@ -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); @@ -123,6 +150,7 @@ function parseHead(sheet, headIndex) { function parseRow(row, rowIndex, head) { let result = {}; + let id; row.forEach((cell, index) => { @@ -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)) { @@ -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; } /** diff --git a/package.json b/package.json index 457aa4f..5783352 100644 --- a/package.json +++ b/package.json @@ -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",