导入导出通用库

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

普通导出

  1. public class ExportTestData
  2. {
  3. public string Name1 { get; set; }
  4. public string Name2 { get; set; }
  5. public string Name3 { get; set; }
  6. public string Name4 { get; set; }
  7. }
  8.  
  9. var result = await Exporter.Export(filePath, new List<ExportTestData>()
  10. {
  11. new ExportTestData()
  12. {
  13. Name1 = "",
  14. Name2 = "test",
  15. Name3 = "",
  16. Name4 = "",
  17. },
  18. new ExportTestData()
  19. {
  20. Name1 = "",
  21. Name2 = "test",
  22. Name3 = "",
  23. Name4 = "",
  24. }
  25. });
  1.  

Demo1-2

特性导出

  1. [ExcelExporter(Name = "测试", TableStyle = "Light10")]public class ExportTestDataWithAttrs
  2. {
  3. [ExporterHeader(DisplayName = "加粗文本", IsBold = true)]
  4. public string Text { get; set; }
  5.  
  6. [ExporterHeader(DisplayName = "普通文本")]
  7. public string Text2 { get; set; }
  8.  
  9. [ExporterHeader(DisplayName = "忽略", IsIgnore = true)]
  10. public string Text3 { get; set; }
  11.  
  12. [ExporterHeader(DisplayName = "数值", Format = "#,##0")]
  13. public double Number { get; set; }
  14.  
  15. [ExporterHeader(DisplayName = "名称", IsAutoFit = true)]
  16. public string Name { get; set; }
  17. }
  18. var result = await Exporter.Export(filePath, new List<ExportTestDataWithAttrs>()
  19. {
  20. new ExportTestDataWithAttrs()
  21. {
  22. Text = "啊实打实大苏打撒",
  23. Name="aa",
  24. Number =,
  25. Text2 = "w萨达萨达萨达撒",
  26. Text3 = "sadsad打发打发士大夫的"
  27. },
  28. new ExportTestDataWithAttrs()
  29. {
  30. Text = "啊实打实大苏打撒",
  31. Name="啊实打实大苏打撒",
  32. Number =,
  33. Text2 = "w萨达萨达萨达撒",
  34. Text3 = "sadsad打发打发士大夫的"
  35. },
  36. new ExportTestDataWithAttrs()
  37. {
  38. Text = "啊实打实速度大苏打撒",
  39. Name="萨达萨达",
  40. Number =,
  41. Text2 = "突然他也让他人",
  42. Text3 = "sadsad打发打发士大夫的"
  43. },
  44.  
  45. });
  1.  

Demo1-3

列头处理或者多语言支持

  1. [ExcelExporter(Name = "测试", TableStyle = "Light10")]
  2. public class AttrsLocalizationTestData
  3. {
  4. [ExporterHeader(DisplayName = "加粗文本", IsBold = true)]
  5. public string Text { get; set; }
  6.  
  7. [ExporterHeader(DisplayName = "普通文本")]
  8. public string Text2 { get; set; }
  9.  
  10. [ExporterHeader(DisplayName = "忽略", IsIgnore = true)]
  11. public string Text3 { get; set; }
  12.  
  13. [ExporterHeader(DisplayName = "数值", Format = "#,##0")]
  14. public double Number { get; set; }
  15.  
  16. [ExporterHeader(DisplayName = "名称", IsAutoFit = true)]
  17. public string Name { get; set; }
  18. }
  19. ExcelBuilder.Create().WithLocalStringFunc((key) =>
  20. {
  21. if (key.Contains("文本"))
  22. {
  23. return "Text";
  24. }
  25. return "未知语言";
  26. }).Build();
  27.  
  28. var filePath = Path.Combine(Directory.GetCurrentDirectory(), "testAttrsLocalization.xlsx");
  29. if (File.Exists(filePath)) File.Delete(filePath);
  30.  
  31. var result = await Exporter.Export(filePath, new List<AttrsLocalizationTestData>()
  32. {
  33. new AttrsLocalizationTestData()
  34. {
  35. Text = "啊实打实大苏打撒",
  36. Name="aa",
  37. Number =,
  38. Text2 = "w萨达萨达萨达撒",
  39. Text3 = "sadsad打发打发士大夫的"
  40. },
  41. new AttrsLocalizationTestData()
  42. {
  43. Text = "啊实打实大苏打撒",
  44. Name="啊实打实大苏打撒",
  45. Number =,
  46. Text2 = "w萨达萨达萨达撒",
  47. Text3 = "sadsad打发打发士大夫的"
  48. },
  49. new AttrsLocalizationTestData()
  50. {
  51. Text = "啊实打实速度大苏打撒",
  52. Name="萨达萨达",
  53. Number =,
  54. Text2 = "突然他也让他人",
  55. Text3 = "sadsad打发打发士大夫的"
  56. },
  57.  
  58. });

