cocos3.X的oops框架oops-plugin-excel-to-json改進兼容多表單導出功能

????????在使用oops框架的過程中,它的導出數據并生成數據結構的插件oops-plugin-excel-to-json有些小的坑點,為滿足我個人習慣,對此部分進行了一個小的修改,有需要的拿去用,記錄下供大家參考;

一、配置:其他基本配置請自行搜索,首先能導出其例子中的xlsx表格,基于此來看這篇文章。

我的項目環境配置,如下圖:

  • 表的配置小坑:

核心文件

extensions\oops-plugin-excel-to-json\dist\ExcelToJson.js

extensions\oops-plugin-excel-to-json\src\ExcelToJson.ts

就是表格的關鍵字必須在表格的名字中標明:

"【KEY】"

否則只能導出結構,不能導出數據,結構的主鍵還不對;所以根據項目自己增加的表格,必須增加這個關鍵字,才能正確導出結構和數據;

  • 一個表個內的多個表單同時導出:

1,修改調用處的輸出文件的絕對文件名,為輸出路徑,這里的輸出是項目配置中的輸出路徑+原表格名稱;現在不需要,只要路徑,名稱由內部的表單決定;

表單名決定數據文件名json和數據結構名ts;

核心是將獲得表單的數量,然后循環處理下即可:

