예제 #1
0
        private static string ToCSharp(SheetData sheetData, string sheetName)
        {
            try
            {
                var rowDataClassName   = EESettings.Current.GetRowDataClassName(sheetName);
                var dataTableClassName = EESettings.Current.GetDataTableClassName(sheetName);
                var csFile             = new StringBuilder(2048);
                csFile.Append(@"//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by EasyExcel.");
                csFile.Append("\n//     Runtime Version: " + EEConstant.Version + "\n");
                csFile.Append(@"//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------");

                csFile.Append("\nusing System;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing EasyExcel;\n\n");
                csFile.Append(string.Format("namespace {0}\n", EESettings.Current.NameSpace));
                csFile.Append("{\n");
                csFile.Append("\t[Serializable]\n");
                csFile.Append("\tpublic class " + rowDataClassName + " : RowData\n");
                csFile.Append("\t{\n");

                var columnCount = 0;
                for (var col = 0; col < sheetData.columnCount; col++)
                {
                    if (string.IsNullOrEmpty(sheetData.Get(EESettings.Current.NameRowIndex, col)))
                    {
                        break;
                    }
                    columnCount++;
                }

                // Get variable names
                var variableName = new string[columnCount];
                for (var col = 0; col < columnCount; col++)
                {
                    variableName[col] = sheetData.Get(EESettings.Current.NameRowIndex, col);
                }

                // Get variable types
                var variableLength = new string[columnCount];
                var variableType   = new string[columnCount];
                // skip column 0 for ID
                for (var col = 1; col < columnCount; col++)
                {
                    var cellInfo = sheetData.Get(EESettings.Current.TypeRowIndex, col);
                    variableLength[col] = null;
                    variableType[col]   = cellInfo;

                    if (cellInfo.EndsWith("]"))
                    {
                        var startIndex = cellInfo.IndexOf('[');
                        variableLength[col] = cellInfo.Substring(startIndex + 1, cellInfo.Length - startIndex - 2);
                        variableType[col]   = cellInfo.Substring(0, startIndex);
                    }

                    var varName = variableName[col];
                    var varLen  = variableLength[col];
                    var varType = variableType[col];

                    if (varType.Equals("int") || varType.Equals("float") ||
                        varType.Equals("double") || varType.Equals("long") ||
                        varType.Equals("string") || varType.Equals("bool") ||
                        varType.Equals("JObject"))
                    {
                        if (varLen == null)
                        {
                            csFile.Append("\t\tpublic " + varType + " " + varName + ";\n");
                        }
                        else
                        {
                            csFile.Append("\t\tpublic " + varType + "[] " + varName + ";\n");
                        }
                    }
                }

                //string[] variableDefaults = new string[columnCount];
                csFile.Append("\n#if UNITY_EDITOR\n");
                csFile.Append("\t\tpublic override int _init(List<List<string>> sheet, int row, int column)" + "\n");
                csFile.Append("\t\t{" + "\n");
                csFile.Append("\t\t\tcolumn = base._init(sheet, row, column);\n");
                // skip column 0 for ID
                for (var col = 1; col < columnCount; col++)
                {
                    var varType = variableType[col];

                    /*variableDefaults[col] = sheetData.At(EasyExcelSettings.Current.DEFAULT_VALUE_ROW_INDEX, col);
                     * if (varType.Equals("bool"))
                     * {
                     *      if (variableDefaults[col].Equals("0"))
                     *              variableDefaults[col] = "false";
                     *      else
                     *              variableDefaults[col] = "true";
                     * }
                     *
                     * string varDefault = variableDefaults[col];*/
                    var varLen  = variableLength[col];
                    var varName = variableName[col];

                    if (varType.Equals("int") || varType.Equals("float") || varType.Equals("double") ||
                        varType.Equals("long") || varType.Equals("bool"))
                    {
                        if (varLen == null)
                        {
                            //csFile += "\t\t" + varName + " = " + varDefault + ";\n";
                            csFile.Append("\t\t\t" + varType + ".TryParse(sheet[row][column++], out " + varName + ");\n");
                        }
                        else
                        {
                            csFile.Append("\t\t\tstring[] " + varName + "Array = sheet[row][column++].Split(\',\');" + "\n");
                            csFile.Append("\t\t\tint " + varName + "Count = " + varName + "Array.Length;" + "\n");
                            csFile.Append("\t\t\t" + varName + " = new " + varType + "[" + varName + "Count];\n");
                            csFile.Append("\t\t\tfor(int i = 0; i < " + varName + "Count; i++)\n");
                            csFile.Append("\t\t\t\t" + varType + ".TryParse(" + varName + "Array[i], out " + varName + "[i]);\n");
                        }
                    }
                    else if (varType.Equals("string"))
                    {
                        if (varLen == null)
                        {
                            //csFile += "\t\t\tif(sheet[row][column] == null)" + "\n";
                            csFile.Append("\t\t\t" + varName + " = sheet[row][column++] ?? \"" + /*varDefault + */ "\";\n");
                            //csFile += "\t\t\telse" + "\n";
                            //csFile += "\t\t\t\t" + varName + " = sheet[row][column];\n";
                        }
                        else
                        {
                            csFile.Append("\t\t\tstring[] " + varName + "Array = sheet[row][column++].Split(\',\');" + "\n");
                            csFile.Append("\t\t\tint " + varName + "Count = " + varName + "Array.Length;" + "\n");
                            csFile.Append("\t\t\t" + varName + " = new " + varType + "[" + varName + "Count];\n");
                            csFile.Append("\t\t\tfor(int i = 0; i < " + varName + "Count; i++)\n");
                            csFile.Append("\t\t\t\t" + varName + "[i] = " + varName + "Array[i];\n");
                        }
                    }
                }

                csFile.Append("\t\t\treturn column;\n");
                csFile.Append("\t\t}\n#endif\n");

                csFile.Append("\t}\n\n");

                // DataTable class
                csFile.Append("\tpublic class " + dataTableClassName + " : RowDataCollection\n");
                csFile.Append("\t{\n");
                csFile.AppendFormat("\t\t[SerializeField]\n\t\tprivate List<{0}> elements = new List<{0}>();\n\n", rowDataClassName);

                csFile.AppendFormat("\t\tpublic override void AddData(RowData data)\n\t\t{{\n\t\t\telements.Add(data as {0});\n\t\t}}\n\n", rowDataClassName);
                csFile.Append("\t\tpublic override int GetDataCount()\n\t\t{\n\t\t\treturn elements.Count;\n\t\t}\n\n");
                csFile.Append("\t\tpublic override RowData GetData(int index)\n\t\t{\n\t\t\treturn elements[index];\n\t\t}\n");

                csFile.Append("\t}\n");

                csFile.Append("}\n");

                return(csFile.ToString());
            }
            catch (Exception ex)
            {
                EELog.LogError(ex.ToString());
            }

            return("");
        }
        private static void ToScriptableObject(string excelPath, string sheetName, string outputPath, SheetData sheetData)
        {
            try
            {
                string fileName       = Path.GetFileName(excelPath);
                var    sheetClassName = EESettings.Current.GetSheetClassName(fileName, sheetName);
                var    asset          = ScriptableObject.CreateInstance(sheetClassName);
                var    dataCollect    = asset as EERowDataCollection;
                if (dataCollect == null)
                {
                    return;
                }

                dataCollect.ExcelFileName  = fileName;
                dataCollect.ExcelSheetName = sheetName;
                var className = EESettings.Current.GetRowDataClassName(fileName, sheetName, true);
                var dataType  = Type.GetType(className);
                if (dataType == null)
                {
                    var asmb = Assembly.LoadFrom(Environment.CurrentDirectory + "/Library/ScriptAssemblies/Assembly-CSharp.dll");
                    dataType = asmb.GetType(className);
                }
                if (dataType == null)
                {
                    EELog.LogError(className + " not exist !");
                    return;
                }

                //var dataCtor = dataType.GetConstructor(Type.EmptyTypes);
                var dataCtor = dataType.GetConstructor(new [] { typeof(List <List <string> >), typeof(int), typeof(int) });
                if (dataCtor == null)
                {
                    return;
                }
                var keySet = new HashSet <object>();
                for (var row = EESettings.Current.DataStartIndex; row < sheetData.RowCount; ++row)
                {
                    // 替换掉单元格中的'\n'为 "\\n"
                    for (var col = 0; col < sheetData.ColumnCount; ++col)
                    {
                        sheetData.Set(row, col, sheetData.Get(row, col).Replace("\n", "\\n"));
                    }
                    // 利用反射构造函数处理数据
                    var inst = dataCtor.Invoke(new object[] { sheetData.Table, row, 0 }) as EERowData;
                    if (inst == null)
                    {
                        continue;
                    }

                    var keys       = inst.GetKeyFieldValues();
                    var isMultiKey = keys.Count > 1;
                    if (keys.Count == 0)
                    {
                        EELog.LogError("The value of key is null in sheet " + sheetName);
                        continue;
                    }

                    if (!isMultiKey)
                    {
                        var key = keys[0];

                        if (key is int i && i == 0)
                        {
                            continue;
                        }

                        if (key is string s && string.IsNullOrEmpty(s))
                        {
                            continue;
                        }

                        if (!keySet.Contains(key))
                        {
                            dataCollect.AddData(inst);
                            keySet.Add(key);
                        }
                        else
                        {
                            EELog.LogError(string.Format("More than one rows have the same Key [{0}] in Sheet {1}", key, sheetName));
                        }
                    }
                    else
                    {
                        var isKeysOk = true;
                        // 多个key
                        var groupKey = "";
                        for (int j = 0; j < keys.Count; j++)
                        {
                            var key = keys[j];
                            if (key is int i && i == 0)
                            {
                                isKeysOk = false;
                            }
                            else if (key is string s && string.IsNullOrEmpty(s))
                            {
                                isKeysOk = false;
                            }
        private static void ToTxtAsset(string excelPath, string sheetName, string outputPath, SheetData sheetData)
        {
            try
            {
                string fileName = Path.GetFileName(excelPath);
                var    itemPath = outputPath + EESettings.Current.GetAssetFileName(fileName, sheetName, ".txt");
                itemPath = itemPath.Substring(itemPath.IndexOf("Assets", StringComparison.Ordinal));

                var           keyIndexes   = new List <int>();
                var           validIndexes = new List <int>();
                StringBuilder content      = new StringBuilder();
                StringBuilder titleStr     = new StringBuilder();
                for (var col = 0; col < sheetData.ColumnCount; ++col)
                {
                    var cell = sheetData.Get(EESettings.Current.NameRowIndex, col);
                    if (!string.IsNullOrWhiteSpace(cell) && cell.Length > 1)
                    {
                        cell = cell.Substring(0, 1).ToUpper() + cell.Substring(1);
                        validIndexes.Add(col);
                    }
                    if (cell.ToLower().Contains("key"))
                    {
                        keyIndexes.Add(col);
                        var splits = cell.Split(':');
                        cell = splits[0];
                    }
                    var varType = GetGoType(cell);
                    titleStr.Append(varType).Append(EESettings.Current.GoTxtFieldSplitStr);
                }

                content.Append(titleStr.Remove(titleStr.Length - EESettings.Current.GoTxtFieldSplitStr.Length, EESettings.Current.GoTxtFieldSplitStr.Length)
                               .Append(EESettings.Current.GoTxtRowSplitStr));

                StringBuilder newRowStr    = new StringBuilder();
                var           isKeyInvalid = false;
                for (var row = EESettings.Current.DataStartIndex; row < sheetData.RowCount; ++row)
                {
                    newRowStr.Clear();

                    isKeyInvalid = false;

                    for (var col = 0; col < sheetData.ColumnCount; ++col)
                    {
                        if (!validIndexes.Contains(col))
                        {
                            continue;
                        }
                        var cell = sheetData.Get(row, col);
                        if (keyIndexes.Contains(col) && string.IsNullOrWhiteSpace(cell))
                        {
                            isKeyInvalid = true;
                            break;
                        }

                        newRowStr.Append(cell).Append(EESettings.Current.GoTxtFieldSplitStr);
                    }

                    if (isKeyInvalid)
                    {
                        continue;
                    }
                    content.Append(newRowStr.Remove(newRowStr.Length - EESettings.Current.GoTxtFieldSplitStr.Length, EESettings.Current.GoTxtFieldSplitStr.Length)
                                   .Append(EESettings.Current.GoTxtRowSplitStr));
                }

                if (!FileHelper.IsExistFile(itemPath))
                {
                    FileHelper.CreateFile(itemPath);
                }
                FileHelper.WriteText(itemPath, content.ToString());
            }
            catch (Exception ex)
            {
                EELog.LogError(ex.ToString());
            }
        }
예제 #4
0
        private static string ToCSharp(SheetData sheetData, string sheetName, string fileName)
        {
            try
            {
                var rowDataClassName = EESettings.Current.GetRowDataClassName(fileName, sheetName);
                var sheetClassName   = EESettings.Current.GetSheetClassName(fileName, sheetName);
                var csFile           = new StringBuilder(2048);
                csFile.Append("//------------------------------------------------------------------------------\n");
                csFile.Append("// <auto-generated>\n");
                csFile.Append("//     This code was generated by EasyExcel.\n");
                csFile.Append("//     Runtime Version: " + EEConstant.Version + "\n");
                csFile.Append("//\n");
                csFile.Append("//     Changes to this file may cause incorrect behavior and will be lost if\n");
                csFile.Append("//     the code is regenerated.\n");
                csFile.Append("// </auto-generated>\n");
                csFile.Append("//------------------------------------------------------------------------------");

                csFile.Append("\nusing System;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing EasyExcel;\n\n");
                csFile.Append(string.Format("namespace {0}\n", EESettings.Current.GetNameSpace(fileName)));
                csFile.Append("{\n");
                csFile.Append("\t[Serializable]\n");
                csFile.Append("\tpublic partial class " + rowDataClassName + " : EERowData\n");
                csFile.Append("\t{\n");
                // csFile.Append("\t\t[EEKeyField]\n");
                csFile.Append("\t\t[SerializeField]\n");
                csFile.Append("\t\tpublic string tempId;\n");
                csFile.Append("\n");

                /*var columnCount = 0;
                 * for (var col = 0; col < sheetData.ColumnCount; col++)
                 * {
                 *      if (string.IsNullOrEmpty(sheetData.Get(EESettings.Current.NameRowIndex, col)))
                 *              continue;
                 *      columnCount++;
                 * }*/

                var columnCount = sheetData.ColumnCount;

                // Get field names
                var fieldsName = new string[columnCount];
                var fieldsDis  = new string[columnCount];
                for (var col = 0; col < columnCount; col++)
                {
                    fieldsDis[col]  = sheetData.Get(EESettings.Current.DiscriptionRowIndex, col);
                    fieldsName[col] = sheetData.Get(EESettings.Current.NameRowIndex, col);
                }

                // Get field types and Key column
                var           fieldsLength      = new string[columnCount];
                var           fieldsType        = new string[columnCount];
                List <string> keyFieldNamesFull = new List <string>();
                List <string> keyFieldNames     = new List <string>();

                for (var col = 0; col < columnCount; col++)
                {
                    var cellInfo = sheetData.Get(EESettings.Current.TypeRowIndex, col);
                    fieldsLength[col] = null;
                    fieldsType[col]   = cellInfo;
                    if (cellInfo.EndsWith("]"))
                    {
                        var startIndex = cellInfo.IndexOf('[');
                        fieldsLength[col] = cellInfo.Substring(startIndex + 1, cellInfo.Length - startIndex - 2);
                        fieldsType[col]   = cellInfo.Substring(0, startIndex);
                    }

                    var varName = fieldsName[col];
                    var varLen  = fieldsLength[col];
                    var varType = fieldsType[col];
                    if (varName.EndsWith(":Key") || varName.EndsWith(":key") || varName.EndsWith(":KEY"))
                    {
                        var splits = varName.Split(':');
                        if ((varType.Equals("int") || varType.Equals("string")) && varLen == null)
                        {
                            keyFieldNamesFull.Add(varName);
                            fieldsName[col] = splits[0];
                            keyFieldNames.Add(fieldsName[col]);
                        }
                    }
                }

                if (keyFieldNamesFull.Count == 0)
                {
                    EELog.LogError("Cannot find Key column in sheet " + sheetName);
                }

                for (var col = 0; col < columnCount; col++)
                {
                    var  varName    = fieldsName[col];
                    var  varLen     = fieldsLength[col];
                    var  varType    = fieldsType[col];
                    bool isKeyField = keyFieldNamesFull.Count > 0 && keyFieldNames.Contains(varName);
                    if (IsSupportedColumnType(varType))
                    {
                        if (isKeyField)
                        {
                            csFile.Append("\t\t[EEKeyField]\n");
                        }
                        csFile.Append("\t\t[SerializeField]\n");
                        if (varLen == null)
                        {
                            csFile.AppendFormat("\t\tprivate {0} _{1};\n", varType, varName);
                            csFile.Append("\t\t/// <summary>\n");
                            csFile.AppendFormat("\t\t/// {0}\n", fieldsDis[col].Replace("\n", " "));
                            csFile.Append("\t\t/// </summary>\n");
                            csFile.AppendFormat("\t\tpublic {0} {1} {{ get {{ return _{1}; }} }}\n\n", varType, varName);
                        }
                        else
                        {
                            csFile.AppendFormat("\t\tprivate {0}[] _{1};\n", varType, varName);
                            csFile.Append("\t\t/// <summary>\n");
                            csFile.AppendFormat("\t\t/// {0}\n", fieldsDis[col].Replace("\n", " "));
                            csFile.Append("\t\t/// </summary>\n");
                            csFile.AppendFormat("\t\tpublic {0}[] {1} {{ get {{ return _{1}; }} }}\n\n", varType, varName);
                        }
                    }
                }

                csFile.AppendFormat("\n\t\tpublic {0}()" + "\n", rowDataClassName);
                csFile.Append("\t\t{" + "\n");
                csFile.Append("\t\t}\n");

                csFile.Append("\n#if UNITY_EDITOR\n");
                csFile.AppendFormat("\t\tpublic {0}(List<List<string>> sheet, int row, int column)" + "\n", rowDataClassName);
                csFile.Append("\t\t{" + "\n");
                //csFile.Append("\t\t\tcolumn = base._init(sheet, row, column);\n");
                for (var col = 0; col < columnCount; col++)
                {
                    var varType = fieldsType[col];
                    var varLen  = fieldsLength[col];
                    var varName = fieldsName[col];
                    if (keyFieldNamesFull.Count > 0 && keyFieldNamesFull.Contains(varName))
                    {
                        varName = keyFieldNames[keyFieldNamesFull.IndexOf(varName)];
                    }
                    varName = "_" + varName;

                    if (varType.Equals("int") || varType.Equals("float") || varType.Equals("double") ||
                        varType.Equals("long") || varType.Equals("bool"))
                    {
                        if (varLen == null)
                        {
                            csFile.Append("\t\t\t" + varType + ".TryParse(sheet[row][column++], out " + varName + ");\n");
                        }
                        else
                        {
                            csFile.Append("\t\t\tstring[] " + varName + "Array = sheet[row][column++].Split(\',\');" + "\n");
                            csFile.Append("\t\t\tint " + varName + "Count = " + varName + "Array.Length;" + "\n");
                            csFile.Append("\t\t\t" + varName + " = new " + varType + "[" + varName + "Count];\n");
                            csFile.Append("\t\t\tfor(int i = 0; i < " + varName + "Count; i++)\n");
                            csFile.Append("\t\t\t\t" + varType + ".TryParse(" + varName + "Array[i], out " + varName + "[i]);\n");
                        }
                    }
                    else if (varType.Equals("string"))
                    {
                        if (varLen == null)
                        {
                            csFile.Append("\t\t\t" + varName + " = sheet[row][column++] ?? \"" + /*varDefault + */ "\";\n");
                        }
                        else
                        {
                            csFile.Append("\t\t\tstring[] " + varName + "Array = sheet[row][column++].Split(\',\');" + "\n");
                            csFile.Append("\t\t\tint " + varName + "Count = " + varName + "Array.Length;" + "\n");
                            csFile.Append("\t\t\t" + varName + " = new " + varType + "[" + varName + "Count];\n");
                            csFile.Append("\t\t\tfor(int i = 0; i < " + varName + "Count; i++)\n");
                            csFile.Append("\t\t\t\t" + varName + "[i] = " + varName + "Array[i];\n");
                        }
                    }
                }

                //csFile.Append("\t\t\treturn column;\n");
                csFile.Append("\t\t}\n#endif\n");

                csFile.Append("\t}\n\n");

                // EERowDataCollection class
                csFile.Append("\tpublic partial class " + sheetClassName + " : EERowDataCollection\n");
                csFile.Append("\t{\n");
                csFile.AppendFormat("\t\t[SerializeField]\n\t\tprivate List<{0}> elements = new List<{0}>();\n\n", rowDataClassName);

                csFile.AppendFormat("\t\tpublic override void AddData(EERowData data)\n\t\t{{\n\t\t\telements.Add(data as {0});\n\t\t}}\n\n", rowDataClassName);
                csFile.Append("\t\tpublic override int GetDataCount()\n\t\t{\n\t\t\treturn elements.Count;\n\t\t}\n\n");
                csFile.Append("\t\tpublic override EERowData GetData(int index)\n\t\t{\n\t\t\treturn elements[index];\n\t\t}\n");

                csFile.Append("\t}\n");

                csFile.Append("}\n");

                return(csFile.ToString());
            }
            catch (Exception ex)
            {
                EELog.LogError(ex.ToString());
            }

            return("");
        }
예제 #5
0
        private static string ToGolang(SheetData sheetData, string sheetName, string fileName)
        {
            string _keyFieldNames2String(List <string> keys)
            {
                StringBuilder builder = new StringBuilder();

                for (int i = 0; i < keys.Count; i++)
                {
                    var key = keys[i];
                    key = key.Substring(0, 1).ToUpper() + key.Substring(1);
                    builder.Append("\"").Append(key).Append("\",");
                }

                if (keys.Count > 0)
                {
                    builder.Remove(builder.Length - 1, 1);
                }
                return(builder.ToString());
            }

            string _createGoMap(List <string> keyTypes, string valueStr)
            {
                StringBuilder builder = new StringBuilder();

                for (int i = 0; i < keyTypes.Count; i++)
                {
                    var keyType = keyTypes[i];
                    builder.Append("map[").Append(keyType).Append("]");
                }
                return(builder.Append(valueStr).ToString());
            }

            string _fillGoMap(List <string> keyTypes, string _sheetName, string valueStr)
            {
                // {sheetName}_Map{fillGoMap(keyFieldTypes, sheetName)} = &record
                var           mapName = $"		{_sheetName}_Map";
                StringBuilder builder = new StringBuilder();

                for (int i = 0; i < keyTypes.Count; i++)
                {
                    var keyType = keyTypes[i];
                    mapName += $"[keys[{i}].({keyType})]";
                    builder.Append(mapName).Append(" = ");
                    for (int j = i + 1; j < keyTypes.Count; j++)
                    {
                        var keyType2 = keyTypes[j];
                        builder.Append($"map[{keyType}]");
                    }

                    if (i == keyTypes.Count - 1)
                    {
                        // 最后一个,直接赋值
                        builder.AppendLine("&record");
                    }
                    else
                    {
                        // 不是最后一个的话,则新建
                        builder.AppendLine(valueStr);
                    }
                }
                return(builder.ToString());
            }

            try
            {
                var rowDataClassName = EESettings.Current.GetRowDataClassName(fileName, sheetName);
                var sheetClassName   = EESettings.Current.GetSheetClassName(fileName, sheetName);
                var csFile           = new StringBuilder(2048);
                csFile.Append("//------------------------------------------------------------------------------\n");
                csFile.Append("// <auto-generated>\n");
                csFile.Append("//     This code was generated by EasyExcel.\n");
                csFile.Append("//     Runtime Version: " + EEConstant.Version + "\n");
                csFile.Append("//\n");
                csFile.Append("//     Changes to this file may cause incorrect behavior and will be lost if\n");
                csFile.Append("//     the code is regenerated.\n");
                csFile.Append("// </auto-generated>\n");
                csFile.Append("//------------------------------------------------------------------------------");

                csFile.Append("\npackage gamedata\n");
                // csFile.Append("\nimport \"github.com/fuliufuliu/leaf/recordfile\"\n");
                csFile.Append("\nimport \"reflect\"\n");
                csFile.Append("type " + sheetClassName + " struct {\n");

                var columnCount = sheetData.ColumnCount;

                // Get field names
                var fieldsName = new string[columnCount];
                var fieldsDis  = new string[columnCount];
                for (var col = 0; col < columnCount; col++)
                {
                    fieldsDis[col]  = sheetData.Get(EESettings.Current.DiscriptionRowIndex, col);
                    fieldsName[col] = sheetData.Get(EESettings.Current.NameRowIndex, col);
                }

                // Get field types and Key column
                var           fieldsLength      = new string[columnCount];
                var           fieldsType        = new string[columnCount];
                List <string> keyFieldNamesFull = new List <string>();
                List <string> keyFieldNames     = new List <string>();
                List <string> keyFieldTypes     = new List <string>();

                for (var col = 0; col < columnCount; col++)
                {
                    var cellInfo = sheetData.Get(EESettings.Current.TypeRowIndex, col);
                    fieldsLength[col] = null;
                    fieldsType[col]   = cellInfo;
                    if (cellInfo.EndsWith("]"))
                    {
                        var startIndex = cellInfo.IndexOf('[');
                        fieldsLength[col] = cellInfo.Substring(startIndex + 1, cellInfo.Length - startIndex - 2);
                        fieldsType[col]   = cellInfo.Substring(0, startIndex);
                    }

                    var varName = fieldsName[col];
                    var varLen  = fieldsLength[col];
                    var varType = fieldsType[col];
                    if (varName.EndsWith(":Key") || varName.EndsWith(":key") || varName.EndsWith(":KEY"))
                    {
                        var splits = varName.Split(':');
                        if ((varType.Equals("int") || varType.Equals("string")) && varLen == null)
                        {
                            keyFieldNamesFull.Add(varName);
                            fieldsName[col] = splits[0];
                            keyFieldNames.Add(fieldsName[col]);
                            keyFieldTypes.Add(GetGoType(varType));
                        }
                    }
                }

                if (keyFieldNamesFull.Count == 0)
                {
                    EELog.LogError("Cannot find Key column in sheet " + sheetName);
                }

                // type Config_Card_Sheet struct {
                //      CardId int // 卡牌id;
                //      CardClass int // 卡牌品类;
                //      CardName string // 卡牌名称;
                //      AppearanceLevel int // 出场等级;
                //      Skill1Id int // 技能1_ID;
                // }
                List <string> keyTypes = new List <string>(4);
                for (var col = 0; col < columnCount; col++)
                {
                    var varName = fieldsName[col];
                    // 大写的字段是公有的,小写字段表示私有
                    if (!string.IsNullOrWhiteSpace(varName) && varName.Length > 1)
                    {
                        varName = varName.Substring(0, 1).ToUpper() + varName.Substring(1);
                    }
                    var varLen  = fieldsLength[col];
                    var varType = GetGoType(fieldsType[col]);

                    bool isKeyField = keyFieldNamesFull.Count > 0 && keyFieldNames.Contains(varName);
                    if (IsSupportedColumnType(varType))
                    {
                        if (isKeyField)
                        {
                            keyTypes.Add(varType);
                        }
                        if (varLen == null)
                        {
                            csFile.AppendFormat("\t{0} {1} // {2};\n", varName, varType, fieldsDis[col].Replace("\n", " "));
                        }
                        else
                        {
                            csFile.AppendFormat("\t{0} []{1} // {2};\n", varName, varType, fieldsDis[col].Replace("\n", " "));
                        }
                    }
                }
                csFile.Append("}\n\n");

                // 是key的字段列表
                csFile.Append($"\nvar {sheetClassName}_Keys = []string{{{_keyFieldNames2String(keyFieldNames)}}}\n\n");


                // var Config_Card_Map = map[int]*Config_Card_Sheet{}
                csFile.Append($"\nvar {sheetClassName}_Map = {_createGoMap(keyFieldTypes, "*" + sheetClassName + "{}")}\n\n");


                // func Load_Config_Card_Map() {
                //  var sheet = readRf(Config_Card_Sheet{})
                //  for i := 0; i < sheet.NumRecord(); i++ {
                //      record := *sheet.Record(i).(*Config_Card_Sheet)
                //      var keys = make([]interface{}, len(Config_Card_Sheet_Keys))
                //      for j := 0; j < len(Config_Card_Sheet_Keys); j++ {
                //          valueOfKey := reflect.ValueOf(record).FieldByName(Config_Card_Sheet_Keys[j]).Interface().(int)
                //          keys[0] = valueOfKey
                //      }
                //      Config_Card_Map[keys[0].(int)] = &record
                //  }
                // }
                csFile.Append($"\nfunc Load_{sheetClassName}_Map() {{" +
                              $"\n	var sheet = readRf({sheetClassName}{{}})"+
                              $"\n	for i := 0; i < sheet.NumRecord(); i++ {{"+
                              $"\n		record := *sheet.Record(i).(*{sheetClassName})"+
                              $"\n		var keys = make([]interface{{}}, len({sheetClassName}_Keys))"+
                              $"\n		for j := 0; j < len({sheetClassName}_Keys); j++ {{"+
                              $"\n			valueOfKey := reflect.ValueOf(record).FieldByName({sheetClassName}_Keys[j]).Interface().(int)"+
                              $"\n			keys[j] = valueOfKey"+
                              $"\n		}}"+
                              $"\n{_fillGoMap(keyFieldTypes, sheetClassName, "*" + sheetClassName + "{}")}" +
                              $"\n	}}"+
                              $"\n}}\n\n");

                return(csFile.ToString());
            }
            catch (Exception ex)
            {
                EELog.LogError(ex.ToString());
            }

            return("");
        }
예제 #6
0
        private static void ToScriptableObject(string sheetName, string outputPath, SheetData sheetData)
        {
            try
            {
                var dataTableClassName = EESettings.Current.GetDataTableClassName(sheetName);
                var asset       = ScriptableObject.CreateInstance(dataTableClassName);
                var dataCollect = asset as RowDataCollection;
                if (dataCollect == null)
                {
                    return;
                }
                var className = EESettings.Current.GetRowDataClassName(sheetName, true);
                var dataType  = Type.GetType(className);
                if (dataType == null)
                {
                    var asmb = Assembly.LoadFrom(Environment.CurrentDirectory +
                                                 "/Library/ScriptAssemblies/Assembly-CSharp.dll");
                    dataType = asmb.GetType(className);
                }

                if (dataType == null)
                {
                    EELog.LogError(className + " not exist !");
                    return;
                }

                var dataCtor = dataType.GetConstructor(Type.EmptyTypes);
                if (dataCtor == null)
                {
                    return;
                }
                var ids = new HashSet <int>();
                for (var row = EESettings.Current.DataStartIndex; row < sheetData.rowCount; ++row)
                {
                    for (var col = 0; col < sheetData.columnCount; ++col)
                    {
                        sheetData.Set(row, col, sheetData.Get(row, col).Replace("\n", "\\n"));
                    }

                    var inst = dataCtor.Invoke(null) as RowData;
                    if (inst == null)
                    {
                        continue;
                    }
                    inst._init(sheetData.Table, row, 0);
                    if (!ids.Contains(inst.ID))
                    {
                        dataCollect.AddData(inst);
                        ids.Add(inst.ID);
                    }
                    else
                    {
                        EELog.LogWarning("More than one rows use ID " + inst.ID + " in " + sheetName);
                    }
                }

                var itemPath = outputPath + EESettings.GetAssetFileName(sheetName);
                itemPath = itemPath.Substring(itemPath.IndexOf("Assets", StringComparison.Ordinal));
                AssetDatabase.CreateAsset(asset, itemPath);

                AssetDatabase.Refresh();
            }
            catch (Exception ex)
            {
                EELog.LogError(ex.ToString());
            }
        }