导入 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 普通模板

生成模板

  1. public class ImportProductDto
  2. {
  3. /// <summary>
  4. /// 产品名称
  5. /// </summary>
  6. [ImporterHeader(Name = "产品名称")]
  7. public string Name { get; set; }
  8. /// <summary>
  9. /// 产品代码
  10. /// </summary>
  11. [ImporterHeader(Name = "产品代码")]
  12. public string Code { get; set; }
  13. /// <summary>
  14. /// 产品条码
  15. /// </summary>
  16. [ImporterHeader(Name = "产品条码")]
  17. public string BarCode { get; set; }
  18.  
  19. }

导入模板

Demo2-2 多数据类型

生成模板

  1. public class ImportProductDto
  2. {
  3. /// <summary>
  4. /// 产品名称
  5. /// </summary>
  6. [ImporterHeader(Name = "产品名称")]
  7. public string Name { get; set; }
  8. /// <summary>
  9. /// 产品代码
  10. /// </summary>
  11. [ImporterHeader(Name = "产品代码")]
  12. public string Code { get; set; }
  13. /// <summary>
  14. /// 产品条码
  15. /// </summary>
  16. [ImporterHeader(Name = "产品条码")]
  17. public string BarCode { get; set; }
  18. /// <summary>
  19. /// 客户Id
  20. /// </summary>
  21. [ImporterHeader(Name = "客户代码")]
  22. public long ClientId { get; set; }
  23. /// <summary>
  24. /// 产品型号
  25. /// </summary>
  26. [ImporterHeader(Name = "产品型号")]
  27. public string Model { get; set; }
  28. /// <summary>
  29. /// 申报价值
  30. /// </summary>
  31. [ImporterHeader(Name = "申报价值")]
  32. public double DeclareValue { get; set; }
  33. /// <summary>
  34. /// 货币单位
  35. /// </summary>
  36. [ImporterHeader(Name = "货币单位")]
  37. public string CurrencyUnit { get; set; }
  38. /// <summary>
  39. /// 品牌名称
  40. /// </summary>
  41. [ImporterHeader(Name = "品牌名称")]
  42. public string BrandName { get; set; }
  43. /// <summary>
  44. /// 尺寸
  45. /// </summary>
  46. [ImporterHeader(Name = "尺寸(长x宽x高)")]
  47. public string Size { get; set; }
  48. /// <summary>
  49. /// 重量
  50. /// </summary>
  51. [ImporterHeader(Name = "重量(KG)")]
  52. public double Weight { get; set; }
  53.  
  54. /// <summary>
  55. /// 类型
  56. /// </summary>
  57. [ImporterHeader(Name = "类型")]
  58. public ImporterProductType Type { get; set; }
  59.  
  60. /// <summary>
  61. /// 是否行
  62. /// </summary>
  63. [ImporterHeader(Name = "是否行")]
  64. public bool IsOk { get; set; }
  65. }
  1. public enum ImporterProductType
  2. {
  3. [Display(Name = "第一")]
  4. One,
  5. [Display(Name = "第二")]
  6. Two
  7.  
  8. }

导入模板

Demo2-3 数据验证

生成模板

