CSFrameworkV6旗舰版 | 导入导出Excel文件数据开发教程|C/S开发框架
作者:csframework|C/S框架网  发布日期:2024/10/20 11:48:54

CSFrameworkV6旗舰版 | 导入导出Excel文件数据开发教程|C/S开发框架

CSFrameworkV6旗舰版 - 导入导出Excel文件数据开发教程

一、前言

本文主要讲解CSFrameworkV6导入及导出Excel文件的设计思路及开发流程。

二、设计思路

主要包含【导出数据】及【导入数据】

  • 导出数据,导出Excel模板文件,以及导出的Excel模板文件包含主数据。
  • 导入数据,将模板文件的数据导入到数据库。

Excel模板文件参考

CSFrameworkV6旗舰版 | 导入导出Excel文件数据开发教程|C/S开发框架

Excel模板对应的实体模型

C# 全选
    /// <summary>
    /// Excel文件的数据模型
    /// </summary>
    public class ImportLanguageData_ExcelModel
    {
        public string 对象ID { get; set; }
        public string 对象类型 { get; set; }
        public string 来源语种 { get; set; }        
        public string 来源语言内容 { get; set; }
        public string 目标语种 { get; set; }
        public string 目标语言内容 { get; set; }
    }

临时数据模型(中间数据)

在执行导入数据过程中,首先将Excel的数据导入到中间数据,然后提交中间数据到服务端,最后DAL层处理中间数据并提交到数据库。

C# 全选
    /// <summary>
    /// 临时数据模型,将Excel数据模型转换后存放的临时数据
    /// </summary>
    public class ImportLanguageData_DataModel
    {
        public string ObjectID { get; set; }
        public string ObjectType { get; set; }
        public string SourceLanType { get; set; }
        public string TargetLanType { get; set; }
        public string SourceLanData { get; set; }
        public string TargetLanData { get; set; }
        
        //
        //这里可增加其他属性,用于存储转换后的临时数据,或对应实体模型的字段。
        //
    }

三、开发流程

初始化按钮

重写 InitButtons 方法,增加【导出模版文件】【导入模版数据】两个按钮。

C# 全选
        /// <summary>
        /// 初始化界面按钮
        /// </summary>
        public override void InitButtons()
        {
            base.InitButtons();

            if (this.ButtonAuthorized(ButtonAuthority.ADD))
            {
                var btnExportFile = this.ToolbarRegister.CreateButton(ButtonNameList.btnExportFile,
                      LanLib.Get("导出模版文件"), ToolBarGroup.数据操作, Globals.LoadBitmap("32_excel_template.png"), new Size(57, 28), false, true,
                      DoExportTemplate);
                var btnImportFile = this.ToolbarRegister.CreateButton(ButtonNameList.btnImportFile,
                    LanLib.Get("导入模版数据"), ToolBarGroup.数据操作, Globals.LoadBitmap("32_excel_import.png"), new Size(57, 28), false, true,
                    DoImportExcelData);

                //添加子按钮
                var btnOwner = _buttons.GetButtonByName(ButtonNameList.btnExportDataDict);//父级按钮:导入/导出按钮

                btnOwner.AddSubButton(btnExportFile);
                btnOwner.AddSubButton(btnImportFile);
            }
        }

导出模板文件按钮事件:DoExportTemplate

方式1:直接另存为模板文件(不含数据)

该方式用于直接导入Excel内所有数据。

C# 全选
        public virtual void DoExportTemplate(IButtonInfo sender)
        {
            var file = Path.Combine(Globals.ApplicationPath, @"excel_templates\语言资料模板.xlsx");
            if (File.Exists(file))
            {
                SaveFileDialog dlg = new SaveFileDialog();
                dlg.Filter = "Excel文件|*.xlsx";
                dlg.FileName = DateTime.Today.ToString("yyyyMMdd") + " - 语言资料模板.xlsx";
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    File.Copy(file, dlg.FileName, true);
                    if (File.Exists(dlg.FileName))
                        Msg.ShowInformation("导出模版文件成功!");
                    else
                        Msg.Warning("导出失败!");
                }
            }
            else
            {
                Msg.Warning("模版文件丢失(语言资料模板.xlsx),请联系管理员!");
            }
        }

