Unity Editor扩展 实现一个Excel读表窗口

设计

在这里插入图片描述

Unity Editor窗口类

public class ExcelEditorWindow : EditorWindow
{[MenuItem( "Frameworks/读表配置界面", false, 10 )]private static void Open(){Rect wr = new Rect( 0, 0, 500, 500 );ExcelEditorWindow window = ( ExcelEditorWindow ) EditorWindow.GetWindowWithRect( typeof( ExcelEditorWindow ), wr, true, "Export Excel Window" );window.Show();}}

[MenuItem( “Frameworks/读表配置界面”, false, 10 )]

第一个参数是路径
在这里插入图片描述
第二个参数默认false

第三个参数是优先级 越低越靠上

自定义窗口绘制内容

private void OnGUI()
{}

好 跟着我们的草图 我们一步步的完成就可以了

标题

在这里插入图片描述

选择导入的excel根目录

		GUILayout.Label( "选择一个批量导出的Excel目录: " );GUILayout.BeginHorizontal();excelRootFolder = GUILayout.TextField( excelRootFolder, 128, GUILayout.MaxWidth( 400f ) );if ( GUILayout.Button( "选择目录" ) ){string newFolder = EditorUtility.OpenFolderPanel( "选择Excel目录", excelRootFolder, string.Empty );if ( !string.IsNullOrEmpty( newFolder ) && !string.IsNullOrWhiteSpace( newFolder ) ){excelRootFolder = newFolder;if ( Directory.Exists( excelRootFolder ) ){data.excelRootFolder = excelRootFolder;}}}GUILayout.EndHorizontal();

然后我们下一个功能和这个功能之间 留一点空隙

GUILayout.Space( 4 );

然后就是 批量遍历按钮 和 导出按钮

 		GUILayout.BeginHorizontal();if ( GUILayout.Button( "开始遍历" ) ){excels.Clear();if ( Directory.Exists( excelRootFolder ) ){ConsoleUtils.Clear();string[] xlsxs = Directory.GetFiles( excelRootFolder, "*.xlsx", SearchOption.TopDirectoryOnly );excels.AddRange( xlsxs );}else{EditorUtility.DisplayDialog( "路径错误", $"不存在 {excelRootFolder}", "确认" );Debug.LogError( $"Excel路径错误: {excelRootFolder}" );}}else if ( GUILayout.Button( "批量导出" ) ){BatchExport( excelRootFolder );}else if ( GUILayout.Button( "打开目录 - Excel源" ) ){EditorUtility.RevealInFinder( excelRootFolder );}else if ( GUILayout.Button( "打开目录 - 数据源" ) ){var dataFolder = Path.Combine( Application.dataPath, "BundleRes/ExcelData/" );EditorUtility.RevealInFinder( dataFolder );}else if ( GUILayout.Button( "打开目录 - 数据类" ) ){var csFolder = Path.Combine( Application.dataPath, "Scripts/ExcelCSharp/" );EditorUtility.RevealInFinder( csFolder );}GUILayout.EndHorizontal();

最后就是我们筛选出的excel展示区域 需要一个滑动展示页面

滑动页面核心

excelScrollerPos = EditorGUILayout.BeginScrollView( excelScrollerPos );
//其它需要渲染的目标内容写着中间
EditorGUILayout.EndScrollView();

  if ( excels.Count > 0 ){GUILayout.Space( 4 );excelScrollerPos = EditorGUILayout.BeginScrollView( excelScrollerPos );EditorGUILayout.BeginVertical();for ( int i = 0; i < excels.Count; i++ ){EditorGUILayout.BeginHorizontal();EditorGUILayout.TextArea( excels[ i ], GUILayout.MaxWidth( 400 ) );if ( GUILayout.Button( "Export" ) ){Export( excels[ i ] );}EditorGUILayout.EndHorizontal();}EditorGUILayout.EndVertical();EditorGUILayout.EndScrollView();}

最终效果

在这里插入图片描述

源码

