大数跨境
0
0

​WeihanLi.Npoi 根据模板导出Excel

​WeihanLi.Npoi 根据模板导出Excel amazingdotnet
2020-01-28
0
导读:使用 WeihanLi.Npoi 实现根据模板导出 Excel

WeihanLi.Npoi 根据模板导出Excel

Intro

原来的导出方式比较适用于比较简单的导出,每一条数据在一行,数据列虽然自定义程度比较高,如果要一条数据对应多行就做不到了,于是就想支持根据模板导出,在 1.8.0 版本中引入了根据模板导出的功能

使用示例

示例模板

模板规划的可以有三种数据:

  • Global:一个是导出的时候可以指定一些参数,作为 Global 参数,默认参数格式使用: $(Global:PropName) 的格式

  • Header:配置的对应属性的显示名称,默认是属性名称,默认参数格式: $(Header:PropName)

  • Data:对应数据的属性值,默认参数格式: $(Data:PropName)

默认模板参数格式(从 1.8.2 版本开始支持通过 TemplateHelper.ConfigureTemplateOptions 方法来自定义):

  • Global 参数: $(Global:{0})

  • Header 参数: $(Header:{0})

  • Data 参数: $(Data:{0})

  • Data Begin: <Data>

  • Data End: </Data>

模板规范:

模板需要通过 Data Begin 和 Data End 来配置数据模板的开始和结束以识别每一个数据对应的开始行和结束行

示例代码

示例配置

 
  1. var setting = ExcelHelper.SettingFor<TestEntity>();

  2. // ExcelSetting

  3. setting.HasAuthor("WeihanLi")

  4. .HasTitle("WeihanLi.Npoi test")

  5. .HasDescription("WeihanLi.Npoi test")

  6. .HasSubject("WeihanLi.Npoi test");


  7. setting.HasSheetConfiguration(0, "SystemSettingsList", 1, true);


  8. setting.Property(_ => _.SettingId)

  9. .HasColumnIndex(0);


  10. setting.Property(_ => _.SettingName)

  11. .HasColumnTitle("SettingName")

  12. .HasColumnIndex(1);


  13. setting.Property(_ => _.DisplayName)

  14. .HasOutputFormatter((entity, displayName) => $"AAA_{entity.SettingName}_{displayName}")

  15. .HasInputFormatter((entity, originVal) => originVal.Split(new[] { '_' })[2])

  16. .HasColumnTitle("DisplayName")

  17. .HasColumnIndex(2);


  18. setting.Property(_ => _.SettingValue)

  19. .HasColumnTitle("SettingValue")

  20. .HasColumnIndex(3);


  21. setting.Property(x => x.Enabled)

  22. .HasColumnInputFormatter(val => "启用".Equals(val))

  23. .HasColumnOutputFormatter(v => v ? "启用" : "禁用");


  24. setting.Property("HiddenProp")

  25. .HasOutputFormatter((entity, val) => $"HiddenProp_{entity.PKID}");


  26. setting.Property(_ => _.PKID).Ignored();

  27. setting.Property(_ => _.UpdatedBy).Ignored();

  28. setting.Property(_ => _.UpdatedTime).Ignored();

根据模板导出示例代码:

 
  1. var entities = new List<TestEntity>()

  2. {

  3. new TestEntity()

  4. {

  5. PKID = 1,

  6. SettingId = Guid.NewGuid(),

  7. SettingName = "Setting1",

  8. SettingValue = "Value1",

  9. DisplayName = "ddd1"

  10. },

  11. new TestEntity()

  12. {

  13. PKID=2,

  14. SettingId = Guid.NewGuid(),

  15. SettingName = "Setting2",

  16. SettingValue = "Value2",

  17. Enabled = true

  18. },

  19. };

  20. entities.ToExcelFileByTemplate(

  21. Path.Combine(ApplicationHelper.AppRoot, "Templates", "testTemplate.xlsx"),

  22. ApplicationHelper.MapPath("templateTestEntities.xlsx"),

  23. extraData: new

  24. {

  25. Author = "WeihanLi",

  26. Title = "导出结果"

  27. }

  28. );

导出结果

More

为了方便使用,增加了一些方便的扩展方法:

 
  1. public static int ToExcelFileByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, string templatePath, string excelPath, int sheetIndex = 0, object extraData = null);


  2. public static int ToExcelFileByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, byte[] templateBytes, string excelPath, ExcelFormat excelFormat = ExcelFormat.Xls, int sheetIndex = 0, object extraData = null);


  3. public static int ToExcelFileByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, IWorkbook templateWorkbook, string excelPath, int sheetIndex = 0, object extraData = null);


  4. public static byte[] ToExcelBytesByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, string templatePath, int sheetIndex = 0, object extraData = null);


  5. public static byte[] ToExcelBytesByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, byte[] templateBytes, ExcelFormat excelFormat = ExcelFormat.Xls, int sheetIndex = 0, object extraData = null);


  6. public static byte[] ToExcelBytesByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, Stream templateStream, ExcelFormat excelFormat = ExcelFormat.Xls, int sheetIndex = 0, object extraData = null);


  7. public static byte[] ToExcelBytesByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, IWorkbook templateWorkbook, int sheetIndex = 0, object extraData = null);


  8. public static byte[] ToExcelBytesByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, ISheet templateSheet, object extraData = null);

Reference

  • https://github.com/WeihanLi/WeihanLi.Npoi

  • https://github.com/WeihanLi/WeihanLi.Npoi/blob/917e8fb798e9cbae52d121a7d593e37639870911/samples/DotNetCoreSample/Program.cs#L94


【声明】内容源于网络
0
0
amazingdotnet
dotnet 开发知识库,了不起的 dotnet,dotnet 奇淫怪巧
内容 539
粉丝 0
amazingdotnet dotnet 开发知识库,了不起的 dotnet,dotnet 奇淫怪巧
总阅读475
粉丝0
内容539