From 0b2aa31711a5eb8e21998ffa898736782974c306 Mon Sep 17 00:00:00 2001 From: yulijun Date: Fri, 8 Jun 2018 20:15:40 +0800 Subject: [PATCH] =?UTF-8?q?[feature]:=E4=B8=BB=E4=BB=8E=E8=A1=A8=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 127 ++++++++--- config.json | 2 +- docs/image/master-slave.png | Bin 0 -> 61473 bytes excel/{test.xlsx => basic.xlsx} | Bin 12183 -> 12187 bytes excel/master-slave.xlsx | Bin 0 -> 18188 bytes index.js | 8 +- lib/parser.js | 369 ++++++++++++++++++++++++++++++ lib/types.js | 43 ++++ lib/xlsx-to-json.js | 388 +++++--------------------------- package.json | 3 +- test/heroes.xlsx | Bin 10944 -> 0 bytes test/stages.xlsx | Bin 16751 -> 0 bytes 12 files changed, 581 insertions(+), 359 deletions(-) create mode 100644 docs/image/master-slave.png rename excel/{test.xlsx => basic.xlsx} (50%) create mode 100644 excel/master-slave.xlsx create mode 100644 lib/parser.js create mode 100644 lib/types.js delete mode 100644 test/heroes.xlsx delete mode 100644 test/stages.xlsx diff --git a/README.md b/README.md index 0be92ea..3b56582 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,10 @@ > 让excel支持复杂的json格式, 将xlsx文件转成json。 ### 更新日志 -> 本次大版本更新为不兼容更新,不兼容部分涉及对象列、对象数组列和数组列。 -* 2018-6-5 v1.0.0 - * feature: sheet名字以`!`开头则不导出此表。 - * feature: 列名字以`!`开头则不导出此列。 - * feature: 对象列支持对象嵌套,写法和JS中对象写法一致。 - * feature: 数组可嵌套数组和对象,和JS中数组写法一致(除了最外层不需要写中括号[])。 - * fix: 去掉自定义数组分隔符。 - * fix: excel单元格空的时候json中无此列的key。 - * modify: 去掉对象数组列类型,统一为数组。 - * modify: 去掉无用依赖,更新依赖库,精简代码。 +* 2018-6-8 v1.1.0 + - feature: 外键功能支持。 + - feature: 引入了一个新的库,更新(`git pull`)完需要运行下`npm install`安装依赖。 + - fix: 少量bug修复。 ### 分支 @@ -53,7 +47,12 @@ npm install "dest": "./json" }, - "ts":false,//是否导出d.ts(for typescript) + /** + * 是否导出d.ts(for typescript) + * 一张表格只导出一个d.ts文件 + * true:压缩,false:不压缩(便于阅读的格式) + */ + "ts":false,// "json": { /** @@ -70,10 +69,10 @@ npm install * 执行`node index.js -h` 查看使用帮助。 * 命令行传参方式使用:执行 node `index.js --help` 查看。 -#### 示例1(参考./excel/test.xlsx) +#### 示例1 基本功能(参考./excel/basic.xlsx) ![excel](./docs/image/excel-data.png) -输出如下(因为设置了id列,输出hash map格式,如果无id列则输出数组格式): +输出如下(因为设置了`#id`列,输出`JsonHash`格式,如果无`#id`列则输出数组格式): ```json { @@ -112,15 +111,67 @@ npm install } ``` +如果将第一列的`id#id`换成`id#string`则会输出`JsonArray`格式: + +```json +[ + { + "id": "1111", + "name": "风暴之灵", + "slogen": ["风暴之灵已走远","在这场风暴里没有安全的港湾啊,昆卡!"], + "skill": { + "R": { + "name": "残影", + "冷却时间": [3.5,3.5,3.5,3.5], + "作用范围": 260, + "主动技能": true, + "levels": [ + {"level": 1,"damage": 140,"mana": 70}, + {"level": 2,"damage": 180,"mana": 80} + ] + }, + "E": { + "name": "电子漩涡", + "冷却时间": [21,20,19,18], + "主动技能": true, + "levels": [ + {"level": 1,"time": 1,"cost": 100,"distance": 100}, + {"level": 2,"time": 1.5,"cost": 110,"distance": 150} + ] + } + } + }, + { + "id": "1112", + "name": "幽鬼", + "slogen": null, + "skill": null + } +] +``` + +### 示例2 复杂表格拆分(参考./excel/master-slave.xlsx) + +![excel](./docs/image/master-slave.png) + +如果一个表格某一列是`#[]` 或者`#{}`类型的时候,防止表格过于复杂,可将主表拆分。如上图所示。 + +比如上图中的 `表1`中 `boss#{}`和 `reward#[]`列比较复杂,可以将之拆为三个表:`表2、3、4`,将`表1`中的 `boss#{}`拆成`表3`,`表1`中的`reward#[]`拆成表4。`表2`为主表,`表3、4`为从表。 + + + ### 支持以下数据类型 -* number 数字类型。 -* boolean 布尔。 -* string 字符串。 -* date 日期类型。 -* object 对象,同JS对象一致。 -* array 数组,同JS数组一致。 -* id 主键类型(当表中有id类型时,json会以hash map格式输出,否则以数组格式输出)。 +* `number` 数字类型。 +* `boolean` 布尔。 +* `string` 字符串。 +* `date` 日期类型。 +* `object `对象,同JS对象一致。 +* `array` 数组,同JS数组一致。 +* `id` 主键类型(当表中有id类型时,json会以hash格式输出,否则以array格式输出)。 +* `id[]` 主键数组,只存在于从表中。 + + ### 表头规则 @@ -129,18 +180,40 @@ npm install * 数字类型:命名形式 `列名#number` 。 * 日期类型:`列名#date` 。日期格式要符合标准日期格式。比如`YYYY/M/D H:m:s` or `YYYY/M/D` 等等。 * 布尔类型:命名形式 `列名#bool` 。 -* 数组:命名形式 `列名#[]`。 -* 对象:命名形式 `列名#{}` 。 -* 主键:命名形式`列名#id` ,设置此将会输出为hash map 格式,否则为数组格式。 +* 数组:命名形式 `列名#[]`。 +* 对象:命名形式 `列名#{}`。 +* 主键:命名形式`列名#id` ,表中只能有一列。 +* 主键数组:命名形式`列名#id[]`,表中只能有一列,只存在于从表中。 * 列名字以`!`开头则不导出此列。 + + +### sheet规则 + +- sheet名字以`!`开头则不导出此表。 +- 从表的名字 `从表名字@主表名字`,主表必须在从表的前面。 + + + +### 主从表相关规则(master/slave) + +- master表必须是hash类型,即必须有`#id`列。 +- slave表名字 `slave名字@master名字`,master表的顺序必须在slave表的前面。 +- slave表中必须要有`#id`列或者`#id[]`列。 +- 如果将master表中的`#{}列`拆分,则slave表中应为`#id`,值为master表的id。 +- 如果将master表中的`#[]列`拆分,则slave表中应为`#id[]`,值为master表的id。 +- 具体请看示例`./excel/master-salve.xlsx`。 + + + ### 注意事项 * 解析excel字符串的时候用到`eval()`函数,如果生产环境下excel数据来自用户输入,会有注入风险请慎用。 -* 关键符号都是英文半角符号,和JS中一致。 -* 对象写法同JS中对象写法一致。 -* 数组写法同JS中数组写法一致(只是最外层数组不需要写中括号[])。 -* sheet名字以`!`开头则不导出此表。 +* 关键符号都是英文半角符号,和JSON要求一致。 +* 对象写法同JavaScript中对象写法一致(不会JS的同学可理解为JSON的key不需要双引号其他和JSON一样)。 +* 数组写法同JavaScript中数组写法一致(不会JS的同学可理解为JSON的key不需要双引号其他和JSON一样)。 + + ### TODO diff --git a/config.json b/config.json index 8d5ba1d..62e2079 100644 --- a/config.json +++ b/config.json @@ -4,7 +4,7 @@ "src": "./excel/**/[^~$]*.xlsx", "dest": "./json" }, - "ts": false, + "ts": true, "json": { "uglify": false } diff --git a/docs/image/master-slave.png b/docs/image/master-slave.png new file mode 100644 index 0000000000000000000000000000000000000000..e07926389195d020cda8885117088ca5e245f3e8 GIT binary patch literal 61473 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

