ABP Vnext中使用Magicodes.IE导入导出
1.Moudle中配置
public class CloudMomHttpApiHostModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
ConfigureMagicodes(context);
}
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
{
[ExporterHeader("登录名")]
public string UserName { get; set; }
[ExporterHeader("姓名")]
public string Name { get; set; }
[ExporterHeader("员工工号")]
public string UserCode { get; set; }
[ExporterHeader("电话")]
public string PhoneNumber { get; set; }
[ExporterHeader("角色")]
public string RoleName { get; set; }
[ExporterHeader(IsIgnore = true)] public bool IsActive { get; set; }
[ExporterHeader(DisplayName = "状态")] public string Status => IsActive ? "启用" : "禁用";
[ExporterHeader("所属部门")]
public string DeptName { get; set; }
[ExporterHeader("企业名称")]
public string TenantName { get; set; }
[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 导出用户列表
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
{
public Guid? TenantId { get; set; }
[Comment("客户编号")]
public string CustomerCode { get; set; }
[Comment("客户简称")]
public string CustomerBriefName { get; set; }
[Comment("客户全称")]
public string CustomerFullName { get; set; }
[Comment("客户联系人")]
public string Contactor { get; set; }
[Comment("联系电话")]
public string ContactorPhone { get; set; }
[Comment("客户负责人")]
public string ChargeMan { get; set; }
[Comment("负责人职务")]
public string ChargeManDuty { get; set; }
[Comment("负责人电话")]
public string ChargeManPhone { get; set; }
[Comment("所属行业")]
public string Industry { get; set; }
[Comment("所在城市")]
public string City { get; set; }
[Comment("详细地址")]
public string Addre { get; set; }
[Comment("备注")]
public string Bak { get; set; }
[Comment("状态")]
public int Status { get; set; }
[Comment("创建人")]
public string Creator { get; set; }
[Comment("修改人")]
public string Modifier { get; set; }
}
[ExcelImporter(IsLabelingError = true)]
public class CustomerImport
{
[ImporterHeader(Name = "客户简称")]
[Required(ErrorMessage = "客户简称不能为空")]
public string CustomerBriefName { get; set; }
[ImporterHeader(Name = "客户全称")]
[Required(ErrorMessage = "客户全称不能为空")]
public string CustomerFullName { get; set; }
[ImporterHeader(Name = "所属行业")]
public string Industry { get; set; }
[ImporterHeader(Name = "联系人")]
public string Contactor { get; set; }
[ImporterHeader(Name = "联系人电话")]
public string ContactorPhone { get; set; }
[ImporterHeader(Name = "负责人")]
[Required(ErrorMessage = "负责人不能为空")]
public string ChargeMan { get; set; }
[ImporterHeader(Name = "负责人电话")]
[Required(ErrorMessage = "负责人电话不能为空")]
public string ChargeManPhone { get; set; }
[ImporterHeader(Name = "负责人职务")]
[Required(ErrorMessage = "负责人职务不能为空")]
public string ChargeManDuty { get; set; }
[ImporterHeader(Name = "状态")]
public string Status { get; set; }
[ImporterHeader(Name = "所属城市")]
[Required(ErrorMessage = "所属城市不能为空")]
public string City { get; set; }
[ImporterHeader(Name = "详细地址")]
public string Addre { get; set; }
[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);
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 导入客户列表
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