//==========================
// - FileName:      Assets/Frameworks/Editor/Excel/ExcelEditorWindow.cs
// - Created:       ChenJC	
// - CreateTime:    2023-06-19 10:03:20
// - UnityVersion:  2019.4.35f1
// - Version:       1.0
// - Description:   
//==========================
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;public class ExcelEditorWindow : EditorWindow
{[MenuItem( "Frameworks/读表配置界面", false, 10 )]private static void Open(){Rect wr = new Rect( 0, 0, 500, 500 );ExcelEditorWindow window = ( ExcelEditorWindow ) EditorWindow.GetWindowWithRect( typeof( ExcelEditorWindow ), wr, true, "Export Excel Window" );window.Show();}class ExcelEditorConfig {public string excelRootFolder = "Excels";public string lastUpdateTime = string.Empty;}ExcelEditorConfig data;private string GetConfigFilePath(){return Path.Combine( Application.persistentDataPath, nameof( ExcelEditorConfig ) );}private void OnEnable(){if ( !File.Exists( GetConfigFilePath() ) ){data = new ExcelEditorConfig();try{var clips = Application.dataPath.Split( '/' );var projname = clips[ clips.Length - 2 ];var plant = projname.Split( '-' )[ 0 ] + "-plan";var plantPath = Application.dataPath.Replace( $"{projname}/Assets", $"{plant}/Excel/" );data.excelRootFolder = plantPath;}catch ( Exception e ) { }data.excelRootFolder = Path.Combine( Application.dataPath, data.excelRootFolder );}else{try{data = JsonConvert.DeserializeObject<ExcelEditorConfig>( File.ReadAllText( GetConfigFilePath() ) );}catch ( Exception e ){Debug.LogError( e );data = new ExcelEditorConfig();}}data.lastUpdateTime = DateTime.Now.ToString();excelRootFolder = data.excelRootFolder;}private void OnDisable(){try{string jsonstr = JsonConvert.SerializeObject( data );File.WriteAllText( GetConfigFilePath(), jsonstr );}catch ( Exception e ){Debug.LogError( e );}}string excelRootFolder = string.Empty;List<string> excels = new List<string>();Vector2 excelScrollerPos = Vector2.zero;//绘制窗口时调用private void OnGUI(){GUILayout.Label( "选择一个批量导出的Excel目录: " );GUILayout.BeginHorizontal();excelRootFolder = GUILayout.TextField( excelRootFolder, 128, GUILayout.MaxWidth( 400f ) );if ( GUILayout.Button( "选择目录" ) ){string newFolder = EditorUtility.OpenFolderPanel( "选择Excel目录", excelRootFolder, string.Empty );if ( !string.IsNullOrEmpty( newFolder ) && !string.IsNullOrWhiteSpace( newFolder ) ){excelRootFolder = newFolder;if ( Directory.Exists( excelRootFolder ) ){data.excelRootFolder = excelRootFolder;}}}GUILayout.EndHorizontal();GUILayout.Space( 4 );GUILayout.BeginHorizontal();if ( GUILayout.Button( "开始遍历" ) ){excels.Clear();if ( Directory.Exists( excelRootFolder ) ){ConsoleUtils.Clear();string[] xlsxs = Directory.GetFiles( excelRootFolder, "*.xlsx", SearchOption.TopDirectoryOnly );excels.AddRange( xlsxs );}else{EditorUtility.DisplayDialog( "路径错误", $"不存在 {excelRootFolder}", "确认" );Debug.LogError( $"Excel路径错误: {excelRootFolder}" );}}else if ( GUILayout.Button( "批量导出" ) ){BatchExport( excelRootFolder );}else if ( GUILayout.Button( "打开目录 - Excel源" ) ){EditorUtility.RevealInFinder( excelRootFolder );}else if ( GUILayout.Button( "打开目录 - 数据源" ) ){var dataFolder = Path.Combine( Application.dataPath, "BundleRes/ExcelData/" );EditorUtility.RevealInFinder( dataFolder );}else if ( GUILayout.Button( "打开目录 - 数据类" ) ){var csFolder = Path.Combine( Application.dataPath, "Scripts/ExcelCSharp/" );EditorUtility.RevealInFinder( csFolder );}GUILayout.EndHorizontal();if ( excels.Count > 0 ){GUILayout.Space( 4 );excelScrollerPos = EditorGUILayout.BeginScrollView( excelScrollerPos );EditorGUILayout.BeginVertical();for ( int i = 0; i < excels.Count; i++ ){EditorGUILayout.BeginHorizontal();EditorGUILayout.TextArea( excels[ i ], GUILayout.MaxWidth( 400 ) );if ( GUILayout.Button( "Export" ) ){Export( excels[ i ] );}EditorGUILayout.EndHorizontal();}EditorGUILayout.EndVertical();EditorGUILayout.EndScrollView();}}private void Export( string xlsx ){ExcelExport.ConvertFromFile( xlsx );}private void BatchExport( string folder ){ExcelExport.ConvertFromFolder( folder );}private void OnInspectorUpdate(){this.Repaint();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/9255.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React hooks文档笔记(二) 添加交互性

添加交互性 1. 事件传播1.1 停止传播1.2 阻止默认事件 2. [Hook] useState 状态3. 渲染和提交3.1 触发渲染3.2 React渲染组件3.3 提交对 DOM 的更改3.4 浏览器绘制 4. 渲染快照状态队列例子 5. 更新state中的对象 1. 事件传播 js的事件流&#xff1a; 事件捕获&#xff1a;从…

【DBA课程-笔记】MongoDB入门到云上开发

课程目的&#xff1a;成为专业MongoDB的DBA nosql第一&#xff1a;MongoDB 一、讲师&#xff1a; 二、课程目录 第1章&#xff1a;MongoDB数据库入门 第2章&#xff1a;MongoDB数据数据查询与分析 第3章&#xff1a;MongoDB数据库核心知识 第4章&#xff1a;MongoDB数据库管…

MySQL索引

文章目录 MySQL索引1 索引1.1 索引的概念1.2 索引的作用1.3 创建索引的原则依据 2 索引的分类和创建2.1 普通索引2.1.1 直接创建索引2.1.2 修改表方式创建2.1.3 创建表的时候指定索引 2.2 唯一索引2.2.1 直接创建唯一索引2.2.2 修改表方式创建唯一索引2.2.3 创建表的时候指定唯…

SQlite3 编译

参考博客&#xff1a;https://blog.csdn.net/flowerspring/article/details/121268403 1.下载C源码以及def文件https://www.sqlite.org/download.html 2. 下载完成之后解压 sqlite-amalgamation获取C源码&#xff0c;解压sqlite-dll-win32-xx获取里面的def文件。 3.新建sqlite…

MySQL的面试题讲解看完肯定对你有帮助!!

一、理论方面 1.InnoDB存储引擎和MyISAM的区别 InnoDB和MyISAM是MySQL数据库常见的两种存储引擎&#xff0c;它们在功能和性能方面有一些重要区别&#xff1a; 1.事务支持&#xff1a;InnoDB是一个支持事务处理的存储引擎&#xff0c;它使用了ACID&#xff08;原子性、一致性、…

SciencePub学术 | 数据处理类重点SCIEEI征稿中

SciencePub学术 刊源推荐: 数据处理类重点SCI&EI征稿中&#xff01;信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 数据处理类重点SCIE&EI 【期刊简介】IF&#xff1a;3.5-4.0&#xff0c;JCR2区&#xff0c;中科院4区&#xff1b; 【出版社】…

SpringBoot+WebSocket+Session共享

前言 WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端 一、为什么需要WebSocket HTTP 是基于请求响应式的&#xff0c;即通信只能由客户端发起&#xff0c;服务端做出响应&#xff0c;无状态&…

kafka入门,节点服役和退役(新增节点和删除节点)(十二)

1、节点服役 1、克隆准备其中一台节点 2、如果新节点的kafka有被log和datas文件夹要删除 3、修改/etc/hosts 配置新节点映射 1.1 执行负载均衡操作 vim topics-to-move.json{"topic": "主题名称"} {"topics": [{"topic": "fi…

web测试需要注意几个非常重要的测试点

微软语言标准&#xff1a; 全角字符和半角字符都要使用一个空格分开 英文和数字直接要有空页面分辨率&#xff1a; 通常是计算机的默认分辨率&#xff0c;但是还是会有一些老式电脑存在1024*768的情况 浏览器的兼容性&#xff1a; 目前市场上的主流浏览器&#xff1a;IE8.0-…

如何在Mac终端上,用十六进制查看某个硬盘(使用dd和hexdump,所以其他系统也可以使用这个方法)

首先需要强调&#xff1a;这种方法不能保证所有的硬盘都可以查看&#xff0c;有些硬盘由于一些原因会显示“Resource busy”&#xff0c;比如说时间机器的硬盘&#xff0c;内置硬盘等。 准备&#xff1a; 当然是一台 Mac&#xff1b;hexdump程序dd程序 方法如下&#xff1a;…

QT或VS2015报错:Error: C2661: QColor::ct::ct: 没有重载函数接受 5 个参数解决方案

安装了QT5.14.2 MSCV2015配置并同时在QT或VS2015测试并运行都提示没有重载函数接受 5 个参数。 同时还会出现C2134错误&#xff1a;QMetaObject::SuperData::operator const QMetaObject *: 调用不会生成常数表达式的错误 搜索了网络上的结果都让换其它版本&#xff0c;没有…

【Telephony】SIM单卡到双卡的变化

1、注册观察者 --> PhoneFactory.makeDefaultPhones() --> TelephonyComponentFactory.makeSubscriptionInfoUpdater() --> new SubscriptionInfoUpdater() --> PhoneConfigurationManager.registerForMultiSimConfigChange(this, EVENT_MULTI_SIM_CONFIG_CHAN…