必填项表头文本为红色

  1. public class ImportProductDto
  2. {
  3. /// <summary>
  4. /// 产品名称
  5. /// </summary>
  6. [ImporterHeader(Name = "产品名称",Description ="必填")]
  7. [Required(ErrorMessage = "产品名称是必填的")]
  8. public string Name { get; set; }
  9. /// <summary>
  10. /// 产品代码
  11. /// </summary>
  12. [ImporterHeader(Name = "产品代码", Description = "最大长度为8")]
  13. [MaxLength(,ErrorMessage = "产品代码最大长度为8")]
  14. public string Code { get; set; }
  15. /// <summary>
  16. /// 产品条码
  17. /// </summary>
  18. [ImporterHeader(Name = "产品条码")]
  19. [MaxLength(, ErrorMessage = "产品条码最大长度为10")]
  20. [RegularExpression(@"^\d*$", ErrorMessage = "产品条码只能是数字")]
  21. public string BarCode { get; set; }
  22. /// <summary>
  23. /// 客户Id
  24. /// </summary>
  25. [ImporterHeader(Name = "客户代码")]
  26. public long ClientId { get; set; }
  27. /// <summary>
  28. /// 产品型号
  29. /// </summary>
  30. [ImporterHeader(Name = "产品型号")]
  31. public string Model { get; set; }
  32. /// <summary>
  33. /// 申报价值
  34. /// </summary>
  35. [ImporterHeader(Name = "申报价值")]
  36. public double DeclareValue { get; set; }
  37. /// <summary>
  38. /// 货币单位
  39. /// </summary>
  40. [ImporterHeader(Name = "货币单位")]
  41. public string CurrencyUnit { get; set; }
  42. /// <summary>
  43. /// 品牌名称
  44. /// </summary>
  45. [ImporterHeader(Name = "品牌名称")]
  46. public string BrandName { get; set; }
  47. /// <summary>
  48. /// 尺寸
  49. /// </summary>
  50. [ImporterHeader(Name = "尺寸(长x宽x高)")]
  51. public string Size { get; set; }
  52. /// <summary>
  53. /// 重量
  54. /// </summary>
  55. [ImporterHeader(Name = "重量(KG)")]
  56. public double Weight { get; set; }
  57.  
  58. /// <summary>
  59. /// 类型
  60. /// </summary>
  61. [ImporterHeader(Name = "类型")]
  62. public ImporterProductType Type { get; set; }
  63.  
  64. /// <summary>
  65. /// 是否行
  66. /// </summary>
  67. [ImporterHeader(Name = "是否行")]
  68. public bool IsOk { get; set; }
  69. }
  70. public enum ImporterProductType
  71. {
  72. [Display(Name = "第一")]
  73. One,
  74. [Display(Name = "第二")]
  75. Two
  76.  
  77. }

导入模板

Docker中使用

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

Dockerfile Demo

  1. FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
  2. # 安装libgdiplus库,用于Excel导出
  3. RUN apt-get update && apt-get install -y libgdiplus libc6-dev
  4. RUN ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
  5. WORKDIR /app
  6. EXPOSE
  7.  
  8. FROM microsoft/dotnet:2.2-sdk AS build
  9. WORKDIR /src
  10. COPY ["src/web/Admin.Host/Admin.Host.csproj", "src/web/Admin.Host/"]
  11. COPY ["src/web/Admin.Web.Core/Admin.Web.Core.csproj", "src/web/Admin.Web.Core/"]
  12. COPY ["src/application/Admin.Application/Admin.Application.csproj", "src/application/Admin.Application/"]
  13. COPY ["src/core/Magicodes.Admin.Core/Magicodes.Admin.Core.csproj", "src/core/Magicodes.Admin.Core/"]
  14. COPY ["src/data/Magicodes.Admin.EntityFrameworkCore/Magicodes.Admin.EntityFrameworkCore.csproj", "src/data/Magicodes.Admin.EntityFrameworkCore/"]
  15. COPY ["src/core/Magicodes.Admin.Core.Custom/Magicodes.Admin.Core.Custom.csproj", "src/core/Magicodes.Admin.Core.Custom/"]
  16. COPY ["src/application/Admin.Application.Custom/Admin.Application.Custom.csproj", "src/application/Admin.Application.Custom/"]
  17. RUN dotnet restore "src/web/Admin.Host/Admin.Host.csproj"
  18. COPY . .
  19. WORKDIR "/src/src/web/Admin.Host"
  20. RUN dotnet build "Admin.Host.csproj" -c Release -o /app
  21.  
  22. FROM build AS publish
  23. RUN dotnet publish "Admin.Host.csproj" -c Release -o /app
  24.  
  25. FROM base AS final
  26. WORKDIR /app
  27. COPY --from=publish /app .
  28. ENTRYPOINT ["dotnet", "Magicodes.Admin.Web.Host.dll"]

