/// <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); }
/// <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); }