Unity Excel转json且自动生成C#脚本

Unity Excel转json且自动生成C#脚本excel转json且自动生成c#脚本

大家好,又见面了,我是你们的朋友全栈君。

脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.Windows.Forms; //必须是 Unity安装目录\Editor\Data\Mono\lib\mono\2.0下的System.Windows.Forms.dll, 否则会导致报错或者Unity闪退
using System.Data;
using OfficeOpenXml.DataValidation;
using Excel;
using System.IO;
using LitJson;
using System.Text;
using System.Text.RegularExpressions;
using System;
using System.CodeDom;
using System.Reflection;
using System.CodeDom.Compiler;

public class ExcelToJson : EditorWindow
{ 
   

    List<string> ExcelPath = new List<string>();
    string JsonPath;
    string CSharpPath;
    string JsonName;
    List<string> dataType = new List<string>();
    List<string> dataName = new List<string>();
    List<string[]> ExcelDateList = new List<string[]>();

    [UnityEditor.MenuItem("Tools/ExcelToJson")]
    static void ExceltoJson()
    { 
   
        ExcelToJson toJson = (ExcelToJson)EditorWindow.GetWindow(typeof(ExcelToJson), true, "ExcelToJson");
        toJson.Show();
    }

    private void OnGUI()
    { 
   
        Color oldColor = GUI.backgroundColor;

        GUI.backgroundColor = Color.red;
        if (GUILayout.Button("选择需要转换的excel文件"))
        { 
   
            GetAllExcelPath();
        }
        GUI.backgroundColor = oldColor;

        //Color color = new Color(201, 232, 255);
        //GUI.backgroundColor = Color.yellow;
        //if (GUILayout.Button("ExcelToJson"))
        //{ 
   
        // CreatJsonFile();
        //}
        //GUI.backgroundColor = oldColor;

        //GUI.backgroundColor = Color.gray;
        //if (GUILayout.Button("CreatCSharp"))
        //{ 
   
        // CreatCSharp();
        //}
        //GUI.backgroundColor = oldColor;

    }

    #region Excel文件处理
    void GetAllExcelPath()
    { 
   
        OpenFileDialog openFlie = new OpenFileDialog();
        openFlie.Title = "选择需要转换的excel文件";
        openFlie.InitialDirectory = @"F:\Cards\Tools\Excel";
        //openFlie.Filter = "(*.xlsm)|*.xlsm)";
        openFlie.Multiselect = true;    //可以多选
        ExcelPath.Clear();
        if (openFlie.ShowDialog() == DialogResult.OK)
        { 
   
            string[] strPath = openFlie.FileNames;
            for (int i = 0; i < strPath.Length; i++)
            { 
   
                ExcelPath.Add(strPath[i]);
                Debug.LogError(ExcelPath[i]);
                ReadExcel(strPath[i].Replace("\\", "/"));
            }
        }
    }

