using UnityEngine; using UnityEditor; using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; public class BuildExcelWindow : EditorWindow { // 定义一个静态变量来持有选中的ScriptableObject引用 public static TaskConfig selectedObject; [MenuItem("MyTools/addexcel")] public static void ExportScriptableObjectToExcel() { string path = EditorUtility.OpenFilePanel("Select File", "", ""); if (!string.IsNullOrEmpty(path)) { string pp = path.Split('/')[path.Split('/').Length - 2] +"/"+ path.Split('/')[path.Split('/').Length - 1]; Debug.Log("Selected file: " + pp); var obj = AssetDatabase.LoadAssetAtPath(pp); if (obj != null) { Selection.activeObject = obj; Debug.Log("Selected MyScriptableObject: " + obj.name); StringBuilder csv = new StringBuilder(); // 添加标题行 // csv.AppendLine("Name,Number"); for (int i = 0; i < obj.TaskList.Count; i++) { string xs = ""; if (obj.TaskList[i].xiansuos != null && obj.TaskList[i].xiansuos.Length > 0) { for (int j = 0; j < obj.TaskList[i].xiansuos.Length; j++) { if (j >= obj.TaskList[i].xiansuos.Length - 1) { xs += obj.TaskList[i].xiansuos[j]; } else { xs += obj.TaskList[i].xiansuos[j] + "|"; } } } string dj = ""; if (obj.TaskList[i].daojus != null && obj.TaskList[i].daojus.Length > 0) { for (int j = 0; j < obj.TaskList[i].daojus.Length; j++) { if (j >= obj.TaskList[i].daojus.Length - 1) { dj += obj.TaskList[i].daojus[j]; } else { dj += obj.TaskList[i].daojus[j] + "|"; } } } // 添加数据行 csv.AppendLine($"{i + 1},{obj.TaskList[i].info},{obj.TaskList[i].info2}" + $",{xs}" + $",{obj.TaskList[i].type}" + $",{obj.TaskList[i].isNoshow}" + $",{obj.TaskList[i].bgName}" + $",{obj.TaskList[i].imgName}" + $",{obj.TaskList[i].taskcheck}" + $",{obj.TaskList[i].centerName}" + $",{obj.TaskList[i].lihui}" + $",{obj.TaskList[i].texiao}" + $",{obj.TaskList[i].guochang}" + $",{obj.TaskList[i].isguochangskip}" + $",{obj.TaskList[i].lihuisize}" + $",{obj.TaskList[i].centersize}" + $",{obj.TaskList[i].perbName}" + $",{obj.TaskList[i].isClose}" + $",{obj.TaskList[i].isTuo}" + $",{dj}" + $",{obj.TaskList[i].isClosebtShow}" + $",{obj.TaskList[i].isTextNext}" + $",{obj.TaskList[i].isARSao}" + $",{obj.TaskList[i].arid}"); } string nameWithoutExtension = GetFileNameWithoutExtension(path); Debug.Log(nameWithoutExtension); // 写入文件 File.WriteAllText(Application.streamingAssetsPath + "/" + nameWithoutExtension + ".csv", csv.ToString()); } } } public static string GetFileNameWithoutExtension(string filePath) { return Path.GetFileNameWithoutExtension(filePath); } [MenuItem("MyTools/Excel Window",priority = 100)] public static void ShowReadExcelWindow() { BuildExcelWindow window = GetWindow(true); window.Show(); window.minSize = new Vector2(475,475); } //Excel读取路径,绝对路径,放在Assets同级路径 private static string excelReadAbsolutePath; //自动生成C#类文件路径,绝对路径 private static string scriptSaveAbsolutePath; private static string scriptSaveRelativePath; //自动生成Asset文件路径,相对路径 private static string assetSaveRelativePath; private List fileNameList = new List(); private List filePathList = new List(); private void Awake() { titleContent.text = "Excel配置表读取"; excelReadAbsolutePath = Application.dataPath.Replace("Assets","Excel"); scriptSaveAbsolutePath = Application.dataPath + CheckEditorPath("/Script/Excel/AutoCreateCSCode"); scriptSaveRelativePath = CheckEditorPath("Assets/Script/Excel/AutoCreateCSCode"); assetSaveRelativePath = CheckEditorPath("Assets/AssetData/Excel/AutoCreateAsset"); } private void OnEnable() { RefreshExcelFile(); } private void OnDisable() { fileNameList.Clear(); filePathList.Clear(); } private Vector2 scrollPosition = Vector2.zero; private void OnGUI() { GUILayout.Space(10); scrollPosition = GUILayout.BeginScrollView(scrollPosition,GUILayout.Width(position.width),GUILayout.Height(position.height)); //展示路径 GUILayout.BeginHorizontal(GUILayout.Height(20)); if(GUILayout.Button("Excel读取路径",GUILayout.Width(100))) { EditorUtility.OpenWithDefaultApp(excelReadAbsolutePath); Debug.Log(excelReadAbsolutePath); } if(GUILayout.Button("Script保存路径",GUILayout.Width(100))) { SelectObject(scriptSaveRelativePath); } if(GUILayout.Button("Asset保存路径",GUILayout.Width(100))) { SelectObject(assetSaveRelativePath); } GUILayout.EndHorizontal(); GUILayout.Space(5); //Excel列表 GUILayout.Label("Excel列表:"); for(int i = 0; i < fileNameList.Count; i++) { GUILayout.BeginHorizontal("Box",GUILayout.Height(40)); GUILayout.Label($"{i}:","Titlebar Foldout",GUILayout.Width(30),GUILayout.Height(35)); GUILayout.Box(fileNameList[i],"MeTransitionBlock",GUILayout.MinWidth(200),GUILayout.Height(35)); GUILayout.Space(10); //生成CS代码 if(GUILayout.Button("Create Script",GUILayout.Width(100),GUILayout.Height(30))) { ExcelDataReader.ReadOneExcelToCode(filePathList[i],scriptSaveAbsolutePath); } //生成Asset文件 if(GUILayout.Button("Create Asset",GUILayout.Width(100),GUILayout.Height(30))) { ExcelDataReader.CreateOneExcelAsset(filePathList[i],assetSaveRelativePath); } GUILayout.EndHorizontal(); GUILayout.Space(5); } GUILayout.Space(10); //一键处理所有Excel GUILayout.Label("一键操作:"); GUILayout.BeginHorizontal("Box",GUILayout.Height(40)); GUILayout.Label("all","Titlebar Foldout",GUILayout.Width(30),GUILayout.Height(35)); GUILayout.Box("All Excel","MeTransitionBlock",GUILayout.MinWidth(200),GUILayout.Height(35)); GUILayout.Space(10); if(GUILayout.Button("Create Script",GUILayout.Width(100),GUILayout.Height(30))) { ExcelDataReader.ReadAllExcelToCode(excelReadAbsolutePath,scriptSaveAbsolutePath); } if(GUILayout.Button("Create Asset",GUILayout.Width(100),GUILayout.Height(30))) { ExcelDataReader.CreateAllExcelAsset(excelReadAbsolutePath,assetSaveRelativePath); } GUILayout.EndHorizontal(); // GUILayout.Space(20); // GUILayout.EndScrollView(); } //读取指定路径下的Excel文件名 private void RefreshExcelFile() { fileNameList.Clear(); filePathList.Clear(); if(!Directory.Exists(excelReadAbsolutePath)) { Debug.LogError("无效路径:" + excelReadAbsolutePath); return; } string[] excelFileFullPaths = Directory.GetFiles(excelReadAbsolutePath,"*.xlsx"); if(excelFileFullPaths == null || excelFileFullPaths.Length == 0) { Debug.LogError(excelReadAbsolutePath + "路径下没有找到Excel文件"); return; } filePathList.AddRange(excelFileFullPaths); for(int i = 0; i < filePathList.Count; i++) { fileNameList.Add(Path.GetFileName(filePathList[i])); } Debug.Log("找到Excel文件:" + fileNameList.Count + "个"); } private void SelectObject(string targetPath) { Object targetObj = AssetDatabase.LoadAssetAtPath(targetPath); EditorGUIUtility.PingObject(targetObj); Selection.activeObject = targetObj; Debug.Log(targetPath); } private static string CheckEditorPath(string path) { #if UNITY_EDITOR_WIN return path.Replace("/","\\"); #elif UNITY_EDITOR_OSX return path.Replace("\\","/"); #else return path; #endif } }