2022-07-04 11:17:39 +00:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Data;
|
|
|
|
|
|
using System.IO;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using UnityEngine;
|
2022-08-31 11:45:55 +00:00
|
|
|
|
#if UNITY_EDITOR
|
|
|
|
|
|
using Excel;
|
|
|
|
|
|
#endif
|
2022-07-04 11:17:39 +00:00
|
|
|
|
|
|
|
|
|
|
public abstract class TableBase<T, U> : ScriptableObject where T : ScriptableObject where U : DataBase<U>
|
|
|
|
|
|
{
|
|
|
|
|
|
private static T mInstance;
|
|
|
|
|
|
public static T Instance
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
if (mInstance == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
mInstance = Resources.Load<T>("Table/" + typeof(T).Name);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return mInstance;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int Count => mDataList.Count;
|
|
|
|
|
|
[SerializeField] protected List<U> mDataList;
|
|
|
|
|
|
|
|
|
|
|
|
public U this[int pIndex]
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
int tIndex = Mathf.Clamp(pIndex, 0, mDataList.Count - 1);
|
|
|
|
|
|
return mDataList[tIndex];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public List<U> GetAll()
|
|
|
|
|
|
{
|
|
|
|
|
|
List<U> tAll = new List<U>(mDataList);
|
|
|
|
|
|
return tAll;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public abstract U GetData(string pID);
|
|
|
|
|
|
|
|
|
|
|
|
public void ParseExcel(string pFilePath)
|
|
|
|
|
|
{
|
|
|
|
|
|
int tColNum = 0, tRowNum = 0;
|
|
|
|
|
|
Debug.Log(pFilePath);
|
|
|
|
|
|
DataRowCollection tCollection = ReadExcelContext(pFilePath, ref tColNum, ref tRowNum);
|
|
|
|
|
|
Debug.Log(typeof(T).Name + ": 列数_" + tColNum + " ,行数_" + tRowNum);
|
|
|
|
|
|
|
|
|
|
|
|
// 第一行变量名,循环列
|
|
|
|
|
|
//for (int i = 0; i < tColNum; i++)
|
|
|
|
|
|
//{
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
//第二行开始才是数据,循环行
|
|
|
|
|
|
mDataList = new List<U>(tRowNum - 1);
|
|
|
|
|
|
for (int i = 1; i < tRowNum; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
U tData = typeof(U).Assembly.CreateInstance(typeof(U).Name) as U;
|
|
|
|
|
|
tData.ParseData(tCollection[i]);
|
|
|
|
|
|
mDataList.Add(tData);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 读Excel
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="pFilePath">文件路径</param>
|
|
|
|
|
|
/// <param name="pColNum">行数</param>
|
|
|
|
|
|
/// <param name="pRowNum">列数</param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
private DataRowCollection ReadExcelContext(string pFilePath, ref int pColNum, ref int pRowNum)
|
|
|
|
|
|
{
|
2022-08-31 11:45:55 +00:00
|
|
|
|
#if UNITY_EDITOR
|
2022-07-04 11:17:39 +00:00
|
|
|
|
FileStream stream = File.Open(pFilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
|
|
|
|
|
|
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
|
|
|
|
|
|
|
|
|
|
|
|
DataSet result = excelReader.AsDataSet();
|
|
|
|
|
|
// Tables[0] 下标0表示excel文件中第一张表的数据
|
|
|
|
|
|
pColNum = result.Tables[0].Columns.Count;
|
|
|
|
|
|
pRowNum = result.Tables[0].Rows.Count;
|
|
|
|
|
|
return result.Tables[0].Rows;
|
2022-08-31 11:45:55 +00:00
|
|
|
|
#else
|
|
|
|
|
|
return null;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
2022-07-04 11:17:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|