excel-json-cli1
Version:
用于把表格数据导成json数据,可支持json、ts和js,或者,用于把json数据导成表格数据,可支持json、ts和js。
193 lines (192 loc) • 8.51 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.json2excel = void 0;
const node_xlsx_1 = __importDefault(require("node-xlsx"));
const fs = __importStar(require("fs-extra"));
const chalk_1 = __importDefault(require("chalk"));
const constants_1 = require("../constants");
const readDirFilesData = (input) => {
// 获取输输入路径及文件类型
const [path, fileOrSuffix] = input.split('**');
const [filename, suffix] = fileOrSuffix.split('.');
console.log('数据读取中,请稍后...');
// 读取文件夹文件列表
const files = fs.readdirSync(path || './').filter((item) => {
if (filename) {
const d = fs.statSync(path + item);
return d.isDirectory();
}
return item.endsWith(suffix);
});
let data = {};
// 将文件数据转成json数据
files.forEach((file) => __awaiter(void 0, void 0, void 0, function* () {
const checkFile = fs.existsSync(filename ? path + file + fileOrSuffix : path + file);
if (checkFile) {
let fileData = fs.readFileSync(filename ? path + file + fileOrSuffix : path + file, { flag: 'r', encoding: 'utf-8' });
fileData = fileData.replace(/\;/g, '');
try {
const fns = file.split('.');
data[fns.splice(0, fns.length - 1).join('.') || file] = constants_1.isExportType.includes(suffix) ? eval('(' + fileData.split('export default ')[1] + ')') : JSON.parse(fileData);
}
catch (error) {
console.error(chalk_1.default.red(file, '该文件不是json,无法导出'));
}
}
}));
return data;
};
const multilevelObjectDeconstruct = (fileData, data, datakeys, pKey, langi) => {
Object.keys(data).forEach(item => {
var _a;
if (typeof data[item] === 'object') {
multilevelObjectDeconstruct(fileData, data[item], datakeys, `${pKey}.${item}`, langi);
return;
}
const dataIndex = fileData[0].data.findIndex(di => di[0] === `${pKey}.${item}`);
// 初始每行数据,加入对应可以值
if (dataIndex === -1) {
const data = new Array(langi + 1).fill('');
data[0] = `${pKey}.${item}`;
fileData[0].data.push(data);
}
;
const di = dataIndex !== -1 ? dataIndex : (((_a = fileData[0].data) === null || _a === void 0 ? void 0 : _a.length) - 1);
// 补充缺少数据
if (langi + 1 > fileData[0].data[di].length) {
const notDataNum = langi + 1 - fileData[0].data[di].length;
const data = new Array(notDataNum).fill('');
fileData[0].data[di] = fileData[0].data[di].concat(data);
}
// 设置对应key的数据值
fileData[0].data[di].push(data[item]);
});
};
const writeFileToExcel = (data, { output, isMoToSo }) => {
// 表格初始数据
const fileData = [{
name: 'all data',
data: [],
options: {}
}];
// 表格首行数据
let firstRow = ['key'];
// 记入第一个文件的数据key
let datakeys = Object.keys(data[Object.keys(data)[0]]);
Object.keys(data).forEach((key, i) => {
// 设置表格首行数据
firstRow.push(key);
// 合并补充第一个文件不存在的key
datakeys = datakeys.concat(Object.keys(data[key]).filter(dk => !datakeys.includes(dk) && ((typeof data[key][dk] !== 'object' && isMoToSo) || !isMoToSo)));
Object.keys(data[key]).forEach(item => {
var _a;
if (typeof data[key][item] === 'object') {
// 对象数据处理
if (isMoToSo) {
multilevelObjectDeconstruct(fileData, data[key][item], datakeys, item, i);
}
else {
data[key][item] = JSON.stringify(data[key][item]);
}
return;
}
const dataIndex = fileData[0].data.findIndex(di => di[0] === item);
// 初始每行数据,加入对应可以值
if (dataIndex === -1) {
const data = new Array(i + 1).fill('');
data[0] = item;
fileData[0].data.push(data);
}
;
const di = dataIndex !== -1 ? dataIndex : (((_a = fileData[0].data) === null || _a === void 0 ? void 0 : _a.length) - 1);
// 补充缺少数据
if (i + 1 > fileData[0].data[di].length) {
const notDataNum = i + 1 - fileData[0].data[di].length;
const data = new Array(notDataNum).fill('');
fileData[0].data[di] = fileData[0].data[di].concat(data);
}
// 设置对应key的数据值
fileData[0].data[di].push(data[key][item]);
});
});
console.log('文件写入中,请稍后...');
// 合并首行数据
fileData[0].data.unshift(firstRow);
// 将数据转成文件buffer
const buffer = node_xlsx_1.default.build(fileData);
// 查看文件夹是否存在
let paths = output.split('/');
paths = paths.splice(0, paths.length - 1);
const path = paths.join('/') || './';
fs.stat(path, (_, stats) => __awaiter(void 0, void 0, void 0, function* () {
if (!stats) {
// 不存在创建文件夹
yield fs.mkdir(path, { recursive: true }, err => {
if (err) {
console.error(chalk_1.default.red(err));
}
else {
// 文件写入
fs.writeFile(output, Buffer.from(buffer), (err) => {
if (err) {
console.error(chalk_1.default.red(err));
}
});
}
});
}
else {
// 文件写入
fs.writeFile(output, Buffer.from(buffer), (err) => {
if (err) {
console.error(chalk_1.default.red(err));
}
});
}
}));
};
function json2excel(options) {
// 读取文件夹数据
const filesData = readDirFilesData(options.input);
// 将数据写入excel文件
writeFileToExcel(filesData, {
output: options.output,
isMoToSo: options.multilevelObjectDeconstruct
});
}
exports.json2excel = json2excel;