public void Process() { var dllPath = Settings.Export_Folder + Settings.language_folder + Settings.csharp_dll_folder + Compiler.DllName; if (!File.Exists(dllPath)) { Log.Info($"未找到生成的{dllPath},请检查数据表是否正确或着反馈 [email protected]"); return; } byte[] assemblyBytes = File.ReadAllBytes(dllPath); _assembly = Assembly.Load(assemblyBytes); var protoFolder = Settings.Export_Folder + Settings.proto_folder; string[] files = Directory.GetFiles(protoFolder, "*.proto", SearchOption.AllDirectories); for (int i = 0; i < files.Length; i++) { string protoPath = files[i]; string protoName = Path.GetFileNameWithoutExtension(protoPath); DataInfo.Data clzData = DataInfo.AllDataClassInfo[protoName]; _listClzIns = _assembly.CreateInstance($"{clzData.PkgName}.{clzData.ListClzName}"); string excelPath = Settings.Excel_Folder + "/" + clzData.ExcelName + ".xlsx"; Log.Info($"开始导出{clzData.ExcelName}.xlsx数据"); ProcessData(excelPath, clzData); } }
private void ProcessData(string path, DataInfo.Data clzData) { AssertThat.IsTrue(File.Exists(path), "Excel file can not find"); var excelApp = new Application(); var workbooks = excelApp.Workbooks.Open(path); try { int pageCount = workbooks.Sheets.Count; AssertThat.IsTrue(pageCount > 2, "Excel's page count MUST > 2"); for (int pageIndex = 3; pageIndex <= pageCount; pageIndex++) { var sheet = workbooks.Sheets[pageIndex]; AssertThat.IsNotNull(sheet, "Excel's sheet is null"); Worksheet worksheet = sheet as Worksheet; AssertThat.IsNotNull(sheet, "Excel's worksheet is null"); var usedRange = worksheet.UsedRange; int rowCount = usedRange.Rows.Count; int colCount = usedRange.Columns.Count; if (rowCount < 2) { Log.Info($"{clzData.ExcelName}.xlsx的第{pageIndex}页无数据,跳过..."); continue; } for (int rowIndex = 2; rowIndex <= rowCount; rowIndex++) { var excel_Type = _listClzIns.GetType(); var dataProp = excel_Type.GetProperty("List"); var dataIns = dataProp.GetValue(_listClzIns); var dataType = dataProp.PropertyType; var ins = _assembly.CreateInstance($"{clzData.PkgName}.{clzData.DataClzName}"); var addMethod = dataType.GetMethod("Add", new[] { ins.GetType() }); for (int columnIndex = 1; columnIndex <= colCount; columnIndex++) { string variableName = ((Range)usedRange.Cells[1, columnIndex]).Text.ToString(); if (string.IsNullOrEmpty(variableName)) { continue; } var variableType = clzData.VarType[variableName]; var variableValue = ((Range)usedRange.Cells[rowIndex, columnIndex]).Text.ToString(); var insType = ins.GetType(); var fieldNameSplit = variableName.Split('_');// .Replace("_", "") + "_"; string fieldName = ""; for (int i = 0; i < fieldNameSplit.Length; i++) { fieldName += fieldNameSplit[i].Substring(0, 1).ToUpper() + fieldNameSplit[i].Substring(1); } fieldName = fieldName.Substring(0, 1).ToLower() + fieldName.Substring(1) + "_"; FieldInfo insField = insType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance); if (insField == null) { Log.Info($"{clzData.DataClzName}中找不到列{variableName}对应的属性{fieldName}"); continue; } var value = GetVariableValue(variableType, variableValue); insField.SetValue(ins, value); } addMethod.Invoke(dataIns, new[] { ins }); } Log.Info($"{clzData.ExcelName}.xlsx的第{pageIndex}页有{rowCount - 1}条数据,导出完毕"); } Serialize(_listClzIns); } catch (Exception e) { Console.WriteLine(e); throw; } finally { workbooks.Close(); excelApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp); } }