Unity 之 Excel表格轉換為Unity用的檔案格式 -- ScriptableObject,Json,XML 全部搞定
- 前言
- 一,準備作業
- 1.1 確認表格表頭
- 1.2 讀取Excel
- 1.3 存盤資料
- 1.4 組態檔類
- 二,轉換為ScriptableObject
- 三,轉換為Json
- 四,轉換為XML
- 五,使用小結
前言
最近作業中遇到的一個問題,其他同事在網上抓來的資料保存為Excel表格,需要在Unity中進行使用其中的資料進行開發,有些經驗的同學都知道Unity是可以對Excel進行操作的,由于我Excel并不是Unity中常用的資料格式,并且相同數量級的情況下其他資料格式會比Excel更節省記憶體空間,于是有了這篇文章 – Excel表格轉換為Unity用的檔案格式,由于需求和個人習慣的不同,我這里為大家提供了轉換為三種格式的方法 – ScriptableObject,Json,XML,
一,準備作業
1.1 確認表格表頭
既然是Excel進行格式轉換,首先要有一個Excel表格吧,所以新建一個Excel:(注意:后綴是.xlsx)

模擬資料撰寫如下:

這時表頭就確定好了:
| 任務ID | 任務描述 | 任務獎勵 |
|---|---|---|
| task_id | task_describe | task_reward |
1.2 讀取Excel
- 匯入用到的dll庫
沒有的童鞋文末獲取:

- 參考命名空間:
using Excel;
- 撰寫讀取方法:
/// <summary>
/// 處理Excel工具類
/// </summary>
public class ExcelTool
{
/// <summary>
/// 讀取excel檔案內容
/// </summary>
/// <param name="filePath">檔案路徑</param>
/// <param name="columnNum">行數</param>
/// <param name="rowNum">列數</param>
/// <returns></returns>
static DataRowCollection ReadExcelContext(string filePath, ref int columnNum, ref int rowNum)
{
FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
// Debug.Log(stream == null);
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
DataSet result = excelReader.AsDataSet();
// Tables[0] 下標0表示excel檔案中第一張表的資料
columnNum = result.Tables[0].Columns.Count;
rowNum = result.Tables[0].Rows.Count;
return result.Tables[0].Rows;
}
}
1.3 存盤資料
按照1.1確認的表頭,寫一個資料類:
/// <summary>
/// 資料序列化類 -- 和Excel列一一對應
/// </summary>
[System.Serializable]
public class ExcelItem
{
public int task_id;
public string task_describe;
public string task_reward;
}
再添加一個資料管理類,作為讀出來的所有資料的和,最后也是將它轉換為我們要存盤的格式,
一開始使我是這樣寫的:
public class ExcelManager
{
public static ExcelItem[] dataArray;
}
不過后來為了兼容轉換為ScriptableObject格式改成了如下寫法:
public class ExcelManager : ScriptableObject
{
public ExcelItem[] dataArray;
}
最后轉化格式的原理是一樣的,只是在呼叫上略有不同,
有了上面兩個類之后,我們將在Excel中讀出來的資料存盤起來,在ExcelTool類中撰寫方法:
/// <summary>
/// 讀取表資料,生成對應的陣列
/// </summary>
/// <param name="filePath">excel檔案全路徑</param>
/// <returns>Item陣列</returns>
public static ExcelItem[] CreateItemArrayWithExcel(string filePath)
{
//獲得表資料
int columnNum = 0, rowNum = 0;
Debug.Log(filePath);
DataRowCollection collect = ReadExcelContext(filePath, ref columnNum, ref rowNum);
Debug.Log("讀取到資料表 列數 columnNum : " + columnNum + " ,行數 rowNum: " + rowNum);
// 第一行是標題(頭)
//for (int i = 0; i < columnNum; i++)
//{
// rowTitleList.Add(collect[0][i].ToString());
//}
//第二行開始才是資料
ExcelItem[] array = new ExcelItem[rowNum - 1];
for (int i = 1; i < rowNum; i++)
{
ExcelItem item = new ExcelItem();
//決議每列的資料
item.task_id = int.Parse(collect[i][0].ToString());
item.task_describe = collect[i][1].ToString();
item.task_reward = collect[i][2].ToString();
array[i - 1] = item;
}
return array;
}
至此在Excel中的所有資料,都被保存到ExcelManager 中 ExcelItem[] 型別的陣列dataArray 中了,
1.4 組態檔類
為了方便后續使用,我定義了一個組態檔類,用來存盤讀取Excel檔案路徑,檔案名 和保存其他格式檔案的路徑和檔案名稱,這樣以后有路徑更改的時候,只需要在這個類中進行修改就可以了,
public class ExcelConfig
{
/// <summary>
/// 存放excel表檔案夾的的路徑,本例Excel表放在了"Assets/Excels/"當中
/// </summary>
public static readonly string excelsFolderPath = Application.dataPath + "/ReadExcel/";
/// <summary>
/// 要讀取的Excel檔案名稱 -- 后綴為xlsx
/// </summary>
public static readonly string excelName = "TaskConfig.xlsx";
/// <summary>
/// 存放Excel轉化后檔案的檔案夾路徑
/// </summary>
public static readonly string assetPath = "Assets/ReadExcel/";
/// <summary>
/// 保存處理后資料檔案名稱
/// </summary>
public static readonly string saveName = "TaskConfig";
}
二,轉換為ScriptableObject
在編輯器拓展中處理格式轉換,這樣有資料更新,就只需要替換Excel檔案,然后點點按鈕就可以更新檔案了,
創建"Editor"檔案夾,在其下創建“ExcelBuild”腳本,撰寫拓展方法代碼如下:
using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Xml;
using UnityEditor;
using UnityEngine;
// <summary>
/// 編輯器擴展 將xlsx檔案轉換為其他格式
/// </summary>
public class ExcelBuild : Editor
{
/// <summary>
/// 轉換為 ScriptableObject
/// </summary>
[MenuItem("CustomEditor/CreateExcelAsset")]
public static void CreateItemAsset() {
ExcelManager excelManager = CreateInstance<ExcelManager>();
//賦值
excelManager.dataArray = ExcelTool.CreateItemArrayWithExcel(ExcelConfig.excelsFolderPath + ExcelConfig.excelName);
// 確保檔案夾存在
if(!Directory.Exists(ExcelConfig.assetPath)) {
Directory.CreateDirectory(ExcelConfig.assetPath);
}
// asset檔案的路徑 要以"Assets/..."開始,否則CreateAsset會報錯
string assetPath = string.Format("{0}{1}.asset", ExcelConfig.assetPath, ExcelConfig.saveName);
// 生成一個Asset檔案
AssetDatabase.CreateAsset(excelManager, assetPath);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
}
最后點擊“CustomEditor” --> “CreateExcelAsset” 既可以得到.asset格式的檔案了:

三,轉換為Json
若你跳過了2步驟,則需要創建"Editor"檔案夾,在其下創建“ExcelBuild”腳本,若為跳過,則直接“ExcelBuild”,添加方法即可
撰寫拓展方法代碼如下:
using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Xml;
using UnityEditor;
using UnityEngine;
// <summary>
/// 編輯器擴展 將xlsx檔案轉換為其他格式
/// </summary>
public class ExcelBuild : Editor
{
/// <summary>
/// 轉換為 JSON
/// </summary>
[MenuItem("CustomEditor/CreateExcelJson")]
public static void CreateExcelJson()
{
ExcelManager excelManager = CreateInstance<ExcelManager>();
//賦值
excelManager.dataArray = ExcelTool.CreateItemArrayWithExcel(ExcelConfig.excelsFolderPath + ExcelConfig.excelName);
// 檔案保存路徑
string filePath = ExcelConfig.assetPath + ExcelConfig.saveName + ".json";
// 找到當前路徑
FileInfo file = new FileInfo(filePath);
// 判斷有沒有檔案,有則打開檔案,沒有創建后打開檔案
StreamWriter sw = file.CreateText();
// ToJson介面將你的串列類傳進去,并自動轉換為string型別
string json = JsonUtility.ToJson(excelManager);
// 轉碼
Regex reg = new Regex(@"(?i)\\[uU]([0-9a-f]{4})");
json = reg.Replace(json, delegate (Match m) { return ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString(); });
// 將轉換好的字串存進檔案,
sw.WriteLine(json);
// 注意釋放資源
sw.Close();
sw.Dispose();
AssetDatabase.Refresh();
}
}
最后點擊“CustomEditor” --> “CreateExcelJson” 既可以得到.json格式的檔案了:

四,轉換為XML
若你跳過了2步驟,則需要創建"Editor"檔案夾,在其下創建“ExcelBuild”腳本,若為跳過,則直接“ExcelBuild”,添加方法即可
撰寫拓展方法代碼如下:
using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Xml;
using UnityEditor;
using UnityEngine;
// <summary>
/// 編輯器擴展 將xlsx檔案轉換為其他格式
/// </summary>
public class ExcelBuild : Editor
{
/// <summary>
/// 轉換為 XML
/// </summary>
[MenuItem("CustomEditor/CreateExcelXML")]
public static void CreateExcelXML()
{
ExcelManager excelManager = CreateInstance<ExcelManager>();
//賦值
excelManager.dataArray = ExcelTool.CreateItemArrayWithExcel(ExcelConfig.excelsFolderPath + ExcelConfig.excelName);
// 檔案保存路徑
string filePath = ExcelConfig.assetPath + ExcelConfig.saveName + ".XML";
XmlDocument doc = new XmlDocument();
//創建根節點
XmlElement root = doc.CreateElement("root");
// 設定根節點
doc.AppendChild(root);
for (int i = 0; i < excelManager.dataArray.Length; i++)
{
// 一級子節點
XmlElement data = doc.CreateElement("Data");
// 設定和根節點的關系
root.AppendChild(data);
//創建資料子節點
XmlElement itemId = doc.CreateElement("task_id");
XmlElement itemDescribe = doc.CreateElement("task_describe");
XmlElement itemReward = doc.CreateElement("task_reward");
// 設定節點間關系
data.AppendChild(itemId);
data.AppendChild(itemDescribe);
data.AppendChild(itemReward);
// 資料負值
itemId.InnerText = excelManager.dataArray[i].task_id.ToString();
itemDescribe.InnerText = excelManager.dataArray[i].task_describe;
itemReward.InnerText = excelManager.dataArray[i].task_reward;
}
// 保存到本地
doc.Save(filePath);
AssetDatabase.Refresh();
}
}
最后點擊“CustomEditor” --> “CreateExcelXML” 既可以得到.XML格式的檔案了:

五,使用小結
-
Excel轉換為上面三種格式的準備作業是一致的
都需要對Excel進行讀取存盤,若表頭有改動則需要更改ExcelItem類的對應資料

還需要修改ExcelTool.CreateItemArrayWithExcel存盤方法:

-
在撰寫轉換XML格式的檔案時的拓展方法寫的具體,若有大量的改動會很麻煩,建議使用轉換為JSON格式的拓展方法,然后通過工具進行JSON到XML格式的轉換,比如:

工具目錄:

Excel的元件:獲取鏈接
轉換工具原始碼分享:獲取鏈接
積分不足的小伙伴,可以私信我哦~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293054.html
標籤:其他
上一篇:C語言實作掃雷(初階)