方式2:导出模板文件(包含数据)

该方式用于提供参考数据给用户填写Excel文件内容。比如本文案例导出【中文简体】的语言内容作为参考数据,用户对照翻译为【英文】作为目标语言数据。

CSFrameworkV6旗舰版 | 导入导出Excel文件数据开发教程|C/S开发框架

代码参考:frmLanguageData的 DoExportTemplate 方法。

导入模版数据按钮事件:DoImportExcelData

主要逻辑

  • 设计数据导入类:ImportLanguageDataFromExcel
  • 使用 frmImportExcel 通用导入界面导入数据。

C# 全选
        public virtual void DoImportExcelData(IButtonInfo sender)
        {
            IImporterSource source = new ImporterDataSource_Excel_NPOI(typeof(ImportLanguageData_ExcelModel));
            IImporterTarget target = new ImportLanguageDataFromExcel();
            var count = frmImportExcel.ExecuteImporter(source, target);
            if (count > 0)
            {
                btnQuery.PerformClick();//刷新数据
            }
        }

DAL层 Import 方法实现

C# 全选
        public ImportResult Import(List<ImportLanguageData_DataModel> list)
        {
            ImportResult result = new ImportResult();
            if (list.Count == 0) return result;

            try
            {
                _Database.BeginTransaction();

                List<sys_LanguageData> listNewData = new List<sys_LanguageData>();
                List<sys_LanguageData> listModData = new List<sys_LanguageData>();

                //获取已存在的语言数据
                var lanTypes = list.Select(s => s.TargetLanType).Distinct().ToList();
                var listOldData = _Database.GetQueryable<sys_LanguageData>().Where(w => lanTypes.Contains(w.LanType)).ToList();

                sys_LanguageData old;

                list.ForEach(source =>
                {
                    old = listOldData.Where(a => a.LanType == source.TargetLanType && a.ObjectID == source.ObjectID).FirstOrDefault();

                    //不存在,新增语言数据
                    if (old == null)
                    {
                        var newData = new sys_LanguageData
                        {
                            isid = IdHelper.GetId(),
                            LanData = source.TargetLanData,
                            LanType = source.TargetLanType,
                            ObjectID = source.ObjectID,
                            ObjectType = source.ObjectType,
                            CreatedBy = _Loginer.Account,
                            CreationDate = DateTime.Now,
                            LastUpdatedBy = _Loginer.Account,
                            LastUpdateDate = DateTime.Now,
                        };

                        listNewData.Add(newData);
                    }
                    else //修改
                    {
                        old.LanData = source.TargetLanData;
                        old.LanType = source.TargetLanType;
                        old.ObjectType = source.ObjectType;
                        old.LastUpdatedBy = _Loginer.Account;
                        old.LastUpdateDate = DateTime.Now;
                        listModData.Add(old);
                    }
                });

                if (listNewData.Count > 0) _Database.Add(listNewData);
                if (listModData.Count > 0) _Database.Update(listModData);

                _Database.CommitTransaction();

                result.Message = $"新增:{listNewData.Count},修改:{listModData.Count}";
                result.Count = listNewData.Count + listModData.Count;
                result.Success = true;
            }
            catch (Exception ex)
            {
                result.Message = ex.Message;

                _Database.RollbackTransaction();
            }

            return result;
        }

完整版源码

开发框架版本:CSFrameworkV6.1

文本源码位置:frmLanguageData.cs

截图参考

功能按钮

CSFrameworkV6旗舰版 | 导入导出Excel文件数据开发教程|C/S开发框架

导入数据

CSFrameworkV6旗舰版 | 导入导出Excel文件数据开发教程|C/S开发框架

C/S框架网|原创精神.创造价值.打造精品


扫一扫加作者微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务
上一篇 下一篇