using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Data; using System.IO; using System.Text; using Excel; using UnityEditor; using Data; using UnityEngine.UI; using System; public class ExcelBuild : Editor { public static DataRowCollection ReadExcel(string filePath, ref int columnNum, ref int rowNum) { FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); //Debug.Log(stream); DataSet result = excelReader.AsDataSet(); //Debug.Log(result); // 获取第一张表的数据 columnNum = result.Tables[0].Columns.Count; rowNum = result.Tables[0].Rows.Count; return result.Tables[0].Rows; } /// /// 读取表数据,生成对应的数组 /// /// excel文件全路径 /// Item数组 public static Item[] CreateItemArrayWithExcel(string filePath) { int columnNum = 0, rowNum = 0; DataRowCollection collect = ReadExcel(filePath, ref columnNum, ref rowNum); // 根据excel的定义,第二行开始才是数据,因此这里需要从1开始 //Item[] array = new Item[rowNum - 1]; // 减去第一行(标题行) //for (int i = 1; i < rowNum; i++) // 从1开始,跳过标题行 Item[] array = new Item[rowNum]; // 减去第一行(标题行) for (int i = 0; i < rowNum; i++) // 从1开始,跳过标题行 { Item item = new Item(); item.itemData = new List(); // 解析每列的数据 try { for (int j = 0; j < columnNum; j++) { //Debug.Log("i:"+i+" j:"+j+" value:"+collect[i][j].ToString()); ItemData itemData = new ItemData(); // 这里可以根据实际情况,解析每列的数据类型,比如int、float、string等 // 这里假设每列都是string类型 itemData.item = collect[i][j].ToString(); item.itemData.Add(itemData); } } catch (FormatException e) { // 如果解析失败,输出错误信息 Debug.LogError("解析Excel数据时发生格式错误: " + e.Message); // 并且返回null数组,或者你可以选择跳过错误行,继续解析 return null; } array[i] = item; // 将解析好的item放入数组中,注意索引从i-1开始 } return array; } [MenuItem("CustomEditor/CreateItemAsset")] public static void CreateItemAsset() { ItemManager manager = ScriptableObject.CreateInstance(); // 赋值 Item[] items = CreateItemArrayWithExcel(Application.dataPath + "/Excels/" + "biao01.xlsx"); if (items != null) { manager.dataArray = items; } else { Debug.LogError("无法创建Item Asset,因为CreateItemArrayWithExcel返回了null"); return; } // 确保文件夹存在 if (!Directory.Exists("Assets/Resources/DataAssets/")) { Directory.CreateDirectory("Assets/Resources/DataAssets/"); } // asset文件的路径 要以"Assets/..."开始,否则CreateAsset会报错 string assetPath = string.Format("{0}{1}.asset", "Assets/Resources/DataAssets/", "Item"); // 生成一个Asset文件 AssetDatabase.CreateAsset(manager, assetPath); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } [MenuItem("GameObject/MyMenu/SaveExcelDataToUI")] public static void SaveExcelDataToUI() { int columnNum = 0, rowNum = 0; FileStream stream = File.Open(Application.dataPath + "/Excels/" + "biao01.xlsx", FileMode.Open, FileAccess.Read, FileShare.Read); IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); DataSet result = excelReader.AsDataSet(); // 获取第一张表的数据 columnNum = result.Tables[0].Columns.Count; rowNum = result.Tables[0].Rows.Count; DataRowCollection collect = result.Tables[0].Rows; if (Selection.activeGameObject) { GameObject inputObj = null; GameObject rowObj = null; // 查找子对象中的rowObj和inputObj foreach (var item in Selection.activeGameObject.transform.GetComponentsInChildren(true)) { if (item.name == "rowObj") { rowObj = item.gameObject; } else if (item.name == "inputObj") { inputObj = item.gameObject; } } Transform rowParent = Selection.activeGameObject.transform; Transform columnParent = null; Transform columnItem = null; string content; for (int i = 0; i < rowNum; i++) // 从1开始,跳过标题行 { columnParent = (Instantiate(rowObj) as GameObject).transform; columnParent.name = (i).ToString(); columnParent.gameObject.SetActive(true); columnParent.parent = rowParent; columnParent.localScale = Vector3.one; columnParent.localPosition = new Vector3(0, -29 * (i - 1), 0); // 调整位置计算,以适应跳过的标题行 columnParent.localEulerAngles = Vector3.zero; for (int j = 0; j < columnNum; j++) { columnItem = ((Instantiate(inputObj)) as GameObject).transform; columnItem.gameObject.SetActive(true); columnItem.parent = columnParent; columnItem.localScale = Vector3.one; content = collect[i][j].ToString(); columnItem.GetComponent().text = content; } } rowParent.GetComponent().sizeDelta = new Vector2(columnParent.GetComponent().sizeDelta.x, (28 * (rowNum))); } } }