    /// <summary>
    /// 读取Excel
    /// </summary>
    /// <param name="path">excel路径</param>
    /// <param name="columnNum">列</param>
    /// <param name="rowNum">行</param>
    void ReadExcel(string path)
    { 
   
        FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read);
        IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
        DataSet data = excelReader.AsDataSet();
        dataName.Clear();
        dataType.Clear();
        //ExcelDateList.Clear();
        // 读取Excel的所有页签
        for (int i = 0; i < data.Tables.Count; i++)
        { 
   
            DataRowCollection dataRow = data.Tables[i].Rows;            // 每行
            DataColumnCollection dataColumn = data.Tables[i].Columns;   // 每列

            string tableName = data.Tables[i].TableName;
            JsonPath = UnityEngine.Application.dataPath + "/Editor/Json/";
            JsonName = tableName + ".json";
            JsonPath = JsonPath + JsonName;
            CSharpPath = UnityEngine.Application.dataPath + "/Scripts/ClassMgr/" + tableName + ".cs";

            for (int rowNum = 0; rowNum < data.Tables[i].Rows.Count; rowNum++)
            { 
   
                string[] table = new string[data.Tables[i].Columns.Count];
                for (int columnNum = 0; columnNum < data.Tables[i].Columns.Count; columnNum++)
                { 
   
                    if (rowNum == 0)  // 第一行的值:数据类型
                    { 
   
                        dataType.Add(data.Tables[i].Rows[0][columnNum].ToString());
                    }
                    else if (rowNum == 1)  // 第二行的值:数据名
                    { 
   
                        dataName.Add(data.Tables[i].Rows[1][columnNum].ToString());
                    }
                    else
                    { 
   
                        //Debug.Log(data.Tables[i].Rows[rowNum][columnNum].ToString() + "\n");
                        table[columnNum] = data.Tables[i].Rows[rowNum][columnNum].ToString();
                    }

                }
                if (rowNum > 1)
                { 
   
                    //将一行数据存入list
                    ExcelDateList.Add(table);
                }
            }
            
            CreatJsonFile();

            CreatCSharp(tableName);
        }
    }

    #endregion

    #region Excel转json
    void CreatJsonFile()
    { 
   
        if (File.Exists(JsonPath))
        { 
   
            File.Delete(JsonPath);
        }

        JsonData jsonDatas = new JsonData();
        jsonDatas.SetJsonType(JsonType.Array);

        for (int i = 0; i < ExcelDateList.Count; i++)
        { 
   
            JsonData jsonData = new JsonData();
            for (int j = 0; j < dataName.Count; j++)
            { 
   
                jsonData[dataName[j]] = ExcelDateList[i][j].ToString();
                //Debug.Log("第二轮输出:\n");
                //Debug.Log(ExcelDateList[i][j].ToString() + "\n");
            }
            jsonDatas.Add(jsonData);
        }
        string json = jsonDatas.ToJson();

        //防止中文乱码
        Regex reg = new Regex(@"(?i)\\[uU]([0-9a-f]{4})");
        StreamWriter writer = new StreamWriter(JsonPath, false, Encoding.GetEncoding("UTF-8"));
        writer.WriteLine(reg.Replace(json, delegate (Match m) { 
    return ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString(); }));

        writer.Flush();
        writer.Close();

        System.Diagnostics.Process.Start("explorer.exe", JsonPath.Replace("/", "\\"));
    }
    #endregion

    #region 创建C#代码
    void CreatCSharp(string name)
    { 
   
        if (File.Exists(CSharpPath))
        { 
   
            File.Delete(CSharpPath);
        }
        //CodeTypeDeclaration 代码类型声明类
        CodeTypeDeclaration CSharpClass = new CodeTypeDeclaration(name);
        CSharpClass.IsClass = true;
        CSharpClass.TypeAttributes = TypeAttributes.Public;
        // 设置成员的自定义属性
        //CodeAttributeDeclaration代码属性声明
        //CodeTypeReference代码类型引用类
        //System.Serializable 给脚本打上[System.Serializable()]标签,将 成员变量 在Inspector中显示
        //CSharpClass.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference("System.Serializable")));
        for (int i = 0; i < dataName.Count; i++)
        { 
   
            // 创建字段
            //CodeMemberField 代码成员字段类 => (Type, string name)
            CodeMemberField member = new CodeMemberField(GetTypeForExcel(dataName[i], dataType[i]), dataName[i]);
            member.Attributes = MemberAttributes.Public;
            CSharpClass.Members.Add(member);
        }

        // 获取C#语言的实例
        CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
        //代码生成器选项类
        CodeGeneratorOptions options = new CodeGeneratorOptions();
        //设置支撑的样式
        options.BracingStyle = "C";
        //在成员之间插入空行
        options.BlankLinesBetweenMembers = true;

        StreamWriter writer = new StreamWriter(CSharpPath, false, Encoding.GetEncoding("UTF-8"));
        //生成最终代码
        provider.GenerateCodeFromType(CSharpClass, writer, options);

        writer.Flush();
        writer.Close();

        System.Diagnostics.Process.Start("explorer.exe", CSharpPath.Replace("/", "\\"));
    }

    Type GetTypeForExcel(string Name, string Type) { 
   
        if (Type == "int")
            return typeof(Int32);
        if (Type == "float")
            return typeof(Single);  //float关键字是System.Single的别名
        if (Type == "double")
            return typeof(Double);

        return typeof(String);
    }
    #endregion
}

