public void Import(ScriptableObject sObj, Type textType, ScriptDefine scriptDefine)
        {
            FieldInfo fi = textType.GetField(fieldName);

            // Is a List<...> filed
            if (fi != null && fi.FieldType.IsGenericType && fi.FieldType.GetGenericTypeDefinition() == typeof(List <>))
            {
                // new List<'Data'>()
                var container = Activator.CreateInstance(fi.FieldType);
                fi.SetValue(sObj, container);

                Type entityType = fi.FieldType.GetGenericArguments()[0];

                // Find List.Add(...)
                MethodInfo mi = fi.FieldType.GetMethod("Add", new Type[] { entityType });
                if (mi != null)
                {
                    foreach (ICell cell in cellList)
                    {
                        IRow row = cell.Row;

                        // find this 'Data' class define
                        ClassDefine cd = scriptDefine.classDefines.Find((x) => x.className.Replace("class ", string.Empty) == elementTypeName);
                        if (cd != null && row != null)
                        {
                            // new a 'Data' class
                            var element = Activator.CreateInstance(entityType);

                            // for each fileds in this class
                            for (int i = 0; i < cd.fields.Count; i++)
                            {
                                FieldDefine assetField = cd.fields[i];
                                assetField.Import(element, entityType, i, row, cd);
                            }

                            // List.Add(element)
                            mi.Invoke(container, new object[] { element });
                        }
                    }
                }
            }
            else
            {
            }
        }
    private static void ImportSpreadSheet(string path, bool script)
    {
        // combine full file path
        string        fullPath = Application.dataPath;
        DirectoryInfo di       = Directory.GetParent(fullPath);

        fullPath = Path.Combine(di.ToString(), path);
        //Debug.Log(fullPath);

        using (Stream stream = new FileStream(fullPath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
        {
            IWorkbook workbook = null;

            try
            {
                if (fullPath.EndsWith(".xls", System.StringComparison.InvariantCulture))
                {
                    workbook = new HSSFWorkbook(stream);
                }
                else if (fullPath.EndsWith(".xlsx", System.StringComparison.InvariantCulture))
                {
                    workbook = new XSSFWorkbook(stream);
                }
                else
                {
                    stream.Close();
                    return;
                }
            }
            catch (System.Exception e)
            {
                Debug.LogException(e);
            }

            // for each sheet
            IEnumerator sheetEnum = workbook.GetEnumerator();
            while (sheetEnum.MoveNext())
            {
                var sheet = sheetEnum.Current as ISheet;
                //Debug.Log(sheet.SheetName);

                ScriptDefine scriptDefine = new ScriptDefine()
                {
                    filename = sheet.SheetName,
                };

                // for each row
                IEnumerator rowEnum = sheet.GetRowEnumerator();
                while (rowEnum.MoveNext())
                {
                    var row = rowEnum.Current as IRow;
                    if (row != null)
                    {
                        // for each cell
                        IEnumerator cellEnum = row.GetEnumerator();
                        while (cellEnum.MoveNext())
                        {
                            var cell = cellEnum.Current as ICell;
                            if (cell != null)
                            {
                                if (!scriptDefine.Input(cell))
                                {
                                    continue;
                                }
                                //Debug.LogFormat("{0},{1}={2}.",cell.RowIndex, cell.ColumnIndex, cell.ToString());
                            }
                        }
                    }
                }

                if (!script)
                {
                    scriptDefine.Import();
                }
                else
                {
                    scriptDefine.GenerateClass();
                }
            } // for each Sheet

            // close file stream
            stream.Close();
        }
    }