Пример #1
0
        /// <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);
        }