开源导入导出通用库Magicodes.ExporterAndImporter发布的更多相关文章

  1. ASP.NET 开源导入导出库Magicodes.IE 完成Excel图片导入导出

    Magicodes.IE Excel图片导入导出 为了更好的根据实际功能来迭代,从2.2的里程碑规划开始,我们将结合社区的建议和意见来进行迭代,您可以点此链接来提交您的意见和建议: https://g ...

  2. ASP.NET 开源导入导出库Magicodes.IE 完成Csv导入导出

    Magicodes.IE Csv导入导出 说明 本章主要说明如何使用Magicodes.IE.Csv进行Csv导入导出. 主要步骤 1.安装包Magicodes.IE.Csv Install-Pack ...

  3. ASP.NET 开源导入导出库Magicodes.IE 多Sheet导入教程

    多Sheet导入教程 说明 本教程主要说明如何使用Magicodes.IE.Excel完成多个Sheet数据的Excel导入. 要点 多个相同格式的Sheet数据导入 多个不同格式的Sheet数据导入 ...

  4. 开源导入导出库Magicodes.IE 多sheet导入教程

    原文作者:tanyongzheng 多Sheet导入教程 说明 本教程主要说明如何使用Magicodes.IE.Excel完成多个Sheet数据的Excel导入. 要点 多个相同格式的Sheet数据导 ...

  5. .NET 开源导入导出库 Magicodes.IE 2.5发布

    今天我们发布了2.5版本,这当然也离不开大家对Magicodes.IE的支持,今天我也是跟往常一样列举了该版本一些重要的更新内容. 当然也要说一下,在这个版本中我们设计了全新的LOGO Excel导出 ...

  6. Magicodes.IE 2.3重磅发布——.NET Core开源导入导出库

    在2.3这一版本的更新中,我们迎来了众多的使用者.贡献者,在这个里程碑中我们也添加并修复了一些功能.对于新特点的功能我将在下面进行详细的描述,当然也欢迎更多的人可以加入进来,再或者也很期待大家来提is ...

  7. .NET Core开源导入导出库 Magicodes.IE 2.3发布

    在2.3这一版本的更新中,我们迎来了众多的使用者.贡献者,在这个里程碑中我们也添加并修复了一些功能.对于新特点的功能我将在下面进行详细的描述,当然也欢迎更多的人可以加入进来,再或者也很期待大家来提is ...

  8. 开源导入导出库Magicodes.IE 导出教程

    要点 导出特性 如何导出Excel表头 如何导出数据.如何进行数据的切割.如何使用筛选器 导出特性 ExporterAttribute Name: 名称(当前Sheet 名称) HeaderFontS ...

  9. ASP.NET 开源导入导出库Magicodes.IE 导出Pdf教程

    基础教程之导出Pdf收据 说明 本教程主要说明如何使用Magicodes.IE.Pdf完成Pdf收据导出 要点 导出PDF数据 自定义PDF模板 导出单据 如何批量导出单据 导出特性 PdfExpor ...

随机推荐

  1. vscode导入已存在的vue.js工程

    1.安装vue_cli 如果安装了npm,直接在命令行输入npm install -g vue-cli,安装在全局组件目录下 完成后,可以在命令测试下 2.导入工程 打开vscode-------&g ...

  2. 洛谷 P3628 [APIO2010]特别行动队

    题意简述 将n个士兵分为若干组,每组连续,编号为i的士兵战斗力为xi 若i~j士兵为一组,该组初始战斗力为\( s = \sum\limits_{k = i}^{j}xk \),实际战斗力\(a * ...

  3. 【Python3爬虫】爬取美女图新姿势--Redis分布式爬虫初体验

    一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...

  4. python历史背诵

    一.python简介 python2:源代码不统一 有重复功能的代码 默认编码是ascii 没有中文 输出中文需要用头文件 #-*-coding=utf-8-*- 进行转换 py3:源代码统一 没有重 ...

  5. 完美解决迅雷极速版强制升级到迅雷X

    虽然迅雷已死,但是还是软件还是有点点用的.废话不好多说,直接上解决办法: 1. 找到桌面的迅雷图标,右键选择打开文件位置; 2. 根据路径找到: 相对路径:Thunder Network\Thunde ...

  6. mysql 显示表名和表数量

    SELECT count(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA='dbname'; SELECT * FROM informatio ...

  7. 使用Makefile构建Docker

    使用Makefile构建Docker 刚开始学习docker命令的时候,很喜欢一个字一个字敲,因为这样会记住命令.后来熟悉了之后,每次想要做一些操作的时候就不得不 重复的输入以前的命令.当切换一个项目 ...

  8. 18_init 函数的使用

    1.init()函数是一个内置函数,在程序执行前会先执行init()函数,及在main()函数执行前执行 2.如果调用包里有init()函数,会先执行调用包的init()函数,在这执行本函数的init ...

  9. Web前端安全分析

    随着互联网高速的发展,信息安全已经成为企业重点关注焦点之一,而前端又是引发安全问题的高危据点,所以,作为一个前端开发人员,需要了解前端的安全问题,以及如何去预防.修复安全漏洞. 一.XSSS攻击 1. ...

  10. Jmeter 从数据库查询多个字段,依次传给登录接口怎么实现?

    问题背景: 博文“Jmeter 如何把数据库的数据依次获取作为参数传入下一个请求?附栗子”某天有人留言如下: 看了下当时写的文章,如果从数据库查询多个字段,依次传给登录接口,确实不能合理实现,所以,特 ...