ABP Vnext中使用Magicodes.IE导入导出

ABP Vnext中使用Magicodes.IE导入导出

1.Moudle中配置

public class CloudMomHttpApiHostModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        ConfigureMagicodes(context);
    }

    /// <summary>
    /// 配置Magicodes.IE
    /// Excel导入导出
    /// </summary>
    private void ConfigureMagicodes(ServiceConfigurationContext context)
    {
        context.Services.AddTransient<IExporter, ExcelExporter>();
        context.Services.AddTransient<IExcelExporter, ExcelExporter>();
        context.Services.AddTransient<IExcelImporter, ExcelImporter>();
    }
   
}

2.构造函数注入

 
       private readonly IExcelExporter _excelExporter; 
       private readonly IExcelImporter _excelImporter;
       public ExportService(IExcelExporter excelExporter,IExcelImporter  excelImporter)
        {
           _excelExporter = excelExporter;
            _excelImporter = excelImporter;
        }

3.导出

3.1 导出实体

 [ExcelExporter(Name = "用户列表")]
    public class UserExport
    {
        /// <summary>
        /// 用户名
        /// </summary>
        [ExporterHeader("登录名")]
        public string UserName { get; set; }

        /// <summary>
        /// 姓名
        /// </summary>
        [ExporterHeader("姓名")]
        public string Name { get; set; }

        /// <summary>
        /// 员工工号
        /// </summary>
        [ExporterHeader("员工工号")]
        public string UserCode { get; set; }

        /// <summary>
        /// 电话
        /// </summary>
        [ExporterHeader("电话")]
        public string PhoneNumber { get; set; }

        /// <summary>
        /// 角色
        /// </summary>
        [ExporterHeader("角色")]
        public string RoleName { get; set; }

        /// <summary>
        /// 用户状态 true 启用 false 停用
        /// </summary>
        //[XlsField("状态", ValMapper = "true=启用,false=停用")]
        //public bool IsActive { get; set; }

        [ExporterHeader(IsIgnore = true)] public bool IsActive { get; set; }


        [ExporterHeader(DisplayName = "状态")] public string Status => IsActive ? "启用" : "禁用";

        /// <summary>
        /// 所属部门
        /// </summary>
        [ExporterHeader("所属部门")]
        public string DeptName { get; set; }

        /// <summary>
        /// 租户名称
        /// </summary>
        [ExporterHeader("企业名称")]
        public string TenantName { get; set; }

        /// <summary>
        /// 备注
        /// </summary>
        [ExporterHeader("备注")]
        public string Remark { get; set; }
    }

3.2 导出

  public async Task<byte[]> Export<T>(Func<Task<IQueryable<T>>> func) where T : class, new()
        {
            //这里可以写一些通用的处理逻辑。。。
            var result = await (await func.Invoke()).ToListAsync();
            return await excelExporter.ExportAsByteArray<T>(query);
        }

        #region 导出用户列表
        /// <summary>
        /// 导出用户列表
        /// </summary>
        /// <returns></returns>
        public async Task<byte[]> UserExport()
        {
            return await Export(async () => (await UserExtraRepos.GetQueryableAsync())
                .Include(it => it.IdentityUser)
                .OrderByDescending(it => it.CreationTime)
                .Select(it => new UserExport
                {
                    Name = it.IdentityUser.Name,
                    UserName = it.IdentityUser.UserName,
                    PhoneNumber = it.IdentityUser.PhoneNumber,
                    IsActive = it.IdentityUser.IsActive,
                    RoleName = it.IdentityRole.Name,
                    UserCode = it.UserCode,
                    DeptName = it.Dept != null ? it.Dept.DeptName : string.Empty,
                    Remark = it.Remark
                }));
        }
        #endregion 导出用户列表

4.导入

4.1 导入实体


public class Customer : AuditedAggregateRoot<Guid>, IMultiTenant
{
    /// <summary>
    /// 租户Id
    /// </summary>
    public Guid? TenantId { get; set; }

    /// <summary>
    /// 客户编号
    /// </summary>
    [Comment("客户编号")]
    public string CustomerCode { get; set; }

    /// <summary>
    /// 客户简称
    /// </summary>
    [Comment("客户简称")]
    public string CustomerBriefName { get; set; }

    /// <summary>
    /// 客户全称
    /// </summary>
    [Comment("客户全称")]
    public string CustomerFullName { get; set; }

    /// <summary>
    /// 客户联系人
    /// </summary>
    [Comment("客户联系人")]
    public string Contactor { get; set; }

    /// <summary>
    /// 联系电话
    /// </summary>
    [Comment("联系电话")]
    public string ContactorPhone { get; set; }

    /// <summary>
    /// 客户负责人
    /// </summary>
    [Comment("客户负责人")]
    public string ChargeMan { get; set; }

    /// <summary>
    /// 负责人职务
    /// </summary>
    [Comment("负责人职务")]
    public string ChargeManDuty { get; set; }

    /// <summary>
    /// 负责人电话
    /// </summary>
    [Comment("负责人电话")]
    public string ChargeManPhone { get; set; }

    /// <summary>
    /// 所属行业
    /// </summary>
    [Comment("所属行业")]
    public string Industry { get; set; }

    /// <summary>
    /// 所在城市
    /// </summary>
    [Comment("所在城市")]
    public string City { get; set; }

    /// <summary>
    /// 详细地址
    /// </summary>
    [Comment("详细地址")]
    public string Addre { get; set; }

    /// <summary>
    /// 备注
    /// </summary>
    [Comment("备注")]
    public string Bak { get; set; }