WheZ%Cg^nLI(KKZLbh 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 literal 0 HcmV?d00001 diff --git a/excel/test.xlsx b/excel/basic.xlsx similarity index 50% rename from excel/test.xlsx rename to excel/basic.xlsx index 9b53cf480fcd5f57444f6f0455e27a5a0709ff98..7f43c517303020ad2765e8e49ef97122f4376bc9 100644 GIT binary patch delta 4626 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 { + xlsx.toJson(path.join(__dirname, item), path.join(__dirname, config.xlsx.dest)); }); }); } else { if (args instanceof Array) { - args.forEach(function (element, index, array) { - xlsx.toJson(path.join(__dirname, element), path.join(__dirname, config.xlsx.dest), config); + args.forEach(item => { + xlsx.toJson(path.join(__dirname, item), path.join(__dirname, config.xlsx.dest)); }); } } diff --git a/lib/parser.js b/lib/parser.js new file mode 100644 index 0000000..9b666b4 --- /dev/null +++ b/lib/parser.js @@ -0,0 +1,369 @@ +const config = require('../config.json'); +const types = require('./types'); +var _ = require('lodash'); + +const DataType = types.DataType; +const SheetType = types.SheetType; + +function parseJsonObject(data) { + var evil = eval; + return evil("(" + data + ")"); +} + +// class StringBuffer { +// constructor(str) { +// this._str_ = []; +// if (str) { +// this.append(str); +// } +// } + +// toString() { +// return this._str_.join(""); +// } + +// append(str) { +// this._str_.push(str); +// } +// } + + +/** + * 解析workbook中所有sheet的设置 + * @param {*} workbook + */ +function parseSettings(workbook) { + + /** + * settings's schema + * { + type: SheetType.NORMAL, + head: [{ + name: "json-key(column name)", + type: "number/string/bool/data/id/[]/{}", + }] + , + slaves: [], + master: { + name: '', + type: DataType.OBJECT + }, + } + */ + + let settings = {}; + + workbook.forEach(sheet => { + + //叹号开头的sheet不输出 + if (sheet.name.startsWith('!')) { + return; + } + + let slave = sheet.name.indexOf('@') >= 0; + let sheet_name = sheet.name; + + let sheet_setting = { + type: SheetType.NORMAL, + master: null, + slaves: [], + head: [] + }; + + if (slave) { + sheet_setting.type = SheetType.SLAVE; + let pair = sheet_name.split('@'); + sheet_name = pair[0].trim(); + sheet_setting.master = pair[1].trim(); + settings[sheet_setting.master].slaves.push(sheet_name); + } + + let head_row = sheet.data[config.xlsx.head - 1]; + + //parsing head setting + head_row.forEach(cell => { + + let head_setting = { + name: cell, + type: DataType.UNKNOWN, + }; + + if (cell.indexOf('#') !== -1) { + let pair = cell.split('#'); + let name = pair[0].trim(); + let type = pair[1].trim(); + + head_setting.name = name; + head_setting.type = type; + + if (!slave && type === DataType.ID) { + sheet_setting.type = SheetType.MASTER; + } + } + sheet_setting.head.push(head_setting); + }); + + settings[sheet_name] = sheet_setting; + }); + + return settings; +} + + +/** + * 解析一个表(sheet) + * + * @param sheet 表的原始数据 + * @param setting 表的设置 + * @return Array or Object + */ +function parseSheet(sheet, setting) { + + let headIndex = config.xlsx.head; + let result = []; + + console.log(' * sheet:', sheet.name); + + if (setting.type === SheetType.MASTER) { + result = {}; + } + + for (let i_row = headIndex; i_row < sheet.data.length; i_row++) { + + let row = sheet.data[i_row]; + + let parsed_row = parseRow(row, i_row, setting.head); + + if (setting.type === SheetType.MASTER) { + + let id_cell = _.find(setting.head, item => { + return item.type === DataType.ID || item.type === DataType.IDS; + }); + + if (!id_cell) { + throw `在表${sheet.name}中获取不到id列`; + } + + result[parsed_row[id_cell.name]] = parsed_row; + + } else { + result.push(parsed_row); + } + } + + return result; +} + +/** + * 解析一行 + * @param {*} row + * @param {*} rowIndex + * @param {*} head + */ +function parseRow(row, rowIndex, head) { + + let result = {}; + let id; + + for (let index = 0; index < head.length; index++) { + let cell = row[index]; + + let name = head[index].name; + let type = head[index].type; + + if (name.startsWith('!')) { + continue; + } + + if (!cell) { + result[name] = null; + continue; + } + + switch (type) { + case DataType.ID: + id = cell + ''; + result[name] = id; + break; + case DataType.IDS: + id = cell + ''; + result[name] = id; + break; + case DataType.UNKNOWN: // number string boolean + if (isNumber(cell)) { + result[name] = Number(cell); + } else if (isBoolean(cell)) { + result[name] = toBoolean(cell); + } else { + result[name] = cell; + } + break; + case DataType.DATE: + if (isNumber(cell)) { + //xlsx's bug!!! + result[name] = numdate(cell); + } else { + result[name] = cell.toString(); + } + break; + case DataType.STRING: + if (cell.toString().startsWith('"')) { + result[name] = parseJsonObject(cell); + } else { + result[name] = cell.toString(); + } + break; + case DataType.NUMBER: + //+xxx.toString() '+' means convert it to number + if (isNumber(cell)) { + result[name] = Number(cell); + } else { + console.warn("type error at [" + rowIndex + "," + index + "]," + cell + " is not a number"); + } + break; + case DataType.BOOL: + result[name] = toBoolean(cell); + break; + case DataType.OBJECT: + result[name] = parseJsonObject(cell); + break; + case DataType.ARRAY: + if (!cell.toString().startsWith('[')) { + cell = `[${cell}]`; + } + result[name] = parseJsonObject(cell); + break; + default: + console.log('无法识别的类型:', '[' + rowIndex + ',' + index + ']', cell, typeof (cell)); + break; + } + } + + return result; +} + +/** + * convert value to boolean. + */ +function toBoolean(value) { + return value.toString().toLowerCase() === 'true'; +} + +/** + * is a number. + */ +function isNumber(value) { + + if (typeof value === 'number') { + return true; + } + + if (value) { + return !isNaN(+value.toString()); + } + + return false; +} + +/** + * boolean type check. + */ +function isBoolean(value) { + + if (typeof (value) === "undefined") { + return false; + } + + if (typeof value === 'boolean') { + return true; + } + + let b = value.toString().trim().toLowerCase(); + + return b === 'true' || b === 'false'; +} + +//fuck node-xlsx's bug +var basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000 +// var dnthresh = basedate.getTime() + (new Date().getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000; +var dnthresh = basedate.getTime() + (new Date().getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000; +// function datenum(v, date1904) { +// var epoch = v.getTime(); +// if(date1904) epoch -= 1462*24*60*60*1000; +// return (epoch - dnthresh) / (24 * 60 * 60 * 1000); +// } + +function numdate(v) { + var out = new Date(); + out.setTime(v * 24 * 60 * 60 * 1000 + dnthresh); + return out; +} +//fuck over + + +module.exports = { + + parseSettings: parseSettings, + + parseWorkbook: function (workbook,settings) { + + // console.log('settings >>>>>', JSON.stringify(settings, null, 2)); + + let parsed_workbook = {}; + + workbook.forEach(sheet => { + + if (sheet.name.startsWith('!')) { + return; + } + + let sheet_name = sheet.name; + + let isSlave = sheet_name.indexOf('@') >= 0; + + if (isSlave) { + sheet_name = sheet_name.split('@')[0].trim(); + } + + let sheet_setting = settings[sheet_name]; + + let parsed_sheet = parseSheet(sheet, sheet_setting); + + parsed_workbook[sheet_name] = parsed_sheet; + + }); + + for (let name in settings) { + if (settings[name].type === SheetType.MASTER) { + + let master_sheet = parsed_workbook[name]; + + settings[name].slaves.forEach(slave_name => { + + let slave_setting = settings[slave_name]; + let slave_sheet = parsed_workbook[slave_name]; + + let key_cell = _.find(slave_setting.head, item => { + return item.type === DataType.ID || item.type === DataType.IDS; + }); + + //slave 表中所有数据 + slave_sheet.forEach(row => { + let id = row[key_cell.name]; + delete row[key_cell.name]; + if (key_cell.type === DataType.IDS) {//array + master_sheet[id][slave_name] = master_sheet[id][slave_name] || []; + master_sheet[id][slave_name].push(row); + } else {//hash + master_sheet[id][slave_name] = row; + } + }); + + delete parsed_workbook[slave_name]; + }); + } + } + + return parsed_workbook; + } +}; \ No newline at end of file diff --git a/lib/types.js b/lib/types.js new file mode 100644 index 0000000..159eccd --- /dev/null +++ b/lib/types.js @@ -0,0 +1,43 @@ +module.exports = { + /** + * sheet(table) 的类型 + * 影响输出json的类型 + * 当有#id类型的时候 表输出json的是map形式(id:{xx:1}) + * 当没有#id类型的时候 表输出json的是数组类型 没有id索引 + */ + SheetType: { + /** + * 普通表 + * 输出JSON ARRAY + */ + NORMAL: 0, + + /** + * 有主外键关系的主表 + * 输出JSON MAP + */ + MASTER: 1, + + /** + * 有主外键关系的附表 + * 输出JSON MAP + */ + SLAVE: 2 + }, + + /** + * 支持的数据类型 + */ + DataType: { + NUMBER: 'number', + STRING: 'string', + BOOL: 'bool', + DATE: 'date', + ID: 'id', + IDS: 'id[]', + ARRAY: '[]', + OBJECT: '{}', + UNKNOWN: 'unknown' + } + +}; \ No newline at end of file diff --git a/lib/xlsx-to-json.js b/lib/xlsx-to-json.js index ac15e21..e5ea493 100755 --- a/lib/xlsx-to-json.js +++ b/lib/xlsx-to-json.js @@ -1,14 +1,12 @@ const xlsx = require('node-xlsx'); const fs = require('fs'); const path = require('path'); +var _ = require('lodash'); +const config = require('../config.json'); +const types = require('./types'); +const parser = require('./parser'); -let _config; - -function parseJsonObject(data) { - var evil = eval; - return evil("(" + data + ")"); -} - +const DataType = types.DataType; // class StringBuffer { // constructor(str) { @@ -27,103 +25,70 @@ function parseJsonObject(data) { // } // } + /** - * sheet(table) 的类型 - * 影响输出json的类型 - * 当有#id类型的时候 表输出json的是map形式(id:{xx:1}) - * 当没有#id类型的时候 表输出json的是数组类型 没有id索引 + * save workbook */ -const SheetType = { - /** - * 普通表 - */ - NORMAL: 0, +function serializeWorkbook(parsedWorkbook, dest) { - /** - * 有主外键关系的主表 - * primary key - */ - PRIMARY: 1, + for (let name in parsedWorkbook) { + let sheet = parsedWorkbook[name]; - /** - * 有主外键关系的附表 - * foreign key - */ - FOREIGN: 2 -}; + let dest_file = path.resolve(dest, name + ".json"); + let resultJson = JSON.stringify(sheet, null, config.json.uglify ? 0 : 2); //, null, 2 -/** - * 支持的数据类型 - */ -const DataType = { - NUMBER: 'number', - STRING: 'string', - BOOL: 'bool', - DATE: 'date', - ID: 'id', - ARRAY: 'array', - OBJECT: 'object', - UNKOWN: 'unkown' -}; + fs.writeFile(dest_file, resultJson, err => { + if (err) { + console.error("error:", err); + throw err; + } + console.log('exported json --> ', path.basename(dest_file)); + }); -/** - * convert worksheet in workbook and save to file for each. - * @param {[Object]} workbook json object of excel's workbook. - * @param {[String]} dest directory for exported json files. - * @param {[Number]} headIndex index of head line. - */ -function parseWorkbook(workbook, dest, headIndex, excelName) { + } - let dtsstring = ""; +} - workbook.forEach(sheet => { - // ignore sheet with external keys, or start with a '!' - if (sheet.name.indexOf('@') === -1 && !sheet.name.startsWith('!')) { - let parsedSheet = parseSheet(sheet, headIndex); +/** + * save dts + */ +function serializeDTS(dest, fileName, settings) { - let dest_file = path.resolve(dest, sheet.name + ".json"); - let resultJson = JSON.stringify(parsedSheet.result, null, _config.json.uglify ? 0 : 2); //, null, 2 - fs.writeFile(dest_file, resultJson, err => { - if (err) { - console.error("error:", err); - throw err; - } - console.log('exported json successfully --> ', path.basename(dest_file)); - }); + let dts = ""; - if (_config.ts) { - dtsstring += formatDTS(sheet.name, parsedSheet.head); - } + for (let name in settings) { + let sheet = settings[name]; + dts += formatDTS(name, settings[name]); + } + + let dest_file = path.resolve(dest, fileName + ".d.ts"); + fs.writeFile(dest_file, dts, err => { + if (err) { + console.error("error:", err); + throw err; } + console.log('exported t.ds --> ', path.basename(dest_file)); }); - if (_config.ts) { - let dest_file_dts = path.resolve(dest, excelName + ".d.ts"); - fs.writeFile(dest_file_dts, dtsstring, err => { - if (err) { - console.error("error:", err); - throw err; - } - console.log('exported t.ds successfully --> ', path.basename(dest_file_dts)); - }); - } } + /** * * @param {String} name the excel file name will be use on create d.ts * @param {Object} head the excel head will be the javescript field */ -function formatDTS(name, head) { - let className = name.substring(0, 1).toUpperCase() + name.substring(1); - let strHead = "interface " + className + "Template {\r\n"; - for (let i = 0; i < head.names.length; ++i) { - if (head.names[i].startsWith('!')) { +function formatDTS(name, setting) { + let className = _.capitalize(name); + let strHead = "interface " + className + " {\r\n"; + for (let i = 0; i < setting.head.length; ++i) { + let head = setting.head[i]; + if (head.name.startsWith('!')) { continue; } let typesDes = "any"; - switch (head.types[i]) { + switch (head.type) { case DataType.NUMBER: { typesDes = "number"; @@ -154,7 +119,7 @@ function formatDTS(name, head) { typesDes = "any"; break; } - case DataType.UNKOWN: + case DataType.UNKNOWN: { typesDes = "any"; break; @@ -164,250 +129,16 @@ function formatDTS(name, head) { typesDes = "any"; } } - strHead += "\t" + head.names[i] + ": " + typesDes + "\r\n"; + strHead += "\t" + head.name + ": " + typesDes + "\r\n"; } - strHead += "}\r\n"; - return strHead; -} - -/** - * parse one sheet and return the result as a json object or array - * - * @param sheet - * @param headIndex - * @private - */ -function parseSheet(sheet, headIndex) { - - console.log(' * sheet:', sheet.name); - - if (sheet && sheet.data) { - - let head = parseHead(sheet, headIndex); - - // console.log('\t parsing head', JSON.stringify(head)); - - let result; - - if (head.sheetType === SheetType.NORMAL) { - result = []; - } else if (head.sheetType === SheetType.PRIMARY) { - result = {}; - } - - for (let i_row = headIndex + 1; i_row < sheet.data.length; i_row++) { - - let row = sheet.data[i_row]; - - let parsedRow = parseRow(row, i_row, head); - if (head.sheetType === SheetType.NORMAL) { // json以数组的格式输出 - result.push(parsedRow); - } else if (head.sheetType === SheetType.PRIMARY) { //json以map的格式输出 - let id = parsedRow[head.getIdKey()]; - result[id] = parsedRow; - } else { - throw '无法识别表格类型!'; - } - } - return { - result, - head - }; - } -} - -function parseHead(sheet, headIndex) { - - let headRow = sheet.data[headIndex]; - - // console.log("\t\t parsing head", headIndex, headRow); - - let head = { - //所有名字 json的key - names: [], - - //所有列的数据类型 - types: [], - - //表头所在的行索引 - index: headIndex, - - //表类型 普通表 主表 引用表 - sheetType: SheetType.NORMAL, - - getIdKey: function () { - let id_col_index = this.types.indexOf(DataType.ID); - if (id_col_index < 0) { - throw '获取不到id列的名字'; - } - return this.names[id_col_index]; - } - }; - - headRow.forEach(cell => { - let type = DataType.UNKOWN; - let name = cell; - - if ((cell + '').indexOf('#') !== -1) { - let pair = cell.split('#'); - name = pair[0].trim(); - type = pair[1].toLowerCase().trim(); - if (type === DataType.ID) { - head.sheetType = SheetType.PRIMARY; - } - } - head.types.push(type); - head.names.push(name); + setting.slaves.forEach(slave_name => { + strHead += "\t" + slave_name + ": " + _.capitalize(slave_name) + "\r\n" }); - return head; -} - -function parseRow(row, rowIndex, head) { - - let result = {}; - let id; - - // console.log('parsing row', row); - - for (let index = 0; index < head.names.length; index++) { - let cell = row[index]; - - let name = head.names[index]; - let type = head.types[index]; - - if (name.startsWith('!')) { - continue; - } - - if (!cell) { - result[name] = null; - continue; - } - - switch (type) { - case DataType.ID: // number string boolean - if (isNumber(cell)) { - id = Number(cell); - } else { - id = cell; - } - result[name] = id; - break; - case DataType.UNKOWN: // number string boolean - if (isNumber(cell)) { - result[name] = Number(cell); - } else if (isBoolean(cell)) { - result[name] = toBoolean(cell); - } else { - result[name] = cell; - } - break; - case DataType.DATE: - if (isNumber(cell)) { - //xlsx's bug!!! - result[name] = numdate(cell); - } else { - result[name] = cell.toString(); - } - break; - case DataType.STRING: - if (cell.startsWith('"')) { - result[name] = parseJsonObject(cell); - } else { - result[name] = cell.toString(); - } - break; - case DataType.NUMBER: - //+xxx.toString() '+' means convert it to number - if (isNumber(cell)) { - result[name] = Number(cell); - } else { - console.warn("type error at [" + rowIndex + "," + index + "]," + cell + " is not a number"); - } - break; - case DataType.BOOL: - result[name] = toBoolean(cell); - break; - case DataType.OBJECT: - case '{}': - result[name] = parseJsonObject(cell); - break; - case DataType.ARRAY: - case '[]': - if (!cell.startsWith('[')) { - cell = `[${cell}]`; - } - result[name] = parseJsonObject(cell); - break; - default: - console.log('无法识别的类型:', '[' + rowIndex + ',' + index + ']', cell, typeof (cell)); - break; - } - } - - return result; -} - -/** - * convert value to boolean. - */ -function toBoolean(value) { - return value.toString().toLowerCase() === 'true'; -} - -/** - * is a number. - */ -function isNumber(value) { - - if (typeof value === 'number') { - return true; - } - - if (value) { - return !isNaN(+value.toString()); - } - - return false; -} - -/** - * boolean type check. - */ -function isBoolean(value) { - - if (typeof (value) === "undefined") { - return false; - } - - if (typeof value === 'boolean') { - return true; - } - - let b = value.toString().trim().toLowerCase(); - - return b === 'true' || b === 'false'; -} - -//fuck node-xlsx's bug -var basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000 -// var dnthresh = basedate.getTime() + (new Date().getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000; -var dnthresh = basedate.getTime() + (new Date().getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000; -// function datenum(v, date1904) { -// var epoch = v.getTime(); -// if(date1904) epoch -= 1462*24*60*60*1000; -// return (epoch - dnthresh) / (24 * 60 * 60 * 1000); -// } - -function numdate(v) { - var out = new Date(); - out.setTime(v * 24 * 60 * 60 * 1000 + dnthresh); - return out; + strHead += "}\r\n"; + return strHead; } -//fuck over - module.exports = { @@ -421,11 +152,7 @@ module.exports = { * excel structure * workbook > worksheet > table(row column) */ - toJson: function (src, dest, config) { - - _config = config; - - let headIndex = config.xlsx.head - 1; + toJson: function (src, dest) { if (!fs.existsSync(dest)) { fs.mkdirSync(dest); @@ -437,6 +164,15 @@ module.exports = { console.log("parsing excel:", parsed_src.base); - parseWorkbook(workbook, dest, headIndex, path.join(dest, parsed_src.name)); + let settings = parser.parseSettings(workbook); + + // let parsed_workbook = parseWorkbook(workbook, dest, headIndex, path.join(dest, parsed_src.name)); + let parsed_workbook = parser.parseWorkbook(workbook, settings); + + serializeWorkbook(parsed_workbook, dest); + + if (config.ts) { + serializeDTS(dest, parsed_src.name, settings); + } } }; \ No newline at end of file diff --git a/package.json b/package.json index dcb01f3..7524daa 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ }, "dependencies": { "glob": "3.2.9", + "lodash": "^4.17.10", "node-xlsx": "^0.12.0" } -} \ No newline at end of file +} diff --git a/test/heroes.xlsx b/test/heroes.xlsx deleted file mode 100644 index 361d13f434d3dd8493377f259a0f3bfbf264bba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10944 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 F{|^b`j)edK diff --git a/test/stages.xlsx b/test/stages.xlsx deleted file mode 100644 index fe8214dd576dd18e7bcf6e425cd1bb8da5256a8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16751 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%0DwP8! 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