/// <summary> /// 키값을 통해 값을 얻는 함수 /// </summary> /// <typeparam name="TData">테이블 데이터 타입</typeparam> /// <param name="_key">키값</param> /// <param name="_data">데이터</param> /// <returns>값의 존재여부</returns> public bool TryGetValueFromKey <TData>(object _key, out TData _data) where TData : iTableDataBase { iTableDataBase _baseData = null; #if ConvertType Type _types = dictionaryDatas.Keys.First().GetType(); if (_types != _key.GetType()) { Debug.LogErrorFormat("ExcelLoader Error : 테이블에 입력된 데이터 타입과 파라미터의 키값 타입이 다릅니다. \n테이블 데이터 = {0}\n입력타입={1}\n테이블타입{2}", typeof(TData).Name, _key.GetType().Name, _types.Name); } object _changeKey = Convert.ChangeType(_key, _types); if (dictionaryDatas.TryGetValue(_changeKey, out _baseData)) { _data = (TData)_baseData; return(true); } #else if (dictionaryDatas.TryGetValue(_key, out _baseData)) { _data = (TData)_baseData; return(true); } #endif else { _data = default(TData); return(false); } }
/// <summary> /// 엑셀 테이블을 테이블 클래스와 지정된 데이터 타입으로 저장해서 바이너리로 변환하는 함수 /// </summary> /// <param name="_tableType">테이블 타입</param> /// <param name="_dataType">데이터 타입</param> /// <param name="_savepath">저장 경로</param> /// <param name="_filename">파일 이름</param> bool WriteBinary(List <HeaderData> _headerData, ISheet _sheet, Type _tableType, Type _dataType, string _savepath, string _filename) { Type _listType = typeof(List <>).MakeGenericType(_dataType); var _listInstance = Activator.CreateInstance(_listType); IList _list = (IList)_listInstance; List <PropertyInfo> _dataPropertyInfo = _dataType.GetProperties().ToList(); _dataPropertyInfo = _dataPropertyInfo.FindAll(_item => _headerData.Find(_header => _header.GetMemberName() == _item.Name) != null); Dictionary <object, iTableDataBase> _checkKeyData = new Dictionary <object, iTableDataBase>(); foreach (IRow _row in _sheet) { if (_row.RowNum < 1) { continue; } ICell _keyCell = _row.GetCell(0); if (_keyCell == null || _keyCell.CellType == NPOI.SS.UserModel.CellType.Blank) { continue; } object[] _propertyDatas = new object[_headerData.Count]; for (int _index = 0; _index < _headerData.Count; _index++) { ICell _cell = _row.GetCell(_headerData[_index].cellColumnIndex); if (_cell == null || _cell.CellType == NPOI.SS.UserModel.CellType.Blank) { continue; } PropertyInfo _property = _dataPropertyInfo.Find(_item => _item.Name == _headerData[_index].GetMemberName()); if (_property == null) { EditorUtility.DisplayDialog("오류", string.Format("데이터 클래스에 헤더에 맞는 변수가 없습니다.\n시트={0}\n변수명={1}", _cell.Sheet.SheetName, _headerData[_index].name), "확인"); return(false); } if (_headerData[_index].arrayGroup > 0) { List <int> _listArrayColurm = _headerData[_index].GetArrayColurms(); Type _elementType = _property.PropertyType.GetElementType(); var _arrayDatas = Array.CreateInstance(_elementType, _listArrayColurm.Count); for (int _index_2 = 0; _index_2 < _listArrayColurm.Count; _index_2++) { ICell _arrayDataCell = _row.GetCell(_listArrayColurm[_index_2]); _arrayDatas.SetValue(ConvertFrom(_arrayDataCell, _elementType), _index_2); } _propertyDatas[_index] = _arrayDatas; } else { _propertyDatas[_index] = ConvertFrom(_cell, _property.PropertyType); } } iTableDataBase _data = (iTableDataBase)Activator.CreateInstance(_dataType, _propertyDatas); _list.Add(_data); if (_checkKeyData.ContainsKey(_data.GetKey()) == false) { _checkKeyData.Add(_data.GetKey(), _data); } else { EditorUtility.DisplayDialog("오류", string.Format("같은 키값이 존재합니다.\n테이블명={0}\n 중복 키값={1}", _sheet.SheetName, _data.GetKey()), "확인"); return(false); } } var _var = Activator.CreateInstance(_tableType, _list, _dataType); DataContainer _table = (DataContainer)_var; StreamWriter sWriter = new StreamWriter(_savepath + string.Format("/{0}.bytes", _filename)); BinaryFormatter bin = new BinaryFormatter(); bin.Serialize(sWriter.BaseStream, _table); sWriter.Close(); return(true); }