导表工具意在让策划可以方便的修改大量数据而不依赖程序。在项目初期程序要定义各种数据结构,并且与策划约定好表的格式,就可以开始做导表工具了。程序呢可以把这个工具做的更灵活些,这样以后对表的增删改查或者应对不同的表也能很方便。
[System.Serializable]public class HeroBaseData{public string heroName;public float heroHP;public float moveSpeed;public float chargeCD;public float defenseValue;public int[] skillList;}
下面就可以做工具了,在这之前准备一些第三方插件导入到Unity项目中:
using Excel;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Reflection;
using UnityEditor;
/// <summary>
/// xlsc->Json 需要引入Excel和NetworkJson插件
/// </summary>
public class XLSXToJson
{[MenuItem("XLSX/ToJson")]public static void DoXlsxToJson(){string dataPath = UnityEngine.Application.dataPath;// xlsx路径string xlsxPath = string.Format("{0}Xlsx/BaseData.xlsx", dataPath.Remove(dataPath.IndexOf("Assets")));// xlsx工作表名名string[] SheetNames = { "ALLHeros" };FileStream stream = null;try{stream = File.Open(xlsxPath, FileMode.Open, FileAccess.Read);}catch (IOException e){UnityEngine.Debug.LogFormat("关闭xlsx文件后重试!");}if (stream == null)return;IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);DataSet result = excelReader.AsDataSet();UnityEngine.Debug.Log(result.DataSetName);// 读取第一张工资表ReadSingleSheet(typeof(HeroBaseData), result.Tables[SheetNames[0]], string.Format("{0}/{1}.json", UnityEngine.Application.streamingAssetsPath, SheetNames[0]));UnityEngine.Debug.Log("保存完成!");}/// <summary>/// 读取一个工作表的数据/// </summary>/// <param name="type">要转换的struct或class类型</param>/// <param name="dataTable">读取的工作表数据</param>/// <param name="jsonPath">存储路径</param>private static void ReadSingleSheet(Type type, DataTable dataTable, string jsonPath){int rows = dataTable.Rows.Count;int Columns = dataTable.Columns.Count;// 工作表的行数据DataRowCollection collect = dataTable.Rows;// xlsx对应的数据字段,规定是第二行string[] jsonFileds = new string[Columns];// 要保存成Json的objList<object> objsToSave = new List<object>();for (int i = 0; i < Columns; i++){jsonFileds[i] = collect[1][i].ToString();}// 从第三行开始for (int i = 3; i < rows; i++){// 生成一个实例Object objIns = type.Assembly.CreateInstance(type.ToString());for (int j = 0; j < Columns; j++){// 获取字段FieldInfo field = type.GetField(jsonFileds[j]);if (field != null){object value = null;try // 赋值{value = Convert.ChangeType(collect[i][j], field.FieldType);}catch (InvalidCastException e) // 一般到这都是Int数组,当然还可以更细致的处理不同类型的数组{Console.WriteLine(e.Message);string str = collect[i][j].ToString();string[] strs = str.Split(',');int[] ints = new int[strs.Length];for (int k = 0; k < strs.Length; k++){ints[k] = int.Parse(strs[k]);}value = ints;}field.SetValue(objIns, value);}else{UnityEngine.Debug.LogFormat("有无法识别的字符串:{0}", jsonFileds[j]);}}objsToSave.Add(objIns);}// 保存为Jsonstring content = Newtonsoft.Json.JsonConvert.SerializeObject(objsToSave);SaveFile(content, jsonPath);}private static void SaveFile(string content, string jsonPath){StreamWriter streamWriter;FileStream fileStream;if (File.Exists(jsonPath)){File.Delete(jsonPath);}fileStream = new FileStream(jsonPath, FileMode.Create);streamWriter = new StreamWriter(fileStream);streamWriter.Write(content);streamWriter.Close();}
}
转化成json之后,我们代码里就可以直接使用json了:
public static List<T> JsonToObj<T>(string strPath){return (List<T>)JsonConvert.DeserializeObject(ReadStringInfo(strPath), typeof(List<T>));}
不只是json,同理我们可以把excel转化成其他想要的格式,还可以进行加密。
本文发布于:2024-02-05 01:41:45,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170721145161868.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |