Unity3D_Excel表格的简单读写
注:本篇博客适用于读取 Excel 2007 版本及以上的文件
Excel 文件信息
1. 创建两个 C# 脚本文件(DoExcel、ShowExcel)
using UnityEngine; using System.Data; using System.IO; using Excel; using OfficeOpenXml; /// <summary> /// 读取 Excel 表格 /// </summary> /// public class DoExcel { // 得到表格的信息 private static DataSet ReadExcel(string path) { // FileStream 将文件转化为字节,可以操作任何类型的文件 // File.Open 打开文件 // (1)path 要打开的文件路径 // (2)FileMode (以何种方式打开或者创建文件):CreateNew (创建新文件)、Create (创建并覆盖)、Open (打开) 、OpenOrCreate (打开并创建)、Truncate (盖文件)Append(追加) // (3)FileAcess(文件流对象如何访问该文件):Read (只读) 、Write (写)、ReadWirte(读写) // (4)FileShare (进程如何共享文件):None (拒绝共享)、Read、Write、ReadWrite (同时读写)、Delete FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read); // CreateOpenXmlReader用于读取Excel2007版本及以上的文件 // 后缀为.xlsx IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); // 后缀为.xls //IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream); DataSet result = excelReader.AsDataSet(); excelReader.Close(); return result; } /// <summary> /// 将 Excel 表格的信息转化为 结构体 /// </summary> /// <param name="path">Excel 的路径</param> /// <param name="tablesIndex">读取 Excel 中的第几张表(表格左下角,若读取 sheet1,则该值为0,若读取 sheet2,则该值为1 ...)</param> /// <returns></returns> public static ExcelData[] Load(string path, int tablesIndex = 0) { // 根据路径 解析到Excel DataSet resultds = ReadExcel(path); // 表格中有内容的 列 数(第一列为 1) int column = resultds.Tables[tablesIndex].Columns.Count; // 表格中有内容的 行 数(第一行为 1) int row = resultds.Tables[tablesIndex].Rows.Count; // 初始化结构体数组长度,表格有多少行,结构体数组就有多少个元素 ExcelData[] _data = new ExcelData[row]; // 测试打印:行数,列数 Debug.Log("表格行数为:" + row + ",列数为:" + column); for (int i = 0; i < row; i++) { // 第一行和第一列都是 0 _data[i] = new ExcelData( resultds.Tables[tablesIndex].Rows[i][0].ToString(), resultds.Tables[tablesIndex].Rows[i][1].ToString(), resultds.Tables[tablesIndex].Rows[i][2].ToString(), resultds.Tables[tablesIndex].Rows[i][3].ToString(), resultds.Tables[tablesIndex].Rows[i][4].ToString(), resultds.Tables[tablesIndex].Rows[i][5].ToString(), resultds.Tables[tablesIndex].Rows[i][5].ToString()); } // 测试:是否正确读取到了Excel中的信息(将读取到的信息打印出来) TestPrintWord(_data); return _data; } // 测试方法:测试赋值是否成功 public static string TestPrintWord(ExcelData[] dataList) { string testStr = ""; for (int i = 0; i < dataList.Length; i++) { testStr += dataList[i].xueHao + "\t"; testStr += dataList[i].xingMing + "\t"; testStr += dataList[i].banJi + "\t"; testStr += dataList[i].yuWen + "\t"; testStr += dataList[i].shuXue + "\t"; testStr += dataList[i].yingYu + "\t"; testStr += dataList[i].zongFen + "\t\n"; } Debug.Log(testStr); return testStr; } public static void Write(string path) { // 得到对应路径中的文件信息(如果没有就创建) FileInfo fileInfo = new FileInfo(path); //如果得到了文件中的信息(fileInfo 不为空) if (fileInfo.Exists) { fileInfo.Delete(); // ensures we create a new workbook Debug.Log("删除表"); fileInfo = new FileInfo(path); } using (ExcelPackage package = new ExcelPackage(fileInfo)) { // 添加一张表,并命名(左下角的 sheet) ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("我的Excel"); // 第 1 行,第 1 列 worksheet.Cells[1, 1].Value = "序号"; // 第 1 行,第 2 列 worksheet.Cells[1, 2].Value = "姓名"; // 第 1 行,第 3 列 worksheet.Cells[1, 3].Value = "电话"; // 第 2 行,A 列 worksheet.Cells["A2"].Value = "1"; // 第 2 行,B 列 worksheet.Cells["B2"].Value = "小曼"; // 第 2 行,C 列 worksheet.Cells["C2"].Value = "2313840742"; package.Save(); Debug.Log("导出Excel成功"); } } public static void Write2(string Path,string message = "") { string content = "Agent绝对坐标, Agent相对于Sign, Sign相对于Agent,发生时刻, Sign的名字,持续时常\n" + message; File.WriteAllText(Path, content); } } // 结构体:一般来说 根据 Excel 的表头编写,Excel 中有多少列,结构体中就有多少个字段 public struct ExcelData { public string xueHao; public string xingMing; public string banJi; public string yuWen; public string shuXue; public string yingYu; public string zongFen; public ExcelData(string XueHao, string XingMing, string BanJi, string YuWen, string ShuXue, string YingYu, string ZongFen) { xueHao = XueHao; xingMing = XingMing; banJi = BanJi; yuWen = YuWen; shuXue = ShuXue; yingYu = YingYu; zongFen = ZongFen; } }
using UnityEngine; using UnityEngine.UI; public class ShowExcel : MonoBehaviour { private void Update() { // 按下空格键之后读名为“Read.xlsx”的表格,生成一个名为“Write.xlsx”的表格 if (Input.GetKeyDown(KeyCode.Space)) { DoExcel.Load(Application.streamingAssetsPath + "/Read.xlsx"); DoExcel.Write2(Application.streamingAssetsPath + "/Write.xlsx"); } } }
2. 导入Dll文件
dll文件 及 示例工程可在文章末尾进行下载,只有导入了如下图所示的dll文件,工程打包之后才能用,否则只能在编辑器中使用。
3. 设置 .NET 级别为 .NET 4.x
不设置为 4.x 打包之后只能读取Excel,不能生成Excel,如打包后没有生成 Excel的需求则不用设置此项
示例工程(点击下载)
分类:
Unity3D
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律