public static FbsTable GetFbsRootTableDataTypeObj(FbsFile fbsfile)
    {
        FbsTable fbsTable = null;

        foreach (var table in fbsfile.tables)
        {
            if (table.tableName == fbsfile.fileName)
            {
                fbsTable = table;
                break;
            }
        }
        return(fbsTable);
    }
    public static FbsFile GenFbsFileObject(ExcelSheetData excelSheetData)
    {
        //一个sheet 一个table
        FbsFile fbsFile = new FbsFile
        {
            fileName = excelSheetData.sheetName.Replace("=", "")
        };
        FbsTable fbsTable = new FbsTable
        {
            tableName = fbsFile.fileName
        };

        //处理table字段
        for (int j = 0; j < excelSheetData.fieldNames.Count; j++)
        {
            FbsTableField fbsTableField = new FbsTableField();
            fbsTableField.fieldName = excelSheetData.fieldNames[j];
            string dataTypeStr = excelSheetData.fieldTypes[j];
            TableFileGenerater.GetFbsDataTypeByString(dataTypeStr, ref fbsTableField.fieldType, ref fbsTableField.fieldTypeName, ref fbsTableField.dataType, ref fbsTableField.isArray);
            fbsTable.fields.Add(fbsTableField);
        }
        fbsFile.tables.Add(fbsTable);
        //添加root_type table
        FbsTable fbsRootTable = new FbsTable();

        fbsRootTable.tableName = "Root_" + fbsFile.fileName;
        FbsTableField dataField = new FbsTableField();

        dataField.fieldName     = "data";
        dataField.fieldType     = FbsFieldType.TABLE;
        dataField.isArray       = true;
        dataField.fieldTypeName = fbsTable.tableName;
        fbsRootTable.fields.Add(dataField);
        fbsFile.tables.Add(fbsRootTable);
        //root_type
        fbsFile.root_type     = fbsRootTable.tableName;
        fbsFile.namespaceName = "GameDataTables";
        return(fbsFile);
    }
    public static void GenFbsTable(FbsTable fbsTable, ref StringBuilder stringBuilder)
    {
        //表结构
        if (fbsTable.isOriginalOrder)
        {
            stringBuilder.AppendFormat("table {0} (original_order) {1}\n", fbsTable.tableName, "{");
        }
        else
        {
            stringBuilder.AppendFormat("table {0} {1}\n", fbsTable.tableName, "{");
        }

        if (fbsTable.fields != null && fbsTable.fields.Count > 0)
        {
            int count = fbsTable.fields.Count;
            for (int i = 0; i < count; i++)
            {
                FbsTableField field = fbsTable.fields[i];
                GenFbsSchemaField(field, ref stringBuilder);
            }
        }
        stringBuilder.Append("}\n\n");
    }
    private void OnGUI()
    {
        EditorGUILayout.BeginVertical();
        EditorGUILayout.LabelField("Setting");
        GUIHelper.DrawFilePick("FlatcPath:", ref FlatBufferToolConfigure.Configure.FlactcPath);
        EditorGUILayout.Separator();
        GUIHelper.DrawFolderPick("ExcelDir:", ref FlatBufferToolConfigure.Configure.ExcelDir);
        EditorGUILayout.Separator();
        GUIHelper.DrawFolderPick("SchemaDir:", ref FlatBufferToolConfigure.Configure.SchemaDir);
        EditorGUILayout.Separator();
        GUIHelper.DrawFolderPick("JsonDir:", ref FlatBufferToolConfigure.Configure.JsonDir);
        EditorGUILayout.Separator();
        GUIHelper.DrawFolderPick("ClassDir:", ref FlatBufferToolConfigure.Configure.ClassDir);
        EditorGUILayout.Separator();
        GUIHelper.DrawFolderPick("BinDir", ref FlatBufferToolConfigure.Configure.BinDir);
        EditorGUILayout.Separator();
        EditorGUILayout.Separator();

        GUIHelper.DrawIntField("Excel读取字段名行号:", ref FlatBufferToolConfigure.Configure.fieldNameRow, 150);
        EditorGUILayout.Separator();
        GUIHelper.DrawIntField("Excel读取字段类型行号:", ref FlatBufferToolConfigure.Configure.fieldTypeRow, 150);
        EditorGUILayout.Separator();
        GUIHelper.DrawIntField("Excel读取字段数值开始行号:", ref FlatBufferToolConfigure.Configure.fieldValueRow, 150);

        if (GUILayout.Button("保存配置"))
        {
            FlatBufferToolConfigure.Save();
        }

        EditorGUILayout.Separator();
        EditorGUILayout.Separator();
        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("重新读取Excel", GUILayout.MaxWidth(100)))
        {
            ReadAllExcel();
        }
        if (GUILayout.Button("生成所有表格数据", GUILayout.MaxWidth(150)))
        {
            BuildAll();
        }
        if (GUILayout.Button("检查表格格式", GUILayout.MaxWidth(100)))
        {
            CheckExcelPattern();
        }
        string btnShowFilter = "显示Excel列表";
        Color  preColor      = GUI.color;

        GUI.color = ShowExcelInfo ? Color.white : Color.gray;
        if (GUILayout.Button(btnShowFilter, GUILayout.MaxWidth(100)))
        {
            ShowExcelInfo = !ShowExcelInfo;
        }
        GUI.color = preColor;

        EditorGUILayout.EndHorizontal();

        EditorGUILayout.Separator();
        if (ShowExcelInfo)
        {
            scrollViewPos = GUILayout.BeginScrollView(scrollViewPos);
            if (ExcelList == null)
            {
                ReadAllExcel();
            }
            foreach (var excel in ExcelList)
            {
                GUIStyle style = !excel.FoldOpen ? GUIHelper.GetStyle(GUIStyleEnum.FOLDOUTNORMAL) : GUIHelper.GetStyle(GUIStyleEnum.FOLDOUTDIM);
                excel.FoldOpen = EditorGUILayout.Foldout(excel.FoldOpen, excel.ExcelPath, true, style);
                if (excel.FoldOpen)
                {
                    GUILayout.BeginHorizontal();
                    GUILayout.Label("", GUILayout.Width(15));
                    GUILayout.BeginVertical();
                    foreach (var sheet in excel.ExcelSheetDatas)
                    {
                        GUIStyle sheetstyle = !sheet.FoldOpen ? GUIHelper.GetStyle(GUIStyleEnum.FOLDOUTNORMAL) : GUIHelper.GetStyle(GUIStyleEnum.FOLDOUTDIM);
                        sheet.FoldOpen = EditorGUILayout.Foldout(sheet.FoldOpen, sheet.SheetData.sheetName, true, sheetstyle);
                        if (sheet.FoldOpen)
                        {
                            GUILayout.BeginHorizontal();
                            GUILayout.Label("", GUILayout.Width(15));
                            GUILayout.BeginVertical();
                            GUILayout.BeginHorizontal();
                            if (GUILayout.Button("导出", GUILayout.Width(100)))
                            {
                                BuildSheet(sheet.SheetData);
                            }
                            GUILayout.EndHorizontal();
                            int      fieldCount = sheet.SheetData.fieldNames.Count;
                            FbsTable fbsTable   = TableFileGenerater.GetFbsRootTableDataTypeObj(sheet.FbsObject);
                            if (fbsTable == null)
                            {
                                Debug.LogError("FbsTable is Null!");
                                return;
                            }
                            GUILayout.BeginHorizontal(GUIHelper.GetStyle(GUIStyleEnum.BLACKSTYLE));
                            for (int findex = 0; findex < fieldCount; findex++)
                            {
                                float itemWidth = sheet.SheetData.fieldMaxSize[findex] * GUIHelper.FontSize;
                                GUILayout.Label(sheet.SheetData.fieldNames[findex], GUIHelper.GetStyle(GUIStyleEnum.MIDDLETITLE), GUILayout.Width(itemWidth));
                            }
                            GUILayout.EndHorizontal();

                            GUILayout.BeginHorizontal(GUIHelper.GetStyle(GUIStyleEnum.BLACKSTYLE));

                            for (int findex = 0; findex < fieldCount; findex++)
                            {
                                float  itemWidth = sheet.SheetData.fieldMaxSize[findex] * GUIHelper.FontSize;
                                string typename  = TableFileGenerater.GetTableFieldTypeString(fbsTable.fields[findex]);
                                GUILayout.Label(typename, GUIHelper.GetStyle(GUIStyleEnum.MIDDLETITLE), GUILayout.Width(itemWidth));
                            }
                            GUILayout.EndHorizontal();

                            for (int vindex = 0; vindex < sheet.SheetData.fieldValues.Count; vindex++)
                            {
                                int dataIndex = Mathf.FloorToInt(vindex % fieldCount);
                                if (dataIndex == 0)
                                {
                                    GUILayout.BeginHorizontal();
                                }
                                float itemWidth = sheet.SheetData.fieldMaxSize[dataIndex] * GUIHelper.FontSize;
                                GUILayout.TextArea(sheet.SheetData.fieldValues[vindex], GUIHelper.GetStyle(GUIStyleEnum.MIDDLETITLE), GUILayout.Width(itemWidth));
                                if (dataIndex == fieldCount - 1)
                                {
                                    GUILayout.EndHorizontal();
                                }
                            }

                            GUILayout.EndHorizontal();
                            GUILayout.EndVertical();
                        }
                    }
                    GUILayout.EndVertical();
                    GUILayout.EndHorizontal();
                }
            }

            GUILayout.EndScrollView();
        }

        GUILayout.EndVertical();
    }
    //生成给定类型table的数组组成的json
    public static void GenJsonFile(FbsFile fbsfile, List <string> fieldValues, string fileOutDir, ref string jsonPath)
    {
        //生成json文件
        StringBuilder jsonBuilder = StrBuilder;

        jsonBuilder.Clear();
        jsonBuilder.Append("{\n  \"data\":[\n");
        FbsTable fbsTable = GetFbsRootTableDataTypeObj(fbsfile);

        if (fbsTable == null)
        {
            Debug.LogErrorFormat("can not find table named ", fbsfile.fileName);
            return;
        }
        int fieldCount = fbsTable.fields.Count;
        int dataCount  = Mathf.FloorToInt(fieldValues.Count / fieldCount);

        for (int k = 0; k < fieldValues.Count; k++)
        {
            string        value      = fieldValues[k];
            int           fieldIndex = k % fieldCount;
            int           dataIndex  = Mathf.FloorToInt(k / fieldCount);
            FbsTableField tableField = fbsTable.fields[fieldIndex];
            string        fieldName  = tableField.fieldName;
            if (fieldIndex == 0)
            {
                jsonBuilder.Append("    {\n");
            }
            bool   isstring    = !(tableField.fieldType == FbsFieldType.SCALAR && tableField.dataType != FbsDataType.STRING);
            string valuecolon  = isstring && !tableField.isArray ? "\"" : "";
            string valuearrayL = tableField.isArray ? "[" : "";
            string valuearrayR = tableField.isArray ? "]" : "";
            string jsonValue   = value;
            if (isstring && tableField.isArray)
            {
                string[] condition = { "[/]" };
                string[] vs        = value.Split(condition, StringSplitOptions.RemoveEmptyEntries);
                jsonValue = "";
                for (int m = 0; m < vs.Length; m++)
                {
                    jsonValue += "\"" + vs[m] + "\",";
                }
                jsonValue = jsonValue.Substring(0, jsonValue.Length - 1);
            }
            string lastCommon = (fieldIndex == (fieldCount - 1)) ? "" : ",";
            jsonBuilder.AppendFormat("		\"{0}\":{1}{2}{3}{4}{5}{6}\n", fieldName, valuearrayL, valuecolon, jsonValue, valuecolon, valuearrayR, lastCommon);

            if (fieldIndex == fieldCount - 1)
            {
                if (dataIndex == dataCount - 1)
                {
                    jsonBuilder.Append("	}\n");
                }
                else
                {
                    jsonBuilder.Append("	},\n");
                }
            }
        }
        jsonBuilder.Append("	]\n}");
        jsonPath = fileOutDir + "/" + fbsTable.tableName + ".json";
        if (!Directory.Exists(fileOutDir))
        {
            Directory.CreateDirectory(fileOutDir);
        }
        if (File.Exists(jsonPath))
        {
            File.Delete(jsonPath);
        }
        FileStream   fs = new FileStream(jsonPath, FileMode.Create);
        StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);

        sw.Write(jsonBuilder.ToString());
        sw.Close();
        fs.Close();
        jsonBuilder.Clear();
    }
    //flatbuff schema文件生成
    public static void GenFbsSchemaFile(FbsFile fbsFile, string fileOutDir, ref string fileFullpath)
    {
        //---------生成FBS文件---------
        StringBuilder stringBuilder = StrBuilder;

        stringBuilder.Clear();
        //spacename
        if (fbsFile.namespaceName != string.Empty)
        {
            stringBuilder.AppendFormat("namespace {0};\n\n", fbsFile.namespaceName);
        }

        //customAttribute
        if (fbsFile.customAttributes != null && fbsFile.customAttributes.Count > 0)
        {
            for (int i = 0; i < fbsFile.customAttributes.Count; i++)
            {
                string field = fbsFile.customAttributes[i];
                stringBuilder.AppendFormat("attribute \"{0}\";\n", field);
            }
        }
        //Enums
        if (fbsFile.enums != null && fbsFile.enums.Count > 0)
        {
            for (int i = 0; i < fbsFile.enums.Count; i++)
            {
                FbsEnum fbsenum = fbsFile.enums[i];
                GenFbsEnum(fbsenum, ref stringBuilder);
            }
        }
        //Structs
        if (fbsFile.structs != null && fbsFile.structs.Count > 0)
        {
            for (int i = 0; i < fbsFile.structs.Count; i++)
            {
                FbsStruct fbsStruct = fbsFile.structs[i];
                GenFbsStruct(fbsStruct, ref stringBuilder);
            }
        }

        //Unions
        if (fbsFile.unions != null && fbsFile.unions.Count > 0)
        {
            for (int i = 0; i < fbsFile.unions.Count; i++)
            {
                FbsUnion fbsUnion = fbsFile.unions[i];
                GenFbsUnion(fbsUnion, ref stringBuilder);
            }
        }

        //tables
        if (fbsFile.tables != null && fbsFile.tables.Count > 0)
        {
            for (int i = 0; i < fbsFile.tables.Count; i++)
            {
                FbsTable fbstable = fbsFile.tables[i];
                GenFbsTable(fbstable, ref stringBuilder);
            }
        }
        //根类型
        if (fbsFile.root_type != string.Empty)
        {
            stringBuilder.AppendFormat("root_type {0};\n", fbsFile.root_type);
        }
        else
        {
            Debug.LogError(fbsFile.fileName + " root_type is Empty!!!!");
        }
        // 文件标识
        if (fbsFile.file_identifier != string.Empty)
        {
            stringBuilder.AppendFormat("file_identifier \"{0}\";\n", fbsFile.file_identifier);
        }

        fileFullpath = fileOutDir + "/" + fbsFile.fileName + ".fbs";
        if (!Directory.Exists(fileOutDir))
        {
            Directory.CreateDirectory(fileOutDir);
        }
        if (File.Exists(fileFullpath))
        {
            File.Delete(fileFullpath);
        }
        FileStream   fs = new FileStream(fileFullpath, FileMode.Create);
        StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);

        sw.Write(stringBuilder.ToString());
        sw.Close();
        fs.Close();
        stringBuilder.Clear();
    }