    /// <summary>
    /// 状态 1=启用,0=停用
    /// </summary>
    [Comment("状态")]
    public int Status { get; set; }

    /// <summary>
    /// 创建人
    /// </summary>
    [Comment("创建人")]
    public string Creator { get; set; }

    /// <summary>
    /// 修改人
    /// </summary>
    [Comment("修改人")]
    public string Modifier { get; set; }
}




  [ExcelImporter(IsLabelingError = true)]//IsLabelingError:是否标注数据错误
    public class CustomerImport
    {

        /// <summary>
        /// 客户简称
        /// </summary>
        [ImporterHeader(Name = "客户简称")]
        [Required(ErrorMessage = "客户简称不能为空")]
        public string CustomerBriefName { get; set; }

        /// <summary>
        /// 客户全称
        /// </summary>
        [ImporterHeader(Name = "客户全称")]
        [Required(ErrorMessage = "客户全称不能为空")]
        public string CustomerFullName { get; set; }

        /// <summary>
        /// 所属行业
        /// </summary>
        [ImporterHeader(Name = "所属行业")]
        public string Industry { get; set; }

        /// <summary>
        /// 联系人
        /// </summary>
        [ImporterHeader(Name = "联系人")]
        public string Contactor { get; set; }

        /// <summary>
        /// 联系人电话
        /// </summary>
        [ImporterHeader(Name = "联系人电话")]
        public string ContactorPhone { get; set; }

        /// <summary>
        /// 负责人
        /// </summary>
        [ImporterHeader(Name = "负责人")]
        [Required(ErrorMessage = "负责人不能为空")]
        public string ChargeMan { get; set; }

        /// <summary>
        /// 负责人电话
        /// </summary>
        [ImporterHeader(Name = "负责人电话")]
        [Required(ErrorMessage = "负责人电话不能为空")]
        public string ChargeManPhone { get; set; }

        /// <summary>
        /// 负责人职务
        /// </summary>
        [ImporterHeader(Name = "负责人职务")]
        [Required(ErrorMessage = "负责人职务不能为空")]
        public string ChargeManDuty { get; set; }

        /// <summary>
        /// 状态 启用 停用
        /// </summary>
        [ImporterHeader(Name = "状态")]
        public string Status { get; set; }

        /// <summary>
        /// 所属城市
        /// </summary>
        [ImporterHeader(Name = "所属城市")]
        [Required(ErrorMessage = "所属城市不能为空")]
        public string City { get; set; }

        /// <summary>
        /// 详细地址
        /// </summary>
        [ImporterHeader(Name = "详细地址")]
        public string Addre { get; set; }

        /// <summary>
        /// 备注
        /// </summary>
        [ImporterHeader(Name = "备注")]
        public string Bak { get; set; }
    }

4.2 导入

  public async Task<List<TTo>> Import<TIn, TTo>(IFormFile file, Func<TIn, int, TTo> func) where TIn : class, new()
        {
            if (file is not null)
            {
                //文件后缀
                var fileExtension = Path.GetExtension(file.FileName);

                //判断后缀是否是excel文件
                const string fileFilt = ".xlsx";
                if (fileExtension == null)
                {
                    throw new UserFriendlyException("文件没有后缀!");
                }
                if (fileFilt.IndexOf(fileExtension.ToLower(), StringComparison.Ordinal) <= -1)
                {
                    throw new UserFriendlyException("请上传Excel文件!");
                }
                using Stream fs = new MemoryStream();
                await file.CopyToAsync(fs);
                var result = await _excelImporter.Import<TIn>(fs);
                if (result.HasError)
                {
                    string errorMsgAll = string.Empty;
                    foreach (var item in result.RowErrors)
                    {
                        string errorMsg = string.Empty;
                        foreach (var error in item.FieldErrors)
                        {
                            errorMsg += $"{error.Value}" + ";";
                        }
                        errorMsgAll += $"列表第{item.RowIndex}行数据:" + errorMsg + Environment.NewLine;
                    }
                    throw new UserFriendlyException(errorMsgAll);
                }
                if (result != null && result.Data != null && result.Data.Any())
                {
                    List<TTo> list = new();
                    int i = 1;
                    foreach (var item in result.Data)
                    {
                        list.Add(func.Invoke(item, i));
                        i++;
                    }
                    return list;
                }
                else
                {
                    throw new UserFriendlyException("表格数据不能为空!");
                }
            }
            else
            {
                throw new UserFriendlyException("文件不能为空!");
            }
          

        }



        #region 导入客户列表
        /// <summary>
        /// 导入客户列表
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        public async Task<IMomRes> CustomerImport(IFormFile file)
        {
                var result = await Import<CustomerImport, Customer>(file, (s, row) => {
                    string codeName = "CustomerCode";
                    return new Customer()
                    {
                        CustomerCode = _billNumberRepository.GetByNameAsync(codeName).Result,
                        CustomerBriefName = s.CustomerBriefName,
                        CustomerFullName = s.CustomerFullName,
                        Industry = s.Industry,
                        Contactor = s.Contactor,
                        ContactorPhone = s.ContactorPhone,
                        ChargeMan = s.ChargeMan,
                        ChargeManPhone = s.ChargeManPhone,
                        ChargeManDuty = s.ChargeManDuty,
                        Status = s.Status == "启用" ? 1 : 0,
                        City = s.City,
                        Addre = s.Addre,
                        Bak = s.Bak,
                        Creator = CurrentUser.Name
                    };
                });
                await CustomerRepos.InsertManyAsync(result);
                return MomRes.Ok();
        }

        #endregion

5.MagicCodes.IE GItHub地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值