***Excel表的读取***

1.表是怎么读取的

它是一般是要去掉表头,也就是第一行一般不是数据,可能一般都是一些描述,注释等。
然后从从正文数据开始读,你传入是Key值是多少,就可以从这里开始找,有相同的key
和你传入的Key相同就说明就是你要找的对象。然后就将其返回出来就行了。

2.表中的格式,类型非常重要
我就是把一个类型定义为float类型结果获取的时候就报错了。所以遇到float 类型就用string
类型代替吧。

3.表的读取的代码

   protected virtual string getFilePath ()
	{
			return "";
	}
    //PetConfigData
    static Dictionary<Type,Dictionary<string,GameConfigDataBase>> dataDic = new Dictionary<Type, Dictionary<string, GameConfigDataBase>> ();

	public static T GetConfigData<T> (string key) where T:GameConfigDataBase
	{
			Type setT = typeof(T);
			if (!dataDic.ContainsKey (setT)) {
					ReadConfigData<T> ();
			}
			Dictionary<string,GameConfigDataBase> objDic = dataDic [setT];
            Debug.Log("test  (" + key + ")" + objDic.Count);
			if (!objDic.ContainsKey (key)) {
					throw new Exception ("no this config");
			}
			return (T)(objDic [key]);
	}

	public static List<T> GetConfigDatas<T> () where T:GameConfigDataBase
	{
			List<T> returnList = new List<T> ();
			Type setT = typeof(T);
			if (!dataDic.ContainsKey (setT)) {
					ReadConfigData<T> ();
			}
			Dictionary<string,GameConfigDataBase> objDic = dataDic [setT];
			foreach (KeyValuePair<string,GameConfigDataBase> kvp in objDic) {
					returnList.Add ((T)(kvp.Value));
			}
			return returnList;
	}

	static void ReadConfigData<T> () where T:GameConfigDataBase
	{
			T obj = Activator.CreateInstance<T> ();
			string fileName = obj.getFilePath ();

			string getString = Resources.Load< TextAsset>("GameConfig/" + fileName).text;

            CsvReaderByString csr = new CsvReaderByString (getString);

			Dictionary<string,GameConfigDataBase> objDic = new Dictionary<string, GameConfigDataBase> ();
			
			FieldInfo[] fis = new FieldInfo[csr.ColCount];
			for (int colNum=1; colNum<csr.ColCount+1; colNum++) {
					fis [colNum - 1] = typeof(T).GetField (csr [1, colNum]);
			}

			for (int rowNum=3; rowNum<csr.RowCount+1; rowNum++) {
					T configObj = Activator.CreateInstance<T> ();
					for (int i=0; i<fis.Length; i++) {
							string fieldValue = csr [rowNum, i + 1];
							object setValue = new object ();
							switch (fis [i].FieldType.ToString ()) {
							    case "System.Int32":
									    setValue = int.Parse (fieldValue);
									    break;
							    case "System.Int64":
									    setValue = long.Parse (fieldValue);
									    break;
							    case "System.String":
									    setValue = fieldValue;
									    break;
							    default:
									    Debug.Log ("error data type");
									    break;
							}
							fis [i].SetValue (configObj, setValue);
							if (fis [i].Name == "key" || fis [i].Name == "id") {   
                                    //只检测key和id的值,然后添加到objDic 中
									objDic.Add (setValue.ToString (), configObj);
							}
					}
			}
			dataDic.Add (typeof(T), objDic);    //可以作为参数
	}

可以看到代码中出现了很多T,这些是泛型 where,是用来约束泛型的

代码中是通过传入的key来获取数据。

Dictionary<Type,Dictionary<string,GameConfigDataBase>> dataDic

是很多个表,每一个都可以生成一个类型。所以每一张表都可以用type来表示,Dictionary<string,GameConfigDataBase>这个代表一个表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值