如何将Excel文件导入Unity并支持后续更新以开发跨平台应用?
嘿,这个需求我之前做项目的时候刚好踩过坑,用Excel来管理图文内容再同步到Unity确实是个靠谱的方案,尤其是后续更新起来特别省心。我给你拆解两种常用的实现方式,你可以根据自己的项目情况选:
方法一:原生C#解析(无需第三方插件)
这种方式适合不想引入外部依赖的场景,核心思路是把Excel转成CSV格式(Unity对CSV的原生支持更好),再用C#读取:
- 整理Excel结构:把你的图片路径(比如Unity里的
Resources或StreamingAssets路径)和对应文本整理成规范表格,第一行做表头,比如ImagePath、Title、Description,每行对应一组内容。 - 导出为CSV:保存Excel时选择「CSV(逗号分隔)」格式,编码选UTF-8(一定要注意,不然中文会乱码),把这个CSV文件放到Unity项目的
StreamingAssets文件夹里(比Resources更适合后续更新,因为Resources打包后不好替换)。 - 编写读取脚本:写一个简单的加载类,示例代码如下:
using System.Collections.Generic; using System.IO; using UnityEngine; public class ContentLoader : MonoBehaviour { // 存储读取到的所有内容 public List<ContentData> contentList = new List<ContentData>(); // 定义内容数据结构,可序列化方便在Inspector查看 [System.Serializable] public class ContentData { public string imagePath; public string title; public string description; public Sprite imageSprite; } void Start() { LoadContentFromCSV(); } void LoadContentFromCSV() { string filePath = GetCSVFilePath(); if (File.Exists(filePath)) { string[] lines = File.ReadAllLines(filePath); // 跳过第一行表头 for (int i = 1; i < lines.Length; i++) { string[] parts = lines[i].Split(','); if (parts.Length >= 3) { ContentData data = new ContentData(); data.imagePath = parts[0].Trim(); data.title = parts[1].Trim(); data.description = parts[2].Trim(); // 加载图片(以Resources路径为例) if (data.imagePath.StartsWith("Resources/")) { string resourcePath = data.imagePath.Replace("Resources/", "").Replace(".png", "").Replace(".jpg", ""); data.imageSprite = Resources.Load<Sprite>(resourcePath); } // 如果是StreamingAssets里的图片,需要用UnityWebRequest加载,这里可以自行扩展 contentList.Add(data); } } } else { Debug.LogError("找不到CSV文件:" + filePath); } } // 根据不同平台获取正确的文件路径 string GetCSVFilePath() { string filePath; #if UNITY_EDITOR || UNITY_STANDALONE filePath = Path.Combine(Application.streamingAssetsPath, "content.csv"); #elif UNITY_ANDROID filePath = Path.Combine("jar:file://" + Application.dataPath + "!/assets/", "content.csv"); #elif UNITY_IOS filePath = Path.Combine(Application.dataPath + "/Raw/", "content.csv"); #else filePath = ""; #endif return filePath; } } - 后续更新:直接修改原Excel文件,重新导出CSV替换Unity项目里的旧文件就行。如果是已经打包的应用,要是用了
StreamingAssets,安卓可以把CSV放到外部存储(比如SD卡),修改读取路径指向外部;iOS的话可以配合iCloud或者服务器下载更新,要是小更新也可以重新打包替换文件,更灵活的话可以用AssetBundle配合服务器。
方法二:使用第三方插件(高效便捷)
如果你的Excel有复杂格式(比如合并单元格、多Sheet),或者不想自己写解析代码,推荐用Unity Asset Store里的插件,比如ExcelDataReader(免费开源)、EasyExcel for Unity这类工具,这里以ExcelDataReader为例:
- 导入插件:从Asset Store或者GitHub下载ExcelDataReader的Unity包,导入到项目中。
- 放置Excel文件:直接把.xlsx格式的文件放到
StreamingAssets文件夹,不用转CSV。 - 编写读取脚本:示例代码如下:
using System.Collections.Generic; using System.IO; using UnityEngine; using ExcelDataReader; public class ExcelContentLoader : MonoBehaviour { public List<ContentData> contentList = new List<ContentData>(); [System.Serializable] public class ContentData { public string imagePath; public string title; public string description; public Sprite imageSprite; } void Start() { LoadContentFromExcel(); } void LoadContentFromExcel() { string filePath = Path.Combine(Application.streamingAssetsPath, "content.xlsx"); if (!File.Exists(filePath)) { Debug.LogError("找不到Excel文件:" + filePath); return; } using (FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read)) { using (IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(stream)) { var result = reader.AsDataSet(); var table = result.Tables[0]; // 获取第一个Sheet // 遍历行,跳过表头 for (int i = 1; i < table.Rows.Count; i++) { ContentData data = new ContentData(); data.imagePath = table.Rows[i][0].ToString().Trim(); data.title = table.Rows[i][1].ToString().Trim(); data.description = table.Rows[i][2].ToString().Trim(); // 图片加载逻辑和之前一致,按需扩展 contentList.Add(data); } } } } } - 后续更新:和CSV方式一样,直接修改Excel文件替换项目里的旧文件即可。如果是打包后的应用,同样可以把Excel文件放在服务器上,应用启动时检查版本并下载更新,不用重新打包。
额外实用建议
- 图片优化:如果图片数量多,推荐用AssetBundle打包图片,Excel里只存AssetBundle的名称或路径,这样加载更高效,后续更新图片也可以单独更新AssetBundle,不用动Excel。
- 编码问题:不管是CSV还是Excel,一定要确保编码是UTF-8,避免中文乱码。
- 远程更新:如果需要应用发布后无需重新打包就能更新内容,最好把Excel/CSV文件放在服务器上,应用启动时检查服务器文件版本,有更新就下载替换本地文件,这是最灵活的方案。
内容的提问来源于stack exchange,提问作者user9727936
相关产品推荐
相关产品推荐

