Esempio n. 1
0
        /// <summary>
        /// Excel -> 二进制文件
        /// </summary>
        /// <param name="inPath"></param>
        /// <param name="inFolderName"></param>
        /// <param name="suffixName"></param>
        /// <returns></returns>
        public bool Bin(string inPath, string inFolderName, string suffixName)
        {
            Assist.CheckFolderExist(inFolderName);

            //PBData data = new PBData();

            //modify by wukun 2015/10/28
            //PBData需要用到的类都是动态生成的 无需每次添加的时候添加进工程重新编译exe
            //类的cs文件必须放在exe文件根目录的/ExcelfieldStrs/文件夹下
            Type PBDataType = AutoCSharp.Do.Creator.TypeMapper.GetTypeByName("PBData", true);

            object pbData = Activator.CreateInstance(PBDataType);

            //Test Cost Time
            System.Diagnostics.Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();

            DataSet   ds;
            DataTable dt = null;
            string    classname, subCfgName, subField, fieldTypeStr = "", fieldName = "", fieldStr = "", fieldMaxStr = "";
            Type      classType, subClassType, listType;
            object    classObj, subClassObj, listObj, key;

            FieldInfo   fieldInfo;
            IDictionary fieldValue;
            int         column = 0, subProIndex, arrSize;

            PropertyInfo[]  arrPro, subArrPro;
            bool            isBaseType;
            Regex           reg = new Regex(@"\{.+?\}");
            MatchCollection matches;
            Type            generic = typeof(List <>);

            string[]   arrField;
            MethodInfo method;
            long       maxVal;

            Dictionary <string, long> dicMaxValue;

            Assist.GetObjPaths(suffixName, inPath).ForEach(delegate(string path)
            {
                bool bExcel  = true;
                int rowIndex = 4;
                if (suffixName == ".xlsx")
                {
                    ds = Assist.ExcelToData(path);
                    dt = ds.Tables[0];
                }
                else if (suffixName == ".txt")
                {
                    dt       = Assist.TxtToData(path);
                    bExcel   = false;
                    rowIndex = 5;
                }

                classname = Assist.FirstLetterUp(dt.TableName);

                //TODO Get Cfg Max Value
                dicMaxValue = new Dictionary <string, long>();
                for (column = 0; column < dt.Columns.Count; column++)
                {
                    if (dt.Rows[2][column].ToString().Contains("+"))
                    {
                        fieldName   = Assist.FirstLetterLower(dt.Rows[0][column].ToString().Trim());
                        fieldMaxStr = dt.Rows[rowIndex][column].ToString();
                        maxVal      = 0;
                        if (!Regex.IsMatch(fieldMaxStr, @"\d.\d+"))
                        {
                            maxVal = long.Parse(fieldMaxStr);
                        }
                        dicMaxValue.Add(fieldName, maxVal);
                    }
                }


                //TODO 类型的获取应该动态获取
                classType  = AutoCSharp.Do.Creator.TypeMapper.GetTypeByName("Cfg" + classname);
                fieldInfo  = pbData.GetType().GetField(classname + "Dic");
                fieldValue = fieldInfo.GetValue(pbData) as IDictionary;

                int row = 5;
                if (!bExcel)
                {
                    row = 6;
                }
                bool bDeleted = false;
                try
                {
                    if (classType != null)
                    {
                        for (; row < dt.Rows.Count; row++)
                        {
                            classObj = Activator.CreateInstance(classType);

                            column = 0;
                            if (dt.Rows[row][column].ToString() == "")
                            {
                                break;
                            }
                            arrPro = classType.GetProperties();
                            foreach (PropertyInfo pro in arrPro)
                            {
                                fieldName = pro.Name;
                                if (fieldName == "mkey")
                                {
                                    continue;
                                }
                                fieldStr   = dt.Rows[row][column].ToString();
                                isBaseType = ParseExcelField2ObjectPro(pro, classObj, fieldStr, dicMaxValue[fieldName]);
                                if (isBaseType)
                                {
                                    if (fieldName == "deleted")
                                    {
                                        bDeleted = (int)pro.GetValue(classObj) == 1;
                                    }
                                }
                                else
                                {
                                    if (!reg.IsMatch(fieldStr))
                                    {
                                        column++;
                                        continue;
                                        //throw new Exception("自定义结构配置错误");
                                    }
                                    if (pro.PropertyType.Name == "List`1")
                                    {
                                        matches = reg.Matches(fieldStr);

                                        subCfgName   = pro.PropertyType.GenericTypeArguments[0].Name;
                                        subClassType = AutoCSharp.Do.Creator.TypeMapper.GetTypeByName(subCfgName);
                                        listType     = generic.MakeGenericType(new System.Type[] { subClassType });
                                        listObj      = Activator.CreateInstance(listType);
                                        foreach (object match in matches)
                                        {
                                            subField = match.ToString();
                                            subField = subField.Substring(1, subField.Length - 2);

                                            subClassObj = Activator.CreateInstance(subClassType);
                                            subArrPro   = subClassType.GetProperties();
                                            arrField    = subField.Split(',');
                                            arrSize     = arrField.Length;
                                            subProIndex = 0;
                                            foreach (PropertyInfo subPro in subArrPro)
                                            {
                                                fieldName = subPro.Name;
                                                if (fieldName == "mkey")
                                                {
                                                    continue;
                                                }
                                                if (subProIndex < arrSize)
                                                {
                                                    ParseExcelField2ObjectPro(subPro, subClassObj, arrField[subProIndex++]);
                                                }
                                            }
                                            method = listType.GetMethod("Add");
                                            method.Invoke(listObj, new object[] { subClassObj });
                                        }
                                        pro.SetValue(classObj, listObj);
                                    }
                                    else
                                    {
                                        fieldStr     = fieldStr.Substring(1, fieldStr.Length - 2);
                                        subClassType = AutoCSharp.Do.Creator.TypeMapper.GetTypeByName(pro.PropertyType.Name);
                                        subClassObj  = Activator.CreateInstance(subClassType);
                                        subArrPro    = subClassType.GetProperties();
                                        arrField     = fieldStr.Split(',');
                                        subProIndex  = 0;
                                        foreach (PropertyInfo subPro in subArrPro)
                                        {
                                            fieldName = subPro.Name;
                                            if (fieldName == "mkey")
                                            {
                                                continue;
                                            }
                                            ParseExcelField2ObjectPro(subPro, subClassObj, arrField[subProIndex++]);
                                        }
                                        pro.SetValue(classObj, subClassObj);
                                    }
                                }
                                column++;
                            }

                            if (bDeleted == false)
                            {
                                PropertyInfo proInfo = classType.GetProperty("mkey");
                                key = proInfo.GetValue(classObj, null);
                                fieldValue.Add(key, classObj);
                            }
                        }

                        fieldInfo.SetValue(pbData, fieldValue);
                    }
                }
                catch (Exception ex)
                {
                    string errorMsg = classname + "表第" + (row + 1) + "行\n" + fieldName + "字段\n" + fieldTypeStr + "\n" + fieldStr + "\n" + ex.Message;
                    throw new Exception(errorMsg);
                }
            });

            #region //SceneLayout 读取同级目录下的“Excel/SceneLayout/”内的所有 xml 文件,并将其数据写入 PBData

            //Dictionary<string, XmlDocument> doc = Assist.GetXml(Assist.RootPath + "Excel/SceneLayout/");
            //foreach (KeyValuePair<string, XmlDocument> fieldStr in doc)
            //{
            //    SceneLayout sl = new SceneLayout();
            //    XmlNodeList xcc = fieldStr.Value.SelectSingleNode("Config").ChildNodes;
            //    for (int i = 0; i < xcc.Count; i++)
            //    {
            //        SceneLayoutfieldStr sli = new SceneLayoutfieldStr();

            //        IProtoBufable xmlfieldStrValue = new SceneLayoutfieldStr() as IProtoBufable;// value
            //        List<string> xls = new List<string>();
            //        for (int x = 0; x < xcc[i].Attributes.Count; x++)
            //        {
            //            xls.Add(xcc[i].Attributes[x].Value);
            //        }
            //        xmlfieldStrValue.Set(xls);

            //        sl.fieldStr.Add(xmlfieldStrValue as SceneLayoutfieldStr);
            //    }
            //    data.SceneLayoutDic.Add(fieldStr.Key, sl);
            //}

            #endregion

            using (var file = System.IO.File.Create("PBData"))
            {
                try
                {
                    ProtoBuf.Serializer.Serialize(file, pbData);
                    stopWatch.Stop();
                    double msTime = stopWatch.Elapsed.TotalMilliseconds;
                    Console.WriteLine("耗时" + msTime);
                }
                catch (Exception e)
                {
                    MainWindow.Show(e.ToString());
                }
            }

            return(true);
        }
