开源导入导出通用库Magicodes.ExporterAndImporter发布

  • 2019 年 10 月 3 日
  • 笔记

 

导入导出通用库

Magicodes.ExporterAndImporter为心莱团队封装的导入导出通用库,并且仍在跟随项目不断地打磨。

GitHub地址:https://github.com/xin-lai/Magicodes.ExporterAndImporter

 


 

目录

 

特点

相关官方Nuget包

导出 Demo

  • 普通导出

  • 特性导出

  • 列头处理或者多语言支持

导入Demo

  • 普通模板

  • 多数据类型

  • 数据验证

Docker中使用

Dockerfile Demo


 

特点

  • 封装导入导出业务,目前仅支持 Excel,有兴趣的小伙伴可以考虑支持 CSV 以及PDF或其他格式的导出

  • 配置特性即可控制相关逻辑和显示结果,无需修改逻辑代码

  • 推荐配合 导入导出DTO 使用

  • 导出支持列头自定义处理以便支持多语言等场景

  • 导出支持文本自定义过滤或处理

  • 导入支持自动根据导入DTO生成导入模板及模板验证

  • 导入支持数据验证逻辑

  • 导入支持数据下拉选择

  • 导入支持注释添加

 

相关官方Nuget包

 

导出 Demo

Demo1-1

普通导出

public class ExportTestData  {      public string Name1 { get; set; }      public string Name2 { get; set; }      public string Name3 { get; set; }      public string Name4 { get; set; }  }    var result = await Exporter.Export(filePath, new List<ExportTestData>()  {      new ExportTestData()      {          Name1 = "1",          Name2 = "test",          Name3 = "12",          Name4 = "11",      },      new ExportTestData()      {          Name1 = "1",          Name2 = "test",          Name3 = "12",          Name4 = "11",      }  });


Demo1-2

特性导出

[ExcelExporter(Name = "测试", TableStyle = "Light10")]public class ExportTestDataWithAttrs  {      [ExporterHeader(DisplayName = "加粗文本", IsBold = true)]      public string Text { get; set; }        [ExporterHeader(DisplayName = "普通文本")]      public string Text2 { get; set; }        [ExporterHeader(DisplayName = "忽略", IsIgnore = true)]      public string Text3 { get; set; }        [ExporterHeader(DisplayName = "数值", Format = "#,##0")]      public double Number { get; set; }        [ExporterHeader(DisplayName = "名称", IsAutoFit = true)]      public string Name { get; set; }  }          var result = await Exporter.Export(filePath, new List<ExportTestDataWithAttrs>()          {              new ExportTestDataWithAttrs()              {                  Text = "啊实打实大苏打撒",                  Name="aa",                  Number =5000,                  Text2 = "w萨达萨达萨达撒",                  Text3 = "sadsad打发打发士大夫的"              },             new ExportTestDataWithAttrs()              {                  Text = "啊实打实大苏打撒",                  Name="啊实打实大苏打撒",                  Number =6000,                  Text2 = "w萨达萨达萨达撒",                  Text3 = "sadsad打发打发士大夫的"              },             new ExportTestDataWithAttrs()              {                  Text = "啊实打实速度大苏打撒",                  Name="萨达萨达",                  Number =6000,                  Text2 = "突然他也让他人",                  Text3 = "sadsad打发打发士大夫的"              },            });

 

Demo1-3

列头处理或者多语言支持

 

 

 