Excel示例:
![在这里插入图片描述](https://img-blog.csdnimg.cn/41b7fe218c0b4ac9b407faef8b491a34.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oiR5b6Q5Yek5bm0,size_20,color_FFFFFF,t_70,g_se,x_16
生成的C#脚本:
在这里插入图片描述

生成的json文件:
[{“ID”:“10001”,“Name”:“a”,“Explain”:“卡牌a”},{“ID”:“10002”,“Name”:“b”,“Explain”:“卡牌b”},{“ID”:“10003”,“Name”:“c”,“Explain”:“卡牌c”},{“ID”:“10004”,“Name”:“d”,“Explain”:“卡牌d”},{“ID”:“10005”,“Name”:“e”,“Explain”:“卡牌e”},{“ID”:“10006”,“Name”:“f”,“Explain”:“卡牌f”},{“ID”:“10007”,“Name”:“g”,“Explain”:“fas”},{“ID”:“10008”,“Name”:“h”,“Explain”:“gbfdsg”},{“ID”:“10009”,“Name”:“i”,“Explain”:“ewtg”},{“ID”:“10010”,“Name”:“j”,“Explain”:“sgs”},{“ID”:“10011”,“Name”:“k”,“Explain”:“mje”},{“ID”:“10012”,“Name”:“l”,“Explain”:“归属感”},{“ID”:“10013”,“Name”:“m”,“Explain”:“格式”},{“ID”:“10014”,“Name”:“n”,“Explain”:“搞完然后与”}]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139468.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 简述springboot自动配置_如何配制溶液

    简述springboot自动配置_如何配制溶液阅读收获:+1|type_1_2:理解SpringBoot自动配置原理SpringBoot是什么SpringBoot的诞生就是为了简化Spring中繁琐的XML配置,其本质依然还是Spring框架,使用SpringBoot之后可以不使用任何XML配置来启动一个服务,使得我们在使用微服务架构时可以更加快速的建立一个应用。简单来说就是SpringBoot其实不是什么新的框架,它默认配置了很多框架的使用方式。SpringBoot的特点 提供了固定的配置来简化配置…

    2022年8月21日
    11
  • 2020年最佳恶意软件删除工具Top 10「建议收藏」

    2020年最佳恶意软件删除工具Top 10「建议收藏」恶意软件删除工具可以帮助你从个人计算机中删除危险的恶意软件,从而避免受到黑客的攻击并防止以后的攻击隐患。保障你的电脑或笔记本电脑的安全性是非常重要的,因为你永远不知道攻击者何时会对你的设备发起攻击。所以,这意味着你不仅需要杀毒软件,还需要一个恶意软件删除工具。比如,广告软件和间谍软件有很大的不同之处,它们不是病毒。因此,仅查出设备是否已受到恶意软件的影响是远远不够的,而且采用手动删除的方法也是非常不切实际的。故此,恶意软件清除已成为一个普遍的问题。如今,恶意软件感染越来越普遍化,即便你自认为..

    2022年6月24日
    70
  • 五子棋人机对战完整代码大全_一个完整的html代码

    五子棋人机对战完整代码大全_一个完整的html代码目录〇,前言一,五子棋棋盘二,五子棋比赛规则1,行棋顺序2,判断胜负三,重要棋型解释1,五连:2,活四:3,冲四:4,活三:四,禁手规则1,三三禁手2,四四禁手3,长连禁手五,代码解释1,棋子表示2,棋盘表示3,flat技术4,棋型判断和禁手判断4.1活四4.2冲四4.3活35,AI算法6,AI的………

    2022年10月21日
    3
  • select top语句 mysql_SQL SELECT TOP 语句[通俗易懂]

    select top语句 mysql_SQL SELECT TOP 语句[通俗易懂]SELECTTOP子句用于规定要返回的记录的数目。SELECTTOP子句对于拥有数千条记录的大型表来说,是非常有用的。注释:并非所有的数据库系统都支持SELECTTOP子句。SQLServer/MSAccess语法SELECTTOPnumber|percentcolumn_name(s)FROMtable_name;MySQL和Oracle中的SQLSEL…

    2022年7月13日
    17
  • 阿里云运维架构实践秘籍

    阿里云运维架构实践秘籍中国互联网发展编年史、运维、不同云盘单路随机写访问响应时间对比、常见数据库性能对比、常见衡量业务量级别指标、如何根据PV估算服务器数量?、不同业务特性计算模型、PV量和服务器配置/RDS配置对应表、服务器CPU/内存配置模型、云盘空间选择、宽带的选择、共享文件存储的方法、OSS文件管理、OSS数据迁移、缓存、Session管理六种策略、分库分表、云迁移步骤、监控方案、运维的发展阶段、传统运维痛点、云服务供应商排行、黑客常见入侵步骤、架构阶段、云端运维安全、黑客常见系统层攻击

    2022年7月17日
    13
  • Java类的初始化顺序_java静态类初始化顺序

    Java类的初始化顺序_java静态类初始化顺序package com.qcby;public class InitializeDemo { private static int k = 1; private static InitializeDemo t1 = new InitializeDemo(“t1”); private static InitializeDemo t2 = new InitializeDemo(“t2”); private static int i = print(“i”); pri

    2022年8月8日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号