Esempio n. 2
0
        /// <summary>
        /// Excel -> .cs
        /// </summary>
        /// <param name="inFolderPath">输出文件夹名</param>
        /// <param name="suffixName">文件后缀名</param>
        /// <param name="inNameSpace">命名空间</param>
        /// <param name="inHeritNames">继承</param>
        /// <returns></returns>
        public bool Excel(string inPath, string inFolderName, string suffixName, string inNameSpace = "", string inHeritNames = "")
        {
            Assist.CheckFolderExist(inFolderName);
            Assist.DeleteFilesInFolder(inFolderName);

            Dictionary <string, string[]> finalclassname = new Dictionary <string, string[]>();

            //Load Cfg XML
            string cfgPath = Assist.RootPath + "Cfg";;
            Dictionary <string, XmlDocument> dicXML = Assist.GetXml(cfgPath);
            string      xmlName;
            XmlNodeList nodeList;
            Dictionary <string, string> dicFunctions = new Dictionary <string, string>();

            foreach (XmlDocument xml in dicXML.Values)
            {
                xmlName = xml.DocumentElement.Name;
                if (xmlName == "Functions")
                {
                    //保证先Load Functions.xml
                    nodeList = xml.GetElementsByTagName("function");
                    foreach (XmlNode node in nodeList)
                    {
                        foreach (XmlAttribute attr in node.Attributes)
                        {
                            if (attr.Name == "name")
                            {
                                dicFunctions[attr.Value] = node.InnerText;
                                break;
                            }
                        }
                    }
                    break;
                }
            }

            Dictionary <string, ExcelToCSharp> dicEc = new Dictionary <string, ExcelToCSharp>();
            string tableName = "";
            string tableDes  = "";

            string          cfgName = "", desName = "", fieldName;
            ExcelToCSharp   e;
            List <string[]> values;

            foreach (XmlDocument xml in dicXML.Values)
            {
                xmlName = xml.DocumentElement.Name;
                if (xmlName == "CfgItems")
                {
                    nodeList = xml.GetElementsByTagName("cfg");
                    foreach (XmlNode node in nodeList)
                    {
                        foreach (XmlAttribute attr in node.Attributes)
                        {
                            if (attr.Name == "name")
                            {
                                cfgName = attr.Value;
                            }
                            else if (attr.Name == "des")
                            {
                                desName = attr.Value;
                            }
                        }
                        //finalclassname.Add(cfgName, desName);
                        e = new ExcelToCSharp(inHeritNames, "Cfg" + Assist.FirstLetterUp(cfgName), inFolderName, dicFunctions);
                        e.SetInherit(inHeritNames);
                        values = new List <string[]>();
                        foreach (XmlNode paramNode in node.ChildNodes)
                        {
                            string[] v = new string[4];
                            foreach (XmlAttribute attr in paramNode.Attributes)
                            {
                                fieldName = attr.Name;
                                if (fieldName == "name")
                                {
                                    v[0] = attr.Value;
                                }
                                else if (fieldName == "type")
                                {
                                    v[1] = attr.Value;
                                }
                                else if (fieldName == "des")
                                {
                                    v[2] = attr.Value;
                                }
                                else if (fieldName == "link")
                                {
                                    v[3] = attr.Value;
                                }
                            }
                            values.Add(v);
                        }
                        e.SetValue(cfgName, values);
                        dicEc.Add(cfgName, e);
                    }
                }
            }

            try
            {
                Assist.GetObjPaths(suffixName, inPath).ForEach(delegate(string path)
                {
                    DataTable dt = null;
                    bool bExcel  = true;
                    if (suffixName == ".xlsx")
                    {
                        DataSet ds = Assist.ExcelToData(path);
                        dt         = ds.Tables[0];
                    }
                    else if (suffixName == ".txt")
                    {
                        tableDes = path;
                        dt       = Assist.TxtToData(path);
                        bExcel   = false;
                    }

                    if (dt != null)
                    {
                        // ===================== 类名注释 ========================

                        string acn  = path.Contains("(") ? path.Split('(')[1] : path.Split('(')[1];
                        string acnn = acn.Contains(")") ? acn.Split(')')[0] : acn.Split(')')[0];
                        tableDes    = acnn;
                        // =======================================================
                        tableName = Assist.FirstLetterUp(dt.TableName);
                        e         = new ExcelToCSharp(inHeritNames, "Cfg" + tableName, inFolderName, dicFunctions);
                        e.SetInherit(inHeritNames);

                        DataRowCollection rows = dt.Rows;
                        values              = new List <string[]>();
                        string note         = null;
                        string strFieldName = null;
                        for (int x = 0; x < dt.Columns.Count; x++)
                        {
                            if (rows[2][x].ToString() != "")
                            {
                                string[] v = new string[4];
                                v[0]       = rows[0][x].ToString().Trim();
                                v[1]       = rows[2][x].ToString().Trim();
                                if (bExcel)
                                {
                                    v[2] = rows[1][x].ToString().Trim();
                                    v[3] = rows[3][x].ToString().Trim();
                                }
                                else
                                {
                                    strFieldName = rows[1][x].ToString().Trim();
                                    note         = rows[3][x].ToString().Trim();
                                    v[2]         = note == "" ? strFieldName : string.Concat(strFieldName, ";", note);
                                    v[3]         = rows[4][x].ToString().Trim();
                                }

                                values.Add(v);
                            }
                        }
                        e.SetValue(acnn, values);
                        dicEc.Add(tableName, e);

                        finalclassname.Add(dt.TableName, new string[] { acnn, e.GetKeyType() });
                    }
                });
            }
            catch (Exception ex)
            {
                throw new Exception(tableDes + ex.Message + "可能是Excel打开表左下角的名字跟其它表重复。");
            }

            foreach (ExcelToCSharp ec in dicEc.Values)
            {
                ec.CreateCode(dicEc);
            }

            CreatePBData final = new CreatePBData(inHeritNames, "PBData", inFolderName);

            final.SetValue(finalclassname);
            return(true);
        }