整體源碼如下:復制過去覆蓋,重新開啟編輯器即可。

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.run = run;
const path_1 = __importDefault(require("path"));
const JsonToTs_1 = require("./JsonToTs");
const main_1 = require("./main");
const fs = require('fs');
const excel = require('exceljs');
/*** Excel轉Json數據* @param {*} src           讀取的excel文件目錄* @param {*} dst           導出的json文件目錄* @param {*} name          excel文件名* @param {*} isClient      是否為客戶端數據*/
async function convert(src, dst, name, isClient) {console.warn("src = ", src, "  dst = ", dst, "  name = ", name);const workbook = new excel.Workbook();// 讀取excelawait workbook.xlsx.readFile(src);console.warn("本次 xlsx的 文件路徑 : src = ", src, " 包含>>>  ", workbook.worksheets.length , " <<<< 個分表 sheet", "  workbook.worksheets = ", workbook.worksheets);for(let sheet_id = 1; sheet_id <= workbook.worksheets.length; sheet_id++){let r = {};let names = []; // 文名字段名let keys = []; // 字段名let types = []; // 通用字段數據類型let types_client = {}; // 客戶端數據類型let servers = []; // 是否輸出服務器字段數據let clients = []; // 是否輸出客戶端字段數據let primary = []; // 多主鍵配置let primary_index = [];const worksheet = workbook.getWorksheet(sheet_id); // 獲取第一個worksheet console.log("src = ", src, " tablename = ", worksheet.name);worksheet.eachRow((row, rowNumber) => {let data = {};row.eachCell((cell, colNumber) => {const value = cell.text;// console.warn(cell.text, cell.string, cell.number, cell.result, cell.formula)if (rowNumber === 1) { // 字段中文名names.push(value);if (value.indexOf("【KEY】") > -1)primary_index.push(colNumber);}else if (rowNumber === 2) { // 字段英文名keys.push(value);if (primary_index.indexOf(colNumber) > -1)primary.push(value);}else if (rowNumber === 3) { // 通用字段數據類型types.push(value);}else if (isClient == false && rowNumber === 4) { // 是否輸出服務器字段數據servers.push(value);}else if (isClient == true && rowNumber === 5) { // 客戶端數據類型 clients.push(value);}else if (rowNumber > 5) {let index = colNumber - 1;let type = types[index];let server = servers[index];let client = clients[index];// 驗證是否輸出這個字段let isWrite = isClient && client === "client" || isClient == false && server === "server";if (isWrite) {let key = keys[index];switch (type) {case "int":// console.warn(`${index}int`, key, value, cell.string, cell.number, cell.result)if (cell.formula) {data[key] = parseInt(cell.result);}else {data[key] = parseInt(value);}types_client[key] = {en: "number",zh: names[index]};break;case "float":// console.warn(`${index}int`, key, value, cell.string, cell.number, cell.result)if (cell.formula) {data[key] = parseFloat(cell.result);}else {data[key] = parseFloat(value);}types_client[key] = {en: "number",zh: names[index]};break;case "string":// console.warn(`${index}int`, key, value, cell.string, cell.number, cell.result)data[key] = value;types_client[key] = {en: "string",zh: names[index]};break;case "any":// console.warn(`${index}int`, key, value, cell.string, cell.number, cell.result)try {data[key] = JSON.parse(value);types_client[key] = {en: "any",zh: names[index]};}catch (_a) {console.log('Cell ' + cell.address + ' has value ' + cell.text);console.warn(`文件【${src}】的【${key}】字段【${data[key]}】類型數據【${value}】JSON轉字段串錯誤【${client}】`);}break;}}}});// 生成數據(多主鍵)if (rowNumber > 5) {let temp = null;for (var i = 0; i < primary.length; i++) {let k = primary[i];let id = data[k];delete data[k]; // 主鍵數據刪除if (primary.length == 1) {r[id] = data;}else {if (i == primary.length - 1) {temp[id] = data;}else if (i == 0) {if (r[id] == undefined) {r[id] = {};}temp = r[id];}else {temp[id] = {};temp = temp[id];}}}}});// 寫入流if (r["undefined"] == null) {await fs.writeFileSync(dst+ worksheet.name+ ".json", JSON.stringify(r));// 生成客戶端腳本if (isClient) {(0, JsonToTs_1.createTsClient)( worksheet.name, types_client, r, primary);}else {(0, JsonToTs_1.createTsServer)( worksheet.name, types_client, r, primary);}console.log(isClient ? "客戶端數據" : "服務器數據", "生成成功", dst);}else {console.log(isClient ? "客戶端數據" : "服務器數據", "無數據2", dst);}}}
function run() {var inputExcelPath = path_1.default.join(__dirname, main_1.config.PathExcel.replace("project://", "../../../") + "/");var outJsonPathClient = path_1.default.join(__dirname, main_1.config.PathJsonClient.replace("project://", "../../../") + "/");var outJsonPathServer = null;if (main_1.config.PathJsonServer != null && main_1.config.PathJsonServer.length > 0) {outJsonPathServer = path_1.default.join(__dirname, main_1.config.PathJsonServer.replace("project://", "../../../") + "/");}const files = fs.readdirSync(inputExcelPath);files.forEach((f) => {let name = f.substring(0, f.indexOf("."));let ext = f.toString().substring(f.lastIndexOf(".") + 1);if (ext == "xlsx") {if (outJsonPathServer)convert(inputExcelPath + f, outJsonPathServer , name, false); // 服務器數據convert(inputExcelPath + f, outJsonPathClient, name, true); // 客戶端數據}});
}

最后說明下:這里面還有一個不完善的地方就是:關于excel表中的分表的編號問題:

就是說必須是連續的表單順序,如果不連續就會有報錯,要新建一張表,把各個分表拷貝過去,保證它的表單ID順序是連續的。也就是說策劃可以改分表,但是輕易不要刪除分表,重新建一張分表。如果必須要刪除分表,要重新做一個新表文件,把分表逐一拷貝一份進去即可。保證分表順序是從1開始連續的即可。

祝各位用餐快樂!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83596.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83596.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83596.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決IDE編譯JAVA項目時出現的OOM異常問題

出現的異常如圖&#xff1a; java.lang.0utOfMemoryError:Java heap space 解決方案&#xff1a; 文件 --> 設置 搜索 編譯器&#xff08;就點擊編譯器這行&#xff09;&#xff0c;找到構建進程&#xff0c;共享堆大小&#xff0c;設置大一些&#xff0c;例如 2048 MB。 …

【Linux內核】設備模型之udev技術詳解

目錄 1. udev技術概述 2. 技術層次分析 2.1 內核層交互 2.2 規則引擎層 2.3 用戶空間實現 3. 關鍵技術要點 3.1 動態設備節點管理 3.2 熱插拔處理 3.3 模塊化規則系統 3.3.1. 變量替換功能 3.3.2. 條件判斷能力 3.3.3. 實現機制 3.3.4 應用場景 3.3.5 擴展能力 4…

群論在現代密碼學中的應用探索與實踐 —— 從理論到C語言實現

1. 引言&#xff1a;數字時代的信息安全挑戰 隨著互聯網和數字技術的快速發展&#xff0c;信息安全問題變得日益嚴峻。無論是個人隱私保護&#xff0c;還是企業數據安全&#xff0c;乃至國家安全&#xff0c;都依賴于有效的加密技術保障信息的機密性和完整性。網絡攻擊、數據泄…

前端開發處理‘流式數據’與‘非流式數據’,在接收完整與非完整性數據時應該如何渲染和使用

在前端開發中&#xff0c;處理 非流式數據 和 流式數據 的方式不同。根據是否完整接收數據、是否實時渲染的需求&#xff0c;可以分為以下四種典型場景&#xff1a; 一、四類常見場景總結 類型數據完整性是否實時渲染適用技術/方法A完整數據&#xff08;一次性返回&#xff09…

thymeleaf直接調用Spring Bean中定義的方法

thymeleaf中可以使用表達式工具對象&#xff0c;通過符號直接調Spring Bean中定義的方法 Spring Bean Component public class InvokeMethodBean {public String fun() { return "fun";} }thymeleaf中調用 <div th:text"${invokeMethodBean.fun()}"&…

虛擬斯德哥爾摩癥候群:用戶為何為缺陷AI辯護?

當韓國用戶美咲連續第七次為虛擬男友的算法錯誤辯解&#xff1a;“他只是太累了才會說傷人的話”&#xff0c;心理醫生在診斷書上寫下“數字依賴伴隨認知失調”。這種現象并非孤例——斯坦福2024年研究顯示&#xff0c;62%長期使用情感AI的用戶會主動為系統缺陷尋找合理化解釋&…

tryhackme——Abusing Windows Internals(進程注入)

文章目錄 一、Abusing Processes二、進程鏤空三、線程劫持四、DLL注入五、Memory Execution Alternatives 一、Abusing Processes 操作系統上運行的應用程序可以包含一個或多個進程&#xff0c;進程表示正在執行的程序。進程包含許多其他子組件&#xff0c;并且直接與內存或虛…

[藍橋杯]密碼脫落

密碼脫落 題目描述 X 星球的考古學家發現了一批古代留下來的密碼。 這些密碼是由 A、B、C、D 四種植物的種子串成的序列。 仔細分析發現&#xff0c;這些密碼串當初應該是前后對稱的&#xff08;也就是我們說的鏡像串&#xff09;。 由于年代久遠&#xff0c;其中許多種子…

Python繪圖庫及圖像類型

折線圖&#xff08;plot&#xff09; 繪圖庫介紹 Python中繪制折線圖的全面指南_python繪制折線圖-CSDN博客https://blog.csdn.net/2301_81064905/article/details/139689644 核心作用說明趨勢分析揭示數據隨時間推移的上升/下降趨勢、周期性波動或轉折點變化對比在單一圖表…

4種常見Python設計愛心創意實現方法

在Python中設計愛心創意有多種實現方式&#xff0c;以下介紹4種常見方法&#xff0c;并附上完整代碼&#xff1a; 方法1&#xff1a;使用數學方程繪制&#xff08;Matplotlib&#xff09; ??原理??&#xff1a;使用參數方程繪制心形曲線 ??效果??&#xff1a;光滑的數…

【Unity】R3 CSharp 響應式編程 - 使用篇(二)

一、通用的事件監聽用法 using System;using R3;using UnityEngine;namespace Aladdin.Standard.Observable.Common{public class CommonObservable : MonoBehaviour{// 默認會調用1次public SerializableReactiveProperty<int> serializableReactiveProperty;…

【原理解析】為什么顯示器Fliker dB值越大,閃爍程度越輕?

顯示器Fliker 1 顯示器閃爍現象說明2 Fliker量測方法2.1 FMA法2.2 JEITA法問題答疑&#xff1a;為什么顯示器Fliker dB值越大&#xff0c;閃爍程度越輕&#xff1f; 3 參考文獻 1 顯示器閃爍現象說明 當一個光源閃爍超過每秒10次以上就可在人眼中產生視覺殘留&#xff0c;此時…

3.需求分析與測試用例設計方法

設計方法 測試點 定義: 測試時需要考慮的可測試方面&#xff0c;不同公司可能稱為"檢查點"或其它名稱特點: 是需求分析的最后一個環節&#xff0c;用于解決"測哪里"和"怎么測"的問題舉例說明: 如同打架時的各種招數&#xff0c;如直接約架、設…

IEC 61347-1:2015 燈控制裝置安全標準詳解

IEC 61347-1:2015燈控制裝置安全標準詳解 IEC 61347-1:2015 是國際電工委員會&#xff08;IEC&#xff09;發布的燈控制裝置第1部分&#xff1a;通用要求和安全要求的核心標準&#xff0c;為各類照明用電子控制設備設定了全球通用的安全基準。該標準適用于獨立式或內置于燈具/…

從 GPT 的發展看大模型的演進

這是一個技術爆炸的時代。一起來看看 GPT 誕生后&#xff0c;與BERT 的角逐。 BERT 和 GPT 是基于 Transformer 模型架構的兩種不同類型的預訓練語言模型。它們之間的角逐可以從 Transformer 的編碼解碼結構角度來分析。 BERT&#xff08;Bidirectional Encoder Representatio…

多目標粒子群優化算法(MOPSO),用于解決無人機三維路徑規劃問題,Matlab代碼實現

多目標粒子群優化算法&#xff08;MOPSO&#xff09;&#xff0c;用于解決無人機三維路徑規劃問題&#xff0c;Matlab代碼實現 目錄 多目標粒子群優化算法&#xff08;MOPSO&#xff09;&#xff0c;用于解決無人機三維路徑規劃問題&#xff0c;Matlab代碼實現效果一覽基本介紹…

貪心算法應用:集合覆蓋問題詳解

貪心算法與集合覆蓋問題詳解 貪心算法在組合優化問題中展現出獨特優勢&#xff0c;集合覆蓋問題&#xff08;Set Cover Problem&#xff09;是其中的經典案例。本文將用2萬字全面解析貪心算法在集合覆蓋/劃分中的應用&#xff0c;涵蓋算法原理、正確性分析、Java實現、復雜度證…

MCP:讓AI工具協作變得像聊天一樣簡單 [特殊字符]

想象一下,你正在處理一個項目,需要從A平臺查看團隊討論,從B平臺獲取客戶信息,還要在GitHub上檢查代碼進度。傳統做法是什么?打開三個不同的網頁,在各個平臺間來回切換,復制粘貼數據,最后還可能因為信息分散而遺漏重要細節。 聽起來很熟悉?這正是當前工作流程的痛點所…

docker不用dockerfile

好的&#xff01;既然你不想使用 Dockerfile&#xff0c;我們就完全不寫 Dockerfile&#xff0c;改用你 Leader 提到的思路&#xff1a; 用基礎鏡像啟動一個容器 → 手動在容器里安裝依賴和復制項目 → 保存為新鏡像 這個方式更直觀&#xff0c;就像“你進入容器自己配置環境&a…

React與Vue核心區別對比

React 和 Vue 都是當今最流行、功能強大的前端 JavaScript 框架&#xff0c;用于構建用戶界面。它們有很多相似之處&#xff08;比如組件化、虛擬 DOM、響應式數據綁定&#xff09;&#xff0c;但也存在一些核心差異。以下是它們的主要區別&#xff1a; 1. 核心設計與哲學 Rea…