Add cli support and updated functions

This commit is contained in:
Sambo Chea 2021-03-30 11:21:58 +07:00
parent 0af211c3c6
commit f997501489
6 changed files with 127 additions and 21 deletions

View File

@ -5,6 +5,24 @@
- Read file excel to json - Read file excel to json
- Custom mapping with custom columns and configs - Custom mapping with custom columns and configs
- Custom props
# Install
```shell
npm i excel2json-xlsx
```
OR
```shell
yarn i excel2json-xlsx
```
OR Global Install
```shell
yarn add global excel2json-xlsx
```
Usage
```shell
excel2json-xlsx -i people.xlsx -o exported.json
```
# Build # Build

44
bin/cli.js Normal file
View File

@ -0,0 +1,44 @@
#!/usr/bin/env node
const yargs = require("yargs");
const excel2json = require("./../excel2json");
const options = yargs
.usage("Usage: -i <input> -o <output> -m <mapper>")
.option("i", {
alias: "input",
describe: "Input File Excel (Required .xlsx)",
type: "string",
demandOption: true,
})
.option("o", {
alias: "output",
describe: "Output File to JSON",
type: "string",
demandOption: false,
})
.option("m", {
alias: "mapper",
describe: "Mapper File in JSON",
type: "string",
demandOption: false,
})
.option("s", {
alias: "sheet",
describe: "Sheet Name in workbook",
type: "string",
demandOption: false,
})
.argv;
const inputFile = options.input;
const outputFile = options.output;
const mapperFile = options.mapper;
const sheetName = options.sheet;
const exported = excel2json({
inputFile: inputFile,
mapperFile: mapperFile,
outputFile: outputFile,
sheetName: sheetName,
});

1
excel2json.d.ts vendored
View File

@ -2,6 +2,7 @@ interface Excel2JsonProps {
mappings?: Array<any>; mappings?: Array<any>;
saveToOutput?: boolean; saveToOutput?: boolean;
outputPath?: string; outputPath?: string;
outputFile?: string;
outputName?: string; outputName?: string;
sheetName?: string; sheetName?: string;
inputFile?: string; inputFile?: string;

View File

@ -1,10 +1,11 @@
const XLSX = require("xlsx"); const XLSX = require("xlsx");
const fs = require("fs"); const fs = require("fs");
const { splitFilepath } = require("./util");
// do export for excel to json output or data json object // do export for excel to json output or data json object
function _internalExport(props = {}) { function _internalExport(props = {}) {
const NAME = process.env.APP_NAME || "excel2json"; const NAME = process.env.APP_NAME || "excel2json";
console.log("APP NAME =>", NAME, "\n"); console.log("Name =>", NAME, "\n");
// load from env // load from env
const INPUT_FILE = const INPUT_FILE =
@ -36,7 +37,6 @@ function _internalExport(props = {}) {
// convert mapper from string to json object // convert mapper from string to json object
const mapperJson = mapperString ? JSON.parse(mapperString) : {}; const mapperJson = mapperString ? JSON.parse(mapperString) : {};
const configs = { ...mapperJson.configs, ...props }; const configs = { ...mapperJson.configs, ...props };
console.log(configs);
const columsData = props.mappings || mapperJson.data || undefined; const columsData = props.mappings || mapperJson.data || undefined;
// read workbook from excel file // read workbook from excel file
@ -61,31 +61,47 @@ function _internalExport(props = {}) {
}); });
// able to save to output or not (default is true) // able to save to output or not (default is true)
if (configs.saveToOutputput) { if (configs.saveToOutputput || configs.outputFile) {
// parse a new path var outputPath = undefined;
const outputPath = configs.outputPath || OUTPUT_PATH; const filePath = splitFilepath(configs.outputFile);
// check directory and create it if not exist // validate path and filename
if (!fs.existsSync(outputPath)) { if (filePath && filePath.path) {
fs.mkdirSync(outputPath, { recursive: true }); outputPath = filePath.path;
}
if (filePath.path) {
// parse a new path
outputPath = outputPath || configs.outputPath || OUTPUT_PATH;
// check directory and create it if not exist
if (!fs.existsSync(outputPath)) {
fs.mkdirSync(outputPath, { recursive: true });
}
} }
// json data output // json data output
const jsonStringData = JSON.stringify(data); const jsonStringData = JSON.stringify(data);
try { try {
// write to file var outFile = undefined;
fs.writeFileSync( if (configs.outputFile) {
`${outputPath}/${ outFile = configs.outputFile;
} else {
outFile = `${outputPath}/${
configs.outputName || "exported" configs.outputName || "exported"
}_${new Date().getTime()}.json`, }_${new Date().getTime()}.json`;
jsonStringData, }
(err) => {
if (err) throw err; // write to file
console.log("Write succeed!"); fs.writeFileSync(outFile, jsonStringData, (err) => {
} if (err) throw err;
); });
} catch (err) {}
console.log("Exported excel to json to output =>", outFile);
} catch (err) {
console.error(err);
}
} }
return data; return data;

View File

@ -1,6 +1,17 @@
{ {
"name": "excel2json-xlsx", "name": "excel2json-xlsx",
"version": "1.0.0", "version": "1.0.1",
"keywords": [
"excel",
"json",
"excel2json",
"parser",
"xlsx"
],
"publishConfig": {
"access": "public"
},
"bin": "bin/cli.js",
"description": "Excel to JSON, able to export JSON from Excel (xlsx)", "description": "Excel to JSON, able to export JSON from Excel (xlsx)",
"repository": { "repository": {
"url": "https://github.com/CUBETIQ/excel2json.git" "url": "https://github.com/CUBETIQ/excel2json.git"
@ -13,6 +24,7 @@
"author": "Sambo Chea <sombochea@cubetiqs.com>", "author": "Sambo Chea <sombochea@cubetiqs.com>",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"xlsx": "^0.16.9" "xlsx": "^0.16.9",
"yargs": "^16.2.0"
} }
} }

15
util.js Normal file
View File

@ -0,0 +1,15 @@
/**
* Split Filepath to Path and Filename
*
* @param {String} filePath
* @returns Object of JSON
*/
module.exports.splitFilepath = function splitFilepath(filePath) {
const filename = filePath.replace(/^.*[\\\/]/, "");
const path = filePath.replace("/" + filename, "");
return {
path: path == filename ? undefined : path,
filename,
};
}