UNPKG

excel-json-cli1

Version:

用于把表格数据导成json数据,可支持json、ts和js,或者,用于把json数据导成表格数据,可支持json、ts和js。

193 lines (192 loc) 8.51 kB
"use strict"; 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;