Add excel2json function and updated custom mapper from props

This commit is contained in:
Sambo Chea 2021-03-30 09:16:11 +07:00
parent 7132c34595
commit 9fd46088d5
10 changed files with 245 additions and 0 deletions

4
.gitignore vendored
View File

@ -102,3 +102,7 @@ dist
# TernJS port file # TernJS port file
.tern-port .tern-port
yarn.lock
package-lock.json
outputs/

16
Dockerfile Normal file
View File

@ -0,0 +1,16 @@
FROM cubetiq/calpine-node:latest
LABEL maintainer="sombochea@cubetiqs.com"
VOLUME [ "/app/data" ]
ENV INPUT_FILE './data/people.xlsx'
ENV OUTPUT_PATH './data/outputs'
ENV MAPPER_FILE './data/mapper.json'
WORKDIR /app
COPY . /app
RUN yarn
CMD [ "node" , "index.js"]

11
Makefile Normal file
View File

@ -0,0 +1,11 @@
DOCKER_IMAGE=cubetiq/node-excel2json
build:
@echo "Building docker image..."
docker build . -t ${DOCKER_IMAGE}
run:
@echo "Running container..."
docker run --rm -t ${DOCKER_IMAGE}
.PHONY: build

60
README.md Normal file
View File

@ -0,0 +1,60 @@
# excel2json
- Read file excel to json
- Custom mapping with custom columns and configs
# Build
```shell
bash build
```
OR
```shell
make build run
```
# Example
```shell
docker run -v /my/path:/app/data --rm -it cubetiq/node-excel2json
```
```shell
docker run -v /home/sombochea/excel2json:/app/data -e APP_NAME="EXCEL 2 JSON" -e MAPPER_FILE="./data/mapper.json" --rm -it cubetiq/node-excel2json
```
# Mapper Config
```json
{
"data": [
{
"dataIndex": "Name",
"label": "Name"
},
{
"dataIndex": "Age",
"label": "Age"
}
],
"configs": {
"outputPath": "./data/outputs/exported",
"outputName": "my_exported_data",
"sheetName": "Sheet1",
"saveToOutput": true
}
}
```
# Environment
```env
APP_NAME=custom app name
INPUT_FILE=./data/mydata.xlsx
OUTPUT_PATH=./data/outputs
MAPPER_FILE=./data/mapper.json
SHEET_NAME=Sheet1
ENCODING=utf-8
```

3
build.sh Normal file
View File

@ -0,0 +1,3 @@
#!/bin/bash
make build run

18
data/mapper.json Normal file
View File

@ -0,0 +1,18 @@
{
"data": [
{
"dataIndex": "Name",
"label": "Name"
},
{
"dataIndex": "Age",
"label": "Age"
}
],
"configs": {
"outputPath": "./data/outputs/exported",
"outputName": "my_exported_data",
"sheetName": "Sheet1",
"saveToOutput": true
}
}

BIN
data/people.xlsx Normal file

Binary file not shown.

102
excel2json.js Normal file
View File

@ -0,0 +1,102 @@
const XLSX = require("xlsx");
const fs = require("fs");
// do export for excel to json output or data json object
function _internalExport(props = {}) {
const NAME = process.env.APP_NAME || "excel2json";
console.log("APP NAME =>", NAME, "\n");
// load from env
const INPUT_FILE =
props.inputFile || process.env.INPUT_FILE || "./data/people.xlsx";
const OUTPUT_PATH =
props.outputPath || process.env.OUTPUT_PATH || "./data/outputs";
const MAPPER_FILE =
props.mapperFile || process.env.MAPPER_FILE || "./data/mapper.json";
const SHEET_NAME = props.sheetName || process.env.SHEET_NAME || "Sheet1";
const ENCODING = props.encoding || process.env.ENCODING || "utf-8";
// get mapper in string
var mapperString = undefined;
try {
mapperString = fs.readFileSync(
MAPPER_FILE,
{ encoding: ENCODING },
(err) => {
if (err) {
console.error(err);
}
console.log("Load file suceed =>", MAPPER_FILE);
}
);
} catch (err) {
console.error("read file error", err);
}
// convert mapper from string to json object
const mapperJson = mapperString ? JSON.parse(mapperString) : {};
const configs = { ...mapperJson.configs, ...props };
console.log(configs);
const columsData = props.mappings || mapperJson.data || undefined;
// read workbook from excel file
const wb = XLSX.readFile(configs.inputFile || INPUT_FILE);
const xlData = XLSX.utils.sheet_to_json(
wb.Sheets[configs.sheetName || SHEET_NAME]
);
// mapping the data from read excel file
const data = xlData.map((row) => {
if (columsData == undefined || !columsData) {
return row;
}
var _r = {};
columsData.map((col) => {
_r[col.label] = row[col.dataIndex];
});
return _r;
});
// able to save to output or not (default is true)
if (configs.saveToOutputput) {
// parse a new path
const 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
const jsonStringData = JSON.stringify(data);
try {
// write to file
fs.writeFileSync(
`${outputPath}/${
configs.outputName || "exported"
}_${new Date().getTime()}.json`,
jsonStringData,
(err) => {
if (err) throw err;
console.log("Write succeed!");
}
);
} catch (err) {}
}
return data;
}
/**
* excel2json
* Allow to export data from excel to json object or output of json.
*
* @returns JSON Object of result
*/
module.exports = excel2json = (props = {}) => {
return _internalExport(props);
};

16
index.js Normal file
View File

@ -0,0 +1,16 @@
// import excel2json module
const excel2json = require("./excel2json");
// called function export excel2json
const exported = excel2json({
mappings: [
{
"dataIndex": "Name",
"label": "Name"
}
],
"saveToOutput": false
});
// output data from exported
console.log("Output =>\n", exported);

15
package.json Normal file
View File

@ -0,0 +1,15 @@
{
"name": "excel2json",
"version": "1.0.0",
"description": "Excel to json",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Sambo Chea <sombochea@cubetiqs.com>",
"license": "MIT",
"dependencies": {
"xlsx": "^0.16.9"
}
}