廢話不多說,對 Excel 表的操作少不了要引入第三方庫,首先我們需要引入 Excel.dll 和 ICSharpCode.SharpZipLib.dll,這兩個類庫在網上都能找到;然后我們還需要引入 System.Data.dll,這個類庫在 Unity3D 的安裝路徑下的 Editor\Data\Mono\lib\mono\unity 文件夾下能找到。
代碼如下:
1 using Excel; 2 using System.Data; 3 using System.IO; 4 using UnityEngine; 5 6 public class Test : MonoBehaviour 7 { 8 #region -- 變量定義 9 10 #endregion 11 12 #region -- 系統函數 13 private void Start() 14 { 15 DataRowCollection _dataRowCollection = ReadExcel(Application.streamingAssetsPath + "/學生信息.xlsx"); 16 //這里從 1 開始循環,因為第一行被表頭占據了。所以具體解析數據的時候需要根據具體情況來定。 17 for (int i = 1; i < _dataRowCollection.Count; i++) 18 { 19 Debug.Log("學號:" + _dataRowCollection[i][0] + "--" + "姓名:" + _dataRowCollection[i][1] + "--" + "年齡:" + _dataRowCollection[i][2]); 20 } 21 } 22 #endregion 23 24 #region -- 自定義函數 25 /// <summary> 26 /// 讀取 Excel 表並返回一個 DataRowCollection 對象 27 /// </summary> 28 /// <param name="_path">Excel 表路徑</param> 29 /// <param name="_sheetIndex">讀取的 Sheet 索引。Excel 表中是有多個 Sheet 的</param> 30 /// <returns></returns> 31 private static DataRowCollection ReadExcel(string _path, int _sheetIndex = 0) 32 { 33 FileStream stream = File.Open(_path, FileMode.Open, FileAccess.Read, FileShare.Read); 34 //IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);//讀取 Excel 1997-2003版本 35 IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);//讀取 2007及以后的版本 36 DataSet result = excelReader.AsDataSet(); 37 return result.Tables[_sheetIndex].Rows; 38 } 39 /// <summary> 40 /// 讀取 Excel 表並返回一個 DataRowCollection 對象 41 /// </summary> 42 /// <param name="_path">Excel 表路徑</param> 43 /// <param name="_sheetIndex">讀取的 Sheet 名稱。Excel 表中是有多個 Sheet 的</param> 44 /// <returns></returns> 45 private static DataRowCollection ReadExcel(string _path, string _sheetName) 46 { 47 FileStream stream = File.Open(_path, FileMode.Open, FileAccess.Read, FileShare.Read); 48 //IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);//讀取 Excel 1997-2003版本 49 IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);//讀取 2007及以后的版本 50 DataSet result = excelReader.AsDataSet(); 51 return result.Tables[_sheetName].Rows; 52 } 53 #endregion 54 55 }
運行效果如下:
這里需要注意的是,根據 Excel 表的版本不同,使用的方法也不一致,我在代碼中也有注釋,大家看一下就行。還有就是 Sheet ,在讀取的時候,我們可以根據索引去讀取,也可以根據名稱去讀取,我也寫了重載方法。
如果這樣寫,發布后運行,也許會報錯,這時我們就又需要引入第三方庫了,去 Unity3D 安裝路徑下的Editor\Data\Mono\lib\mono\unity,找到所有 I18N 開頭的類庫導入Unity中,就不會報錯了,如下圖:
Excel 表的讀取功能解決了,那我們如何生成一張 Excel 表,並寫入數據呢?這時我們需要導入一個叫 EPPlus.dll 的類庫,網上也有,大家可以自己下載。
代碼如下:
1 private void Start() 2 { 3 string _filePath = Application.streamingAssetsPath + "/學生信息2.xlsx"; 4 string _sheetName = "詳情"; 5 6 FileInfo _excelName = new FileInfo(_filePath); 7 if (_excelName.Exists) 8 { 9 //刪除舊文件,並創建一個新的 excel 文件。 10 _excelName.Delete(); 11 _excelName = new FileInfo(_filePath); 12 } 13 14 //通過ExcelPackage打開文件 15 using (ExcelPackage package = new ExcelPackage(_excelName)) 16 { 17 //在 excel 空文件添加新 sheet,並設置名稱。 18 ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(_sheetName); 19 20 //添加列名 21 worksheet.Cells[1, 1].Value = "學號"; 22 worksheet.Cells[1, 2].Value = "姓名"; 23 worksheet.Cells[1, 3].Value = "性別"; 24 25 //添加一行數據 26 worksheet.Cells[2, 1].Value = 100001; 27 worksheet.Cells[2, 2].Value = "張三"; 28 worksheet.Cells[2, 3].Value = "男"; 29 30 //添加一行數據 31 worksheet.Cells[3, 1].Value = 100002; 32 worksheet.Cells[3, 2].Value = "Hammer"; 33 worksheet.Cells[3, 3].Value = "女"; 34 35 //添加一行數據 36 worksheet.Cells[4, 1].Value = 120033; 37 worksheet.Cells[4, 2].Value = "Saw"; 38 worksheet.Cells[4, 3].Value = "男"; 39 40 //保存excel 41 package.Save(); 42 } 43 }
運行效果圖如下:
Excel 表的讀寫操作大致就是這樣的。但是我不建議,大家直接讀取 Excel 表,因為 Excel 表 包含太多的格式信息,最好是將 Excel 表另存為純文本的 CSV 文件再去讀取,關於 CSV 文件的讀取,網上有一大堆,有時間我自己也寫一篇。