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”:“搞完然后与”}]

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 邮箱正则表达式

    邮箱正则表达式正则提取国内外所有的邮箱经过测试准确率100%python代码块res=re.search(r’\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,8}\b’,description)ifres:emailAddress=res.group()else:emailAddr…

  • PyCharm激活码永久有效PyCharm2018.1.5激活码教程-持续更新,一步到位

    PyCharm激活码永久有效PyCharm2018.1.5激活码教程-持续更新,一步到位PyCharm激活码永久有效2018.1.5激活码教程-Windows版永久激活-持续更新,Idea激活码2018.1.5成功激活

  • AMQP机制_cdm机制为什么停止了

    AMQP机制_cdm机制为什么停止了当前各种应用大量使用异步消息模型,并随之产生众多消息中间件产品及协议,标准的不一致使应用与中间件之间的耦合限制产品的选择,并增加维护成本。AMQP是一个提供统一消息服务的应用层标准协议,基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。        当然这种降低耦合的机制是基于与上层产品,语言无关的协议。AMQP协议是一种二进制协议,提供

    2022年10月31日
  • 带通滤波器原理及其作用_带通滤波器的设计

    带通滤波器原理及其作用_带通滤波器的设计一个带通滤波器是一个只有在特定频段的频率传递信号衰减这一频段以外的所有信号的同时,其目的是的电路。在一个带通滤波器的重要参数,高,低截止频率(FH和f升),带宽(BW),中心频率fC,中心频率增益,选择性或Q基本上有两个带通滤波器,即广通带和窄的带通滤波器的类型号不幸的是,两者之间的分线没有设置。然而,一个带通滤波器的定义是很宽的带通图的优点或品质因数Q值小于10,而与Q带通滤波器&g…

  • 删除多选框选中商品的内容_快速选择工具怎么删除选中部分吗

    删除多选框选中商品的内容_快速选择工具怎么删除选中部分吗多选框定义多选框的出现时将商品循环多次出现,这里用到了el表达式和jstl标签库的foreEach标签,注意input框加上class属性,并加上存有id的属性value:forEachitems=”${productList}”var=”product”varStatus=”vs”>type=”checkbox”class=”check_pid”name=”pid”

  • SSRS:使用SQL2008教程学习Reporting Services之数据库AdventureWorks2008问题_学习笔记1

    SSRS:使用SQL2008教程学习Reporting Services之数据库AdventureWorks2008问题_学习笔记1首先声明我是菜鸟,刚开始学习ReportingServices。在学习教程中的一点笔记。从SQL2005开始,微软就提供了强大的ReportingServices功能,的确好用,对于经常需要出复杂报表的朋友可谓是一大欢喜。SQL2008中的SQLServer教程是一本很好的学习资料,我的是SQL2008非R2版,ReportingServices章节中需要用到微软示例…

发表回复

您的电子邮箱地址不会被公开。

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