@
- 一、 为什么在 Unity 中选择 MiniExcel?
前言
在 Unity 开发中,处理配置数据是家常便饭。很多同学第一反应是使用 NPOI,但写过的人都知道,NPOI 像个沉重的“黑盒”,代码里充满了各种单元格类型判断和繁琐的赋值逻辑。我之前也曾写过Unity之如何接入NPOI 快速读取Excel
今天推荐一个更现代、更轻量的库:MiniExcel。它的特点就是:快、省内存、一行代码转实体。
参考链接:NPOI GitHubMini Excel GitHub
一、 为什么在 Unity 中选择 MiniExcel?
轻量化: DLL 体积小,对 Unity 项目负担极轻。
零学习成本: 只要你会写 C# 实体类,就能用它。
性能优异: 内存占用极低,即使读取超大表格也不会卡死 Unity 编辑器。
支持 LINQ: 可以像过滤 List 一样过滤 Excel 数据。
二、 环境准备
下载 DLL: 在 NuGet 或 GitHub 下载 MiniExcel.dll(建议选择 net45 版本的 DLL)。
导入 Unity: 将 DLL 放入项目中的 Assets/Plugins 文件夹下。
设置 Unity: 确保 Project Settings > Player > Api Compatibility Level 设置为 .NET Standard 2.1 或 .NET 4.x。
三、 实战演练:MiniExcel 常用操作
MiniExcel 的魅力在于它极度简化的 API。以下是你在 Unity 项目中最常会用到的几种操作方式。
- 最简读取:直接转为实体集合 这是最标准的用法。只要你的 Excel 首行是表头,且名称与类属性一致,即可秒转。
// 定义实体类publicclassUserAccount{public Guid ID { get; set; }publicstring Name { get; set; }public DateTime BoT { get; set; }publicint Age { get; set; }}
// 一行代码搞定读取
var rows = MiniExcel.Query<UserAccount>(path).ToList();
在这里插入图片描述- 动态读取:无需定义实体类 (Dynamic) 如果你只是临时读取数据,不想写实体类,可以使用 dynamic。这在读取结构不固定的表格时非常高效。
var rows = MiniExcel.Query(path).ToList();foreach (var row in rows){// 直接通过属性名访问(对应 Excel 表头) Debug.Log($"{row.Name} - {row.Age}"); }
- 多 Sheet 读取 如果一个 Excel 文件里有多个工作表(如:LevelData, ItemData),你可以指定 Sheet 名称。
// 读取指定名称的 Sheetvar sheetData = MiniExcel.Query(path, sheetName: "LevelData");// 获取所有 Sheet 的名称var sheetNames = MiniExcel.GetSheetNames(path);
- 快速导出:将数据存回 Excel 在 Unity 编辑器工具开发中,有时需要将内存数据导出。MiniExcel 同样支持一键保存。
var data = new[] {new { Name ="张三", Age = 18 },new { Name ="李四", Age = 20 }};MiniExcel.SaveAs(path, data);
四、 进阶:我踩过的坑与解决方案
在实际将 MiniExcel 落地到 Unity 项目中时,我遇到了几个 NPOI 也会头疼的问题,这里分享我的处理方案。
- 策划的“花式表头”:如何从指定行开始读? 现实中,Excel 前两行往往是策划写的配置说明。这时不能直接读取,否则映射会失败。
解决方案: 使用 startCell 参数。
// 告诉 MiniExcel,表头在 A3,数据从这里开始var rows = MiniExcel.Query<User>(path, startCell: "A3").ToList();
在这里插入图片描述- 数组类型处理 (string[]) Excel 单元格不支持数组,通常我们会写成 101,102,103。
解决方案: 使用辅助属性(Getter)。
publicstring RawIds { get; set; } // 对应 Excel 单元格publicstring[] Ids => RawIds?.Split(',') ?? newstring[0]; // 逻辑层实际调用