예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
            }
        }