[ExcelExporter(Name = "测试", TableStyle = "Light10")]  public class AttrsLocalizationTestData  {      [ExporterHeader(DisplayName = "加粗文本", IsBold = true)]      public string Text { get; set; }        [ExporterHeader(DisplayName = "普通文本")]      public string Text2 { get; set; }        [ExporterHeader(DisplayName = "忽略", IsIgnore = true)]      public string Text3 { get; set; }        [ExporterHeader(DisplayName = "数值", Format = "#,##0")]      public double Number { get; set; }        [ExporterHeader(DisplayName = "名称", IsAutoFit = true)]      public string Name { get; set; }  }          ExcelBuilder.Create().WithLocalStringFunc((key) =>          {              if (key.Contains("文本"))              {                  return "Text";              }              return "未知语言";          }).Build();            var filePath = Path.Combine(Directory.GetCurrentDirectory(), "testAttrsLocalization.xlsx");          if (File.Exists(filePath)) File.Delete(filePath);            var result = await Exporter.Export(filePath, new List<AttrsLocalizationTestData>()          {              new AttrsLocalizationTestData()              {                  Text = "啊实打实大苏打撒",                  Name="aa",                  Number =5000,                  Text2 = "w萨达萨达萨达撒",                  Text3 = "sadsad打发打发士大夫的"              },             new AttrsLocalizationTestData()              {                  Text = "啊实打实大苏打撒",                  Name="啊实打实大苏打撒",                  Number =6000,                  Text2 = "w萨达萨达萨达撒",                  Text3 = "sadsad打发打发士大夫的"              },             new AttrsLocalizationTestData()              {                  Text = "啊实打实速度大苏打撒",                  Name="萨达萨达",                  Number =6000,                  Text2 = "突然他也让他人",                  Text3 = "sadsad打发打发士大夫的"              },            });

 

导入 Demo

导入特性(ImporterHeader):

  • Namestring 表头显示名称(不可为空)。

  • Descriptionstring 表头添加注释。

  • Authorstring 注释作者,默认值为X.M。

导入结果(ImportModel<T>):

  • DataIList<T>  导入的数据集合。

  • ValidationResultsIList<ValidationResultModel> 数据验证结果。

  • HasValidTemplatebool 模板验证是否通过。

数据验证结果(ValidationResultModel):

  • Indexint  错误数据所在行。

  • ErrorsIDictionary<string, string> 整个Excel错误集合。目前仅支持数据验证错误。

  • FieldErrorsIDictionary<string, string> 数据验证错误。

 

Demo2-1 普通模板

生成模板

