Skip to content

Commit

Permalink
Fix bugs, optimize code.
Browse files Browse the repository at this point in the history
  • Loading branch information
jobyrao committed Aug 13, 2019
1 parent 6ad0a3b commit 1ba6392
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 66 deletions.
11 changes: 11 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# EditorConfig is awesome: https://EditorConfig.org

# top-most EditorConfig file
root = true

# Set default charset
# 2 space indentation
[*.js]
charset = utf-8
indent_style = space
indent_size = 2
118 changes: 53 additions & 65 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,6 @@ const XLSX = require('xlsx');

class XLSX2JSON {
constructor() {
// 自定义解析后的缓存
this.parse2jsonDataCache = [];
// 解析过程,记录一些覆盖赋值的情况。
this.parse2jsonCover = [];
}
/**
*
Expand Down Expand Up @@ -42,18 +38,22 @@ class XLSX2JSON {
return result;
}
parse2json(source, options = {}) {
// 解析前,对原先数据校零处理。
this.zeroCorrection();
const opts = Object.assign({isColOriented: true}, options);
this.parsedXlsxData = this.parse(source, options);
// 解析过程,记录一些覆盖赋值的情况。
this.parse2jsonCover = [];

XLSX2JSON.switch2customStructure(this.parsedXlsxData);
const parsedJson = this.convertProcess(this.parsedXlsxData[0].data);
// 清空缓存
this.parse2jsonDataCache = [];

return parsedJson;
}

zeroCorrection() {
// 自定义解析后的缓存
this.parse2jsonDataCache = [];
// 解析过程,记录一些覆盖赋值的情况。
this.parse2jsonCover = [];
}
/**
* Rotate each'sheet'structure. Fill in the blank'cell'
* @param parsedData
Expand Down Expand Up @@ -123,6 +123,9 @@ class XLSX2JSON {
if (typeof key !== 'object') {
key = key.split('.');
}
if (key.length === 0) {
return columnObject;
}
let keyPart = key.shift();
// 是否有require写法
const requireExec = XLSX2JSON.isRequire(keyPart);
Expand All @@ -139,57 +142,39 @@ class XLSX2JSON {
const keyPartIsArr = keyFirstPartDesc[0];
const keyPartKeyName = keyFirstPartDesc[1];
const keyPartKeyIndex = keyFirstPartDesc[2];
if (key.length) {
if (keyPartIsArr) {
if (!Array.isArray(columnObject[keyPartKeyName])) {
columnObject[keyPartKeyName] = [];
}
if (keyPartKeyIndex === null) {
columnObject[keyPartKeyName].push({});
}else{
columnObject[keyPartKeyName][keyPartKeyIndex] = {};
}
const isKeyPartEnd = key.length === 0;

return this.createJsonEnumCol(columnObject[keyPartKeyName][keyPartKeyIndex], key, value, colIndex);
} else {
if (columnObject[keyPartKeyName] === undefined) {
columnObject[keyPartKeyName] = {};
}
return this.createJsonEnumCol(columnObject[keyPartKeyName], key, value, colIndex);
}
} else {
// 如info[0].title,当前调用已经裁剪到title,后面没有key了。即准备赋值。
if (keyPartIsArr) {
// 无序号[] 形式,
if (keyPartKeyIndex === null) {
if (!columnObject[keyPartKeyName]) {
// 不存在,则先空。
columnObject[keyPartKeyName] = []
}
// push进去。占位参数要用对象,以保证返回的引用能被改。
columnObject[keyPartKeyName].push(value || {});
return columnObject[keyPartKeyName][columnObject[keyPartKeyName].length - 1];
} else {
if (keyPartKeyIndex === 0) {
columnObject[keyPartKeyName] = [];
}
// 检查覆盖赋值,输出记录。最后一个part如 title[1]
if (columnObject[keyPartKeyName][keyPartKeyIndex]) {
this.parse2jsonCover.push(`${keyPartKeyName}${keyPartKeyIndex}`);
}
columnObject[keyPartKeyName][keyPartKeyIndex] = value || {};
return columnObject[keyPartKeyName][keyPartKeyIndex];
}
} else {
// 检查覆盖赋值,输出记录。最后一个part如 title[1]
if (columnObject[keyPartKeyName]) {
this.parse2jsonCover.push(`${keyPartKeyName}`);
}
// 普通字段。最后一回
columnObject[keyPartKeyName] = value || {};
return columnObject[keyPartKeyName];
}
}
if (keyPartIsArr) {
if (columnObject[keyPartKeyName] === undefined) {
columnObject[keyPartKeyName] = [];
} else if (!Array.isArray(columnObject[keyPartKeyName])) {
this.parse2jsonCover.push(`${XLSX2JSON.getJsonCoverKey(keyPart, key)}`);
columnObject[keyPartKeyName] = [];
}
if (keyPartKeyIndex === null) {
columnObject[keyPartKeyName].push(isKeyPartEnd ? value : {});
} else {
if (columnObject[keyPartKeyName][keyPartKeyIndex] !== undefined) {
this.parse2jsonCover.push(`${XLSX2JSON.getJsonCoverKey(keyPart, key)}`);
}
columnObject[keyPartKeyName][keyPartKeyIndex] = isKeyPartEnd ? value : {};
}
const quoteIndex = keyPartKeyIndex || columnObject[keyPartKeyName].length - 1;
return this.createJsonEnumCol(columnObject[keyPartKeyName][quoteIndex], key, value, colIndex);
} else {
if (columnObject[keyPartKeyName] === undefined) {
columnObject[keyPartKeyName] = isKeyPartEnd ? value : {};
} else if (Object.prototype.toString.call(columnObject[keyPartKeyName]) !== '[object Object]') {
this.parse2jsonCover.push(`${XLSX2JSON.getJsonCoverKey(keyPart, key)}`);
columnObject[keyPartKeyName] = isKeyPartEnd ? value : {};
}else {
if (isKeyPartEnd) {
this.parse2jsonCover.push(`${XLSX2JSON.getJsonCoverKey(keyPart, key)}`);
columnObject[keyPartKeyName] = value;
}
}
return this.createJsonEnumCol(columnObject[keyPartKeyName], key, value, colIndex);
}
}
convertProcess(sheetData, sheetIndex = 0) {
const parsedJson = [];
Expand All @@ -199,16 +184,16 @@ class XLSX2JSON {
// json属性描述列。
const attrDescArr = sheetData[0].concat();
for (let i = 1, len = sheetData.length; i < len; i += 1) {
// 取出sheet第列,语言文案
const col_data_arr = sheetData[i];
// 取出sheet第i列,语言文案
const colValueArr = sheetData[i];
// 该列对应的临时对象
const col_data_json = {};
for (let j = 0, lenJ = col_data_arr.length; j < lenJ; j += 1) {
const colValueJson = {};
for (let j = 0, lenJ = colValueArr.length; j < lenJ; j += 1) {

// 返回此次tab[].c 数显转换后的深度结构的属性引用。
this.createJsonEnumCol(col_data_json, attrDescArr[j], col_data_arr[j], i - 1);
this.createJsonEnumCol(colValueJson, attrDescArr[j], colValueArr[j], i - 1);
}
parsedJson.push(col_data_json);
parsedJson.push(colValueJson);
}
// 记录缓存
this.parse2jsonDataCache[sheetIndex] = parsedJson;
Expand All @@ -234,6 +219,9 @@ class XLSX2JSON {
}
return index;
}
static getJsonCoverKey(keyPart, key) {
return `${keyPart}${key.length ? '.' + key.join('.') : ''}`;
}
}

module.exports = new XLSX2JSON();
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "xlsx-json-js",
"version": "0.0.1",
"version": "0.0.2",
"description": "Parse the'xlsx'file as JSON according to a set of attribute description syntax.",
"main": "lib/index.js",
"scripts": {
Expand Down
Binary file modified test/assets/excel.xlsx
Binary file not shown.

0 comments on commit 1ba6392

Please sign in to comment.