Unity 工具类 之 Excel 转换为 json、csv、xml、csv 格式

目录

Unity 工具类 之 Excel 转换为 json、csv、xml、csv 格式

一、介绍

二、操作原理

三、操作步骤


一、介绍

Unity在使用中,可能涉及到多种格式的相互转换,目的就是为了使用方便,比如 Excel 转为 json,csv 转为 json 等,这里简单介绍 Excel 转为  json、csv、xml、lua 格式的方法。

二、操作原理

1、使用 Unity的编辑窗口,可视化操作

2、通过 Newtonsoft.json 进行相关的数据转换

三、操作步骤

1、新建一个 Editor 管理脚本,相关的脚本编写

2、[MenuItem("Plugins/ExcelTools")] 菜单栏显示操作入口

3、选中要转换的Excel,选择要转换的类型,进行转换

4、工程下载地址

https://download.csdn.net/download/u014361280/12028787

5、实现代码如下

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.Text;public class ExcelTools : EditorWindow
{/// <summary>/// 当前编辑器窗口实例/// </summary>private static ExcelTools instance;/// <summary>/// Excel文件列表/// </summary>private static List<string> excelList;/// <summary>/// 项目根路径    /// </summary>private static string pathRoot;/// <summary>/// 滚动窗口初始位置/// </summary>private static Vector2 scrollPos;/// <summary>/// 输出格式索引/// </summary>private static int indexOfFormat=0;/// <summary>/// 输出格式/// </summary>private static readonly string[] formatOption=new string[]{"JSON","CSV","XML","LUA"};/// <summary>/// 编码索引/// </summary>private static int indexOfEncoding=0;/// <summary>/// 编码选项/// </summary>private static readonly string[] encodingOption=new string[]{"UTF-8","GB2312"};/// <summary>/// 是否保留原始文件/// </summary>private static bool keepSource=true;/// <summary>/// 显示当前窗口  /// </summary>[MenuItem("Plugins/ExcelTools")]static void ShowExcelTools(){Init();//加载Excel文件LoadExcel();instance.Show();}void OnGUI(){DrawOptions();DrawExport();}/// <summary>/// 绘制插件界面配置项/// </summary>private void DrawOptions(){GUILayout.BeginHorizontal();EditorGUILayout.LabelField("请选择格式类型:",GUILayout.Width(85));indexOfFormat=EditorGUILayout.Popup(indexOfFormat,formatOption,GUILayout.Width(125));GUILayout.EndHorizontal();GUILayout.BeginHorizontal();EditorGUILayout.LabelField("请选择编码类型:",GUILayout.Width(85));indexOfEncoding=EditorGUILayout.Popup(indexOfEncoding,encodingOption,GUILayout.Width(125));GUILayout.EndHorizontal();keepSource=GUILayout.Toggle(keepSource,"保留Excel源文件");}/// <summary>/// 绘制插件界面输出项/// </summary>private void DrawExport(){if(excelList==null) return;if(excelList.Count<1){EditorGUILayout.LabelField("目前没有Excel文件被选中哦!");}else{EditorGUILayout.LabelField("下列项目将被转换为" + formatOption[indexOfFormat] + ":");GUILayout.BeginVertical();scrollPos=GUILayout.BeginScrollView(scrollPos,false,true,GUILayout.Height(150));foreach(string s in excelList){GUILayout.BeginHorizontal();GUILayout.Toggle(true,s);GUILayout.EndHorizontal();}GUILayout.EndScrollView();GUILayout.EndVertical();//输出if(GUILayout.Button("转换")){Convert();}}}/// <summary>/// 转换Excel文件/// </summary>private static void Convert(){foreach(string assetsPath in excelList){//获取Excel文件的绝对路径string excelPath=pathRoot + "/" + assetsPath;//构造Excel工具类ExcelUtility excel=new ExcelUtility(excelPath);//判断编码类型Encoding encoding=null;if(indexOfEncoding==0 || indexOfEncoding==3){encoding=Encoding.GetEncoding("utf-8");}else if(indexOfEncoding==1){encoding=Encoding.GetEncoding("gb2312");}//判断输出类型string output="";if(indexOfFormat==0){output=excelPath.Replace(".xlsx",".json");excel.ConvertToJson(output,encoding);}else if(indexOfFormat==1){output=excelPath.Replace(".xlsx",".csv");excel.ConvertToCSV(output,encoding);}else if(indexOfFormat==2){output=excelPath.Replace(".xlsx",".xml");excel.ConvertToXml(output);}else if (indexOfFormat == 3){output = excelPath.Replace(".xlsx", ".lua");excel.ConvertToLua(output, encoding);}//判断是否保留源文件if(!keepSource){FileUtil.DeleteFileOrDirectory(excelPath);}//刷新本地资源AssetDatabase.Refresh();}//转换完后关闭插件//这样做是为了解决窗口//再次点击时路径错误的Buginstance.Close();}/// <summary>/// 加载Excel/// </summary>private static void LoadExcel(){if(excelList==null) excelList=new List<string>();excelList.Clear();//获取选中的对象object[] selection=(object[])Selection.objects;//判断是否有对象被选中if(selection.Length==0)return;//遍历每一个对象判断不是Excel文件foreach(Object obj in selection){string objPath=AssetDatabase.GetAssetPath(obj);if(objPath.EndsWith(".xlsx")){excelList.Add(objPath);}}}private static void Init(){//获取当前实例instance=EditorWindow.GetWindow<ExcelTools>();//初始化pathRoot=Application.dataPath;//注意这里需要对路径进行处理//目的是去除Assets这部分字符以获取项目目录//我表示Windows的/符号一直没有搞懂pathRoot=pathRoot.Substring(0,pathRoot.LastIndexOf("/"));excelList=new List<string>();scrollPos=new Vector2(instance.position.x,instance.position.y+75);}void OnSelectionChange() {//当选择发生变化时重绘窗体Show();LoadExcel();Repaint();}
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Excel;
using System.Data;
using System.IO;
using Newtonsoft.Json;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;
using System;
using System.Linq;
using System.Xml;
public class ExcelUtility
{/// <summary>/// 表格数据集合/// </summary>private DataSet mResultSet;private string xmlPath= Application.dataPath  + "/xmlName.xml";private string[] fName;/// <summary>/// 构造函数/// </summary>/// <param name="excelFile">Excel file.</param>public ExcelUtility (string excelFile){FileStream mStream = File.Open (excelFile, FileMode.Open, FileAccess.Read);IExcelDataReader mExcelReader = ExcelReaderFactory.CreateOpenXmlReader (mStream);mResultSet = mExcelReader.AsDataSet ();}/// <summary>/// 转换为实体类列表/// </summary>public List<T> ConvertToList<T> (){//判断Excel文件中是否存在数据表if (mResultSet.Tables.Count < 1)return null;//默认读取第一个数据表DataTable mSheet = mResultSet.Tables [0];//判断数据表内是否存在数据if (mSheet.Rows.Count < 1)return null;//读取数据表行数和列数int rowCount = mSheet.Rows.Count;int colCount = mSheet.Columns.Count;//准备一个列表以保存全部数据List<T> list = new List<T> ();//读取数据for (int i=1; i<rowCount; i++) {//创建实例Type t = typeof(T);ConstructorInfo ct = t.GetConstructor (System.Type.EmptyTypes);T target = (T)ct.Invoke (null);for (int j=0; j<colCount; j++) {//读取第1行数据作为表头字段string field = mSheet.Rows [0] [j].ToString ();object value = mSheet.Rows [i] [j];//设置属性值SetTargetProperty (target, field, value);}//添加至列表list.Add (target);}return list;}/// <summary>/// 转换为Json/// </summary>/// <param name="JsonPath">Json文件路径</param>/// <param name="Header">表头行数</param>public void ConvertToJson (string JsonPath, Encoding encoding){//判断Excel文件中是否存在数据表if (mResultSet.Tables.Count < 1)return;//默认读取第一个数据表DataTable mSheet = mResultSet.Tables [0];//判断数据表内是否存在数据if (mSheet.Rows.Count < 1)return;//读取数据表行数和列数int rowCount = mSheet.Rows.Count;int colCount = mSheet.Columns.Count;//准备一个列表存储整个表的数据List<Dictionary<string, object>> table = new List<Dictionary<string, object>> ();//读取数据for (int i = 1; i < rowCount; i++) {//准备一个字典存储每一行的数据Dictionary<string, object> row = new Dictionary<string, object> ();for (int j = 0; j < colCount; j++) {//读取第1行数据作为表头字段string field = mSheet.Rows [0] [j].ToString ();//Key-Value对应row [field] = mSheet.Rows [i] [j];}//添加到表数据中table.Add (row);}//生成Json字符串string json = JsonConvert.SerializeObject (table, Newtonsoft.Json.Formatting.Indented);//写入文件using (FileStream fileStream=new FileStream(JsonPath,FileMode.Create,FileAccess.Write)) {using (TextWriter textWriter = new StreamWriter(fileStream, encoding)) {textWriter.Write (json);}}}/// <summary>/// 转换为lua/// </summary>/// <param name="luaPath">lua文件路径</param>public void ConvertToLua(string luaPath, Encoding encoding){//判断Excel文件中是否存在数据表if (mResultSet.Tables.Count < 1)return;StringBuilder stringBuilder = new StringBuilder();stringBuilder.Append("local datas = {");stringBuilder.Append("\r\n");//读取数据表foreach (DataTable mSheet in mResultSet.Tables){//判断数据表内是否存在数据if (mSheet.Rows.Count < 1)continue;//读取数据表行数和列数int rowCount = mSheet.Rows.Count;int colCount = mSheet.Columns.Count;//准备一个列表存储整个表的数据List<Dictionary<string, object>> table = new List<Dictionary<string, object>>();//读取数据for (int i = 1; i < rowCount; i++){//准备一个字典存储每一行的数据Dictionary<string, object> row = new Dictionary<string, object>();for (int j = 0; j < colCount; j++){//读取第1行数据作为表头字段string field = mSheet.Rows[0][j].ToString();//Key-Value对应row[field] = mSheet.Rows[i][j];}//添加到表数据中table.Add(row);}stringBuilder.Append(string.Format("\t\"{0}\" = ", mSheet.TableName));stringBuilder.Append("{\r\n");foreach (Dictionary<string, object> dic in table){stringBuilder.Append("\t\t{\r\n");foreach (string key in dic.Keys){if (dic[key].GetType().Name == "String")stringBuilder.Append(string.Format("\t\t\t\"{0}\" = \"{1}\",\r\n", key, dic[key]));elsestringBuilder.Append(string.Format("\t\t\t\"{0}\" = {1},\r\n", key, dic[key]));}stringBuilder.Append("\t\t},\r\n");}stringBuilder.Append("\t}\r\n");}stringBuilder.Append("}\r\n");stringBuilder.Append("return datas");//写入文件using (FileStream fileStream = new FileStream(luaPath, FileMode.Create, FileAccess.Write)){using (TextWriter textWriter = new StreamWriter(fileStream, encoding)){textWriter.Write(stringBuilder.ToString());}}}/// <summary>/// 转换为CSV/// </summary>public void ConvertToCSV (string CSVPath, Encoding encoding){//判断Excel文件中是否存在数据表if (mResultSet.Tables.Count < 1)return;//默认读取第一个数据表DataTable mSheet = mResultSet.Tables [0];//判断数据表内是否存在数据if (mSheet.Rows.Count < 1)return;//读取数据表行数和列数int rowCount = mSheet.Rows.Count;int colCount = mSheet.Columns.Count;//创建一个StringBuilder存储数据StringBuilder stringBuilder = new StringBuilder ();//读取数据for (int i = 0; i < rowCount; i++) {for (int j = 0; j < colCount; j++) {//使用","分割每一个数值stringBuilder.Append (mSheet.Rows [i] [j] + ",");}//使用换行符分割每一行stringBuilder.Append ("\r\n");}//写入文件using (FileStream fileStream = new FileStream(CSVPath, FileMode.Create, FileAccess.Write)) {using (TextWriter textWriter = new StreamWriter(fileStream, encoding)) {textWriter.Write (stringBuilder.ToString ());}}}List<string> mList = new List<string>();List<string> sList = new List<string>();public void ReadXmlName(){XmlDocument xmlDoc = new XmlDocument();xmlDoc.Load(xmlPath);int rootlist = xmlDoc.GetElementsByTagName("root")[0].ChildNodes.Count;string node = "";XmlNodeList nodeList = xmlDoc.SelectSingleNode("root").ChildNodes;for (int k = 0; k < rootlist; k++){mList.Add(xmlDoc.GetElementsByTagName("root")[0].ChildNodes[k].Name);}foreach (XmlElement xe in nodeList){foreach (XmlElement x1 in xe.ChildNodes){sList.Add(x1.InnerText);}}}/// <summary>/// 导出为Xml/// </summary>public void  ConvertToXml (string XmlFile){ReadXmlName();FileInfo info = new FileInfo(XmlFile);string xname = info.Name.Replace(".xlsx","");//string Jname = XmlFile.Replace("C:/Users/dell/Desktop/New Unity Project/Assets/Excel/", "");//Debug.Log(Jname);//判断Excel文件中是否存在数据表if (mResultSet.Tables.Count < 1)return;//默认读取第一个数据表DataTable mSheet = mResultSet.Tables [0];string Zz = @"[\u4e00-\u9fa5]";//判断数据表内是否存在数据if (mSheet.Rows.Count < 1)return;//读取数据表行数和列数int rowCount = mSheet.Rows.Count;int colCount = mSheet.Columns.Count;//创建一个StringBuilder存储数据StringBuilder stringBuilder = new StringBuilder ();//创建Xml文件头stringBuilder.Append ("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>");stringBuilder.Append ("\r\n");//创建根节点stringBuilder.Append ("<root xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">");stringBuilder.Append ("\r\n");//读取数据for (int i = 1; i < rowCount; i++) {//创建子节点for (int a = 0; a < mList.Count; a++){if (xname == mList[a]){stringBuilder.Append("\t<" + sList[a] + ">");stringBuilder.Append("\r\n");}}for (int j = 0; j < colCount; j++){if (System.Text.RegularExpressions.Regex.IsMatch(mSheet.Rows[0][j].ToString(), Zz) || string.IsNullOrEmpty(mSheet.Rows[0][j].ToString())){continue;}else{if (string.IsNullOrEmpty(mSheet.Rows[i][j].ToString()) && xname.Contains("Name")){stringBuilder.Append("<" + mSheet.Rows[0][j].ToString() + "/>");stringBuilder.Append("\r\n");continue;}else if(string.IsNullOrEmpty(mSheet.Rows[i][j].ToString())){continue;}else{stringBuilder.Append("\t\t<" + mSheet.Rows[0][j].ToString() + ">");stringBuilder.Append(mSheet.Rows[i][j].ToString());stringBuilder.Append("</" + mSheet.Rows[0][j].ToString() + ">");stringBuilder.Append("\r\n");}}}//使用换行符分割每一行for (int a = 0; a < mList.Count; a++){if (xname == mList[a]){stringBuilder.Append("\t</" + sList[a] + ">");stringBuilder.Append("\r\n");}}}//闭合标签stringBuilder.Append ("</root>");//写入文件using (FileStream fileStream = new FileStream(XmlFile, FileMode.Create, FileAccess.Write)) {using (TextWriter textWriter = new StreamWriter(fileStream,Encoding.GetEncoding("utf-8"))) {textWriter.Write (stringBuilder.ToString ());}}}/// <summary>/// 设置目标实例的属性/// </summary>private void SetTargetProperty (object target, string propertyName, object propertyValue){//获取类型Type mType = target.GetType ();//获取属性集合PropertyInfo[] mPropertys = mType.GetProperties ();foreach (PropertyInfo property in mPropertys) {if (property.Name == propertyName) {property.SetValue (target, Convert.ChangeType (propertyValue, property.PropertyType), null);}}}
}

Unity 工具类 之 Excel 转换为 json、csv、xml、lua格式相关推荐

  1. Unity 之 Excel表格转换为Unity用的文件格式 -- ScriptableObject,Json,XML 全部搞定

    Unity 之 Excel表格转换为Unity用的文件格式 -- ScriptableObject,Json,XML 全部搞定 前言 一,准备工作 1.1 确认表格表头 1.2 读取Excel 1.3 ...

  2. Unity 工具类 之 简单快速 获取当前所在位置,所在城市,经纬度等

    Unity  工具类 之 简单快速 获取当前所在位置,所在城市,经纬度等 目录 Unity  工具类 之 简单快速 获取当前所在位置,所在城市,经纬度等 一.方法提要: 二.使用注意: 三.json ...

  3. 利用hutool工具类导出Excel

    简单介绍 可以使用hutool工具类,简单的生成Excel.本质上还是使用的POI组件,只是对其进行了封装,避免开发人员重复造轮子 hutool工具类链接 maven导入 <!-- hutool ...

  4. Unity 工具类 之 编辑扩展器 之 简单的音效管理编辑扩展器面板实现

    Unity 工具类 之 编辑扩展器 之 简单的音效管理编辑扩展器面板实现 目录 Unity 工具类 之 编辑扩展器 之 简单的音效管理编辑扩展器面板实现 一.简单介绍 二.实现原理 三.注意事项 四. ...

  5. Unity 工具类 之 WWW/UnityWebRequest 下载压缩文件(zip),解压到本地且加载使用解压数据的简单案例(内也含压缩文件例子)

    Unity 工具类 之 WWW/UnityWebRequest 网络下载压缩文件(zip),解压到本地,且加载使用解压数据的简单案例(内也含压缩文件例子) 目录 Unity 工具类 之 WWW/Uni ...

  6. Unity 工具类 之 贝塞尔 Bezier 曲线

    Unity 工具类 之 贝塞尔 Bezier 曲线 目录 Unity 工具类 之 贝塞尔 Bezier 曲线 一.简单介绍 二.原理与分类 三.公式与原理图演示 五.注意事项 六.样例使用步骤(三次贝 ...

  7. Unity 工具类 之 Blender 的下载和简单使用(为捏脸做准备)

    Unity 工具类 之 Blender 的下载和使用(为捏脸做准备) 目录 Unity 工具类 之 Blender 的下载和使用 一.简单介绍 二.下载地址 三.安装 四.简单使用 1.设置成中文界面 ...

  8. 阿里巴巴json工具类,map转json字符串,map转bean类型

    1:要求是需要将map转bean类型 //使用json工具类导入阿里巴巴的json包 import com.alibaba.fastjson.JSON; //第一步先将map类型转为json字符串 S ...

  9. python读取log文件_python文件读写(一)-txt, log, json, csv, xml文件

    1.概述在平时自动化测试工作中,经常会用python对一些文件进行读写操作.其中使用最多的文件格式,就是txt,  log,  json,  csv,  xml,  zip, tar, gz,  ra ...

最新文章

  1. memcached基本操作和语法
  2. python调用golang 数组_Go 语言数组复制
  3. 微信jssdk 图片上传 JAVA_微信jssdk图片上传
  4. gcc是java的什么意思_为什么gcc支持Java而不是C#
  5. C++——const加深理解之const在函数后
  6. java工作笔记019---java8新特性判断非null
  7. saltstack安装及简单配置
  8. VBA实战技巧精粹010:如何快速选定工作表及Option Base 1
  9. Tasking编译器开发TC275(Tricore)中使用自定义段
  10. 重积分 | 高斯公式使用的四种情况
  11. 戴戴戴师兄-数据分析课程笔记(第一讲)
  12. 给定一个成绩a,使用switch结构求出a的等级。A:90-100,B:80-89,C:70-79,D:60-69,E:0~59
  13. Java Swing窗体JFrame之设置窗体图标
  14. HM编码器代码阅读(32)——帧间预测之AMVP/Merge模式(七)encodeResAndCalcRdInterCU函数:残差计算、变换量化
  15. 知识图谱最新论文清单(附论文解读)
  16. router vue 多个路径_vue-router 路由 总结
  17. hazelcast mysql_HAZELCAST 客户端命令 可用于简单调试
  18. 计算机导论期末考试知识点,计算机导论期末复习(知识点).doc
  19. [免费视频教程]UI自动化测试之Jenkins配置教程
  20. linux openal,OpenAL的一些知识点

热门文章

  1. 微信微网站需要服务器吗,一分钟搭建微信微网站
  2. 【游戏引擎开发必问】 渲染管线的剖析
  3. Kylin作用是什么?
  4. 人人都想自学python_人人都想自学编程,为什么坚持下来的没几个?
  5. Principal Components Regression, Pt.1: The Standard Method
  6. 第七届省赛-海岛争霸(最短路Floyd)
  7. 面试机器学习算法,你需要知道这18个知识点!
  8. H264 SPS 中 VUI 自己碰到的一些比较关键的 字段介绍。
  9. GSAP动画库入门基础示例:心爱的小摩托
  10. 图书预订系统:书店向顾客发放订单,顾客将所填订单交由系统处理,系统首先依据图书目录对订单进行检查并对合格订单进行处理,处理过程中根据顾客情况和订单数目将订单分为优先订单与正常订单两种,随时处理优先订单