public class ImportProductDto  {      /// <summary>      /// 产品名称      /// </summary>      [ImporterHeader(Name = "产品名称")]      public string Name { get; set; }      /// <summary>      /// 产品代码      /// </summary>      [ImporterHeader(Name = "产品代码")]      public string Code { get; set; }      /// <summary>      /// 产品条码      /// </summary>      [ImporterHeader(Name = "产品条码")]      public string BarCode { get; set; }    }

 

导入模板

 

 

 

 

Demo2-2 多数据类型

生成模板

 

 

public class ImportProductDto  {      /// <summary>      /// 产品名称      /// </summary>      [ImporterHeader(Name = "产品名称")]      public string Name { get; set; }      /// <summary>      /// 产品代码      /// </summary>      [ImporterHeader(Name = "产品代码")]      public string Code { get; set; }      /// <summary>      /// 产品条码      /// </summary>      [ImporterHeader(Name = "产品条码")]      public string BarCode { get; set; }      /// <summary>      /// 客户Id      /// </summary>      [ImporterHeader(Name = "客户代码")]      public long ClientId { get; set; }      /// <summary>      /// 产品型号      /// </summary>      [ImporterHeader(Name = "产品型号")]      public string Model { get; set; }      /// <summary>      /// 申报价值      /// </summary>      [ImporterHeader(Name = "申报价值")]      public double DeclareValue { get; set; }      /// <summary>      /// 货币单位      /// </summary>      [ImporterHeader(Name = "货币单位")]      public string CurrencyUnit { get; set; }      /// <summary>      /// 品牌名称      /// </summary>      [ImporterHeader(Name = "品牌名称")]      public string BrandName { get; set; }      /// <summary>      /// 尺寸      /// </summary>      [ImporterHeader(Name = "尺寸(长x宽x高)")]      public string Size { get; set; }      /// <summary>      /// 重量      /// </summary>      [ImporterHeader(Name = "重量(KG)")]      public double Weight { get; set; }        /// <summary>      /// 类型      /// </summary>      [ImporterHeader(Name = "类型")]      public ImporterProductType Type { get; set; }        /// <summary>      /// 是否行      /// </summary>      [ImporterHeader(Name = "是否行")]      public bool IsOk { get; set; }  }

 

public enum ImporterProductType  {      [Display(Name = "第一")]      One,      [Display(Name = "第二")]      Two    }


导入模板

 

 

 

 

Demo2-3 数据验证

生成模板

必填项表头文本为红色

public class ImportProductDto  {      /// <summary>      /// 产品名称      /// </summary>      [ImporterHeader(Name = "产品名称",Description ="必填")]      [Required(ErrorMessage = "产品名称是必填的")]      public string Name { get; set; }      /// <summary>      /// 产品代码      /// </summary>      [ImporterHeader(Name = "产品代码", Description = "最大长度为8")]      [MaxLength(8,ErrorMessage = "产品代码最大长度为8")]      public string Code { get; set; }      /// <summary>      /// 产品条码      /// </summary>      [ImporterHeader(Name = "产品条码")]      [MaxLength(10, ErrorMessage = "产品条码最大长度为10")]      [RegularExpression(@"^d*$", ErrorMessage = "产品条码只能是数字")]      public string BarCode { get; set; }      /// <summary>      /// 客户Id      /// </summary>      [ImporterHeader(Name = "客户代码")]      public long ClientId { get; set; }      /// <summary>      /// 产品型号      /// </summary>      [ImporterHeader(Name = "产品型号")]      public string Model { get; set; }      /// <summary>      /// 申报价值      /// </summary>      [ImporterHeader(Name = "申报价值")]      public double DeclareValue { get; set; }      /// <summary>      /// 货币单位      /// </summary>      [ImporterHeader(Name = "货币单位")]      public string CurrencyUnit { get; set; }      /// <summary>      /// 品牌名称      /// </summary>      [ImporterHeader(Name = "品牌名称")]      public string BrandName { get; set; }      /// <summary>      /// 尺寸      /// </summary>      [ImporterHeader(Name = "尺寸(长x宽x高)")]      public string Size { get; set; }      /// <summary>      /// 重量      /// </summary>      [ImporterHeader(Name = "重量(KG)")]      public double Weight { get; set; }        /// <summary>      /// 类型      /// </summary>      [ImporterHeader(Name = "类型")]      public ImporterProductType Type { get; set; }        /// <summary>      /// 是否行      /// </summary>      [ImporterHeader(Name = "是否行")]      public bool IsOk { get; set; }  }  public enum ImporterProductType  {      [Display(Name = "第一")]      One,      [Display(Name = "第二")]      Two    }

 

导入模板

 

 

Docker中使用

# 安装libgdiplus库,用于Excel导出  RUN apt-get update && apt-get install -y libgdiplus libc6-dev  RUN ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll

Dockerfile Demo

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base  # 安装libgdiplus库,用于Excel导出  RUN apt-get update && apt-get install -y libgdiplus libc6-dev  RUN ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll  WORKDIR /app  EXPOSE 80    FROM microsoft/dotnet:2.2-sdk AS build  WORKDIR /src  COPY ["src/web/Admin.Host/Admin.Host.csproj", "src/web/Admin.Host/"]  COPY ["src/web/Admin.Web.Core/Admin.Web.Core.csproj", "src/web/Admin.Web.Core/"]  COPY ["src/application/Admin.Application/Admin.Application.csproj", "src/application/Admin.Application/"]  COPY ["src/core/Magicodes.Admin.Core/Magicodes.Admin.Core.csproj", "src/core/Magicodes.Admin.Core/"]  COPY ["src/data/Magicodes.Admin.EntityFrameworkCore/Magicodes.Admin.EntityFrameworkCore.csproj", "src/data/Magicodes.Admin.EntityFrameworkCore/"]  COPY ["src/core/Magicodes.Admin.Core.Custom/Magicodes.Admin.Core.Custom.csproj", "src/core/Magicodes.Admin.Core.Custom/"]  COPY ["src/application/Admin.Application.Custom/Admin.Application.Custom.csproj", "src/application/Admin.Application.Custom/"]  RUN dotnet restore "src/web/Admin.Host/Admin.Host.csproj"  COPY . .  WORKDIR "/src/src/web/Admin.Host"  RUN dotnet build "Admin.Host.csproj" -c Release -o /app    FROM build AS publish  RUN dotnet publish "Admin.Host.csproj" -c Release -o /app    FROM base AS final  WORKDIR /app  COPY --from=publish /app .  ENTRYPOINT ["dotnet", "Magicodes.Admin.Web.Host.dll"]