​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 来配置数据模板的开始和结束以识别每一个数据对应的开始行和结束行

示例代码

示例配置

var setting = ExcelHelper.SettingFor<TestEntity>();
// ExcelSetting
setting.HasAuthor("WeihanLi").HasTitle("WeihanLi.Npoi test").HasDescription("WeihanLi.Npoi test").HasSubject("WeihanLi.Npoi test");
setting.HasSheetConfiguration(0, "SystemSettingsList", 1, true);
setting.Property(_ => _.SettingId).HasColumnIndex(0);
setting.Property(_ => _.SettingName).HasColumnTitle("SettingName").HasColumnIndex(1);
setting.Property(_ => _.DisplayName).HasOutputFormatter((entity, displayName) => $"AAA_{entity.SettingName}_{displayName}").HasInputFormatter((entity, originVal) => originVal.Split(new[] { '_' })[2]).HasColumnTitle("DisplayName").HasColumnIndex(2);
setting.Property(_ => _.SettingValue).HasColumnTitle("SettingValue").HasColumnIndex(3);
setting.Property(x => x.Enabled).HasColumnInputFormatter(val => "启用".Equals(val)).HasColumnOutputFormatter(v => v ? "启用" : "禁用");
setting.Property("HiddenProp").HasOutputFormatter((entity, val) => $"HiddenProp_{entity.PKID}");
setting.Property(_ => _.PKID).Ignored();
setting.Property(_ => _.UpdatedBy).Ignored();
setting.Property(_ => _.UpdatedTime).Ignored();

根据模板导出示例代码:

var entities = new List<TestEntity>()
{new TestEntity(){PKID = 1,SettingId = Guid.NewGuid(),SettingName = "Setting1",SettingValue = "Value1",DisplayName = "ddd1"},new TestEntity(){PKID=2,SettingId = Guid.NewGuid(),SettingName = "Setting2",SettingValue = "Value2",Enabled = true},
};
entities.ToExcelFileByTemplate(Path.Combine(ApplicationHelper.AppRoot, "Templates", "testTemplate.xlsx"),ApplicationHelper.MapPath("templateTestEntities.xlsx"),extraData: new{Author = "WeihanLi",Title = "导出结果"}
);

导出结果

More

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

public static int ToExcelFileByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, string templatePath, string excelPath, int sheetIndex = 0, object extraData = null);
public static int ToExcelFileByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, byte[] templateBytes, string excelPath, ExcelFormat excelFormat = ExcelFormat.Xls, int sheetIndex = 0, object extraData = null);
public static int ToExcelFileByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, IWorkbook templateWorkbook, string excelPath, int sheetIndex = 0, object extraData = null);
public static byte[] ToExcelBytesByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, string templatePath, int sheetIndex = 0, object extraData = null);
public static byte[] ToExcelBytesByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, byte[] templateBytes, ExcelFormat excelFormat = ExcelFormat.Xls, int sheetIndex = 0, object extraData = null);
public static byte[] ToExcelBytesByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, Stream templateStream, ExcelFormat excelFormat = ExcelFormat.Xls, int sheetIndex = 0, object extraData = null);
public static byte[] ToExcelBytesByTemplate<TEntity>([NotNull]this IEnumerable<TEntity> entities, IWorkbook templateWorkbook, int sheetIndex = 0, object extraData = null);
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UC浏览器如何开启html5,如何开启手机uc浏览器中的极速模式

如何开启手机uc浏览器中的极速模式当我们在使用手机的时候&#xff0c;可以下载uc浏览器来浏览网页&#xff0c;为了提升网页的浏览速度&#xff0c;可以开启浏览器中的极速模式&#xff0c;接下来就由小编来告诉大家如何操作。具体如下&#xff1a;1.第一步&#xff0c;打开手…

前端扫盲:什么是API网关?为什么它有用?

API 通常被称为应用程序从后端服务访问数据和业务逻辑的前门。API 本质上是一个软件向其他人或程序提供的接口&#xff0c;允许他们与该软件进行交互。 在创建 API 时&#xff0c;需要选择编程语言(Java、Python、PHP 等)来编写 API 逻辑&#xff0c;还需要将 API 部署到服务器…

AcWing 1381. 阶乘

转载地址&#xff1a; https://www.acwing.com/solution/content/31460/ N 的阶乘&#xff08;记作 N!&#xff09;是指从 1 到 N&#xff08;包括 1 和 N&#xff09;的所有整数的乘积。 阶乘运算的结果往往都非常的大。 现在&#xff0c;给定数字 N&#xff0c;请你求出 N…

ProjectFileManager 发布!项目文件管理效率提升10倍以上!

值此特别的新春假期&#xff0c;盛派网络在这里先祝大家新春安康&#xff01;鼠年平安、幸福、发财、万事如意&#xff01;也祝福疫区的同胞和医护人员平安度过这一段关键时期&#xff01;延长的假期显然也为我们日常工作带来了一些障碍&#xff0c;为了能够利用工具进一步提高…

简历中能熟练使用计算机怎么写,过了计算机二级,可以在简历里写“熟练掌握Excel”吗?...

原标题&#xff1a;过了计算机二级&#xff0c;可以在简历里写“熟练掌握Excel”吗&#xff1f;咨询/快消/互联网/四大/投行PEVC/券商绝大多数岗位都会要求“熟练掌握Excel”而尽管绝大多数同学“实际水平根本达不到工作要求”但是每一位同学都敢在简历上放一句薛定谔的「熟练掌…

C++手写a除以b的正余数

我们对a模b要用(a%bb)%b的形式&#xff0c;是因为C中的%与数学上的取模不太一样&#xff0c;举个例子&#xff1a; 1.C&#xff1a;-2%3 -2&#xff0c;出现了负数&#xff0c;在数组中a[i]&#xff0c;i不能为负&#xff0c;因此要转换。 2.数学上&#xff1a;-2%3 1 所以…

.Net Core 认证系统之基于Identity Server4 Token的JwtToken认证源码解析

介绍JwtToken认证之前,必须要掌握.Net Core认证系统的核心原理,如果你还不了解,请参考.Net Core 认证组件源码解析,且必须对jwt有基本的了解,如果不知道,请百度.最重要的是你还需要掌握identity server4的基本用法,关于identity server4因为涉及到两个协议Oath2.0和openid conn…

在线进位制计算机,计算机基础知识进位计数制.pdf

教学对象 1901、1902 运营班 教学时间 2019 年 4 月 9 日第一单元 计算机基础知识教学内容任务二 进位计数制1、掌握不同数制的表示方式。知识目标2、不同进制之间的转换1、了解计算机中采取二进制的原因能力目标 2、二进制、八进制、十六进制、十进制之间的转换3、二进制数据的…

【C# 调用 Go 语言】0x2 参数、返回值与类型转换

在上篇文章【C# 调用 Go 语言】0x1 Hello Golang 中&#xff0c;我们将 Golang 源码编译为动态链接库&#xff08;dll&#xff09;&#xff0c;用 C# 调用 Golang 导出的方法并成功的看到了控制台的输出。本篇文章将对 C# 调用 Golang 方法做更详细的介绍&#xff0c;涉及如何…

AcWing 1214. 波动数列

观察这个数列&#xff1a; 1 3 0 2 -1 1 -2 … 这个数列中后一项总是比前一项增加2或者减少3&#xff0c;且每一项都为整数。 栋栋对这种数列很好奇&#xff0c;他想知道长度为 n 和为 s 而且后一项总是比前一项增加 a 或者减少 b 的整数数列可能有多少种呢&#xff1f; 输入格…

单链表式并查集应用举例

给定一个长度为 N 的数组 A[A1,A2,⋅⋅⋅AN]&#xff0c;数组中有可能有重复出现的整数。 现在小明要按以下方法将其修改为没有重复整数的数组。 小明会依次修改 A2,A3,⋅⋅⋅,AN。 当修改 Ai 时&#xff0c;小明会检查 Ai 是否在 A1∼Ai−1 中出现过。 如果出现过&#xff0c;…

《ASP.NET Core 微服务实战》-- 读书笔记(第1章 、第2章)

译者序微服务设计方法清晰定义了各个开发团队的业务边界&#xff0c;微服务框架以不同方式实现了服务之间的协作与集成。.NET Core 作为全新的 .NET 技术&#xff0c;它不仅完全开源、跨平台&#xff0c;更面向云原生开发进行了大量细致的优化。它完全模块化&#xff0c;不依赖…

html缩进标签quote,HTML blockquote 标签

HTML 标签标签同样是对文本进行引用&#xff0c;不同的是该标签引用的是长文本。标签内的内容会自动有缩进。实例定义一个摘自另一个源的块引用&#xff1a;For 50 years, WWF has been protecting the future of nature. The worlds leading conservation organization, WWF w…

大学计算机基础英语翻译,大学计算机基础 教学课件 978 7 302 21247 8 第7章 常用工具软件.pdf...

第7章 常用工具软件7.1 文件压缩工具——WinRAR7.2 图片浏览工具——ACDSee7.3 常用杀毒工具——RISING7.4 硬盘备份工具——Ghost7.5 翻译工具——金山词霸7.6 迅雷下载工具——Thunder《大学计算机基础》 第7章 常用工具软件 第1页7.1 文件压缩工具——WinRARWinRAR是32位W…

AcWing 1047. 糖果

由于在维护世界和平的事务中做出巨大贡献&#xff0c;Dzx被赠予糖果公司2010年5月23日当天无限量糖果免费优惠券。 在这一天&#xff0c;Dzx可以从糖果公司的 N 件产品中任意选择若干件带回家享用。 糖果公司的 N 件产品每件都包含数量不同的糖果。 Dzx希望他选择的产品包含的糖…

使用BeetleX.NetBenchmark压测TCP,HTTP和Websocket服务

真没想到大过年还在家里写代码写文章&#xff0c;本来还打算自驾半个月没想出现这情况。在这里祝福全国同胞在新的一年里身体健康&#xff01;希望阳光天气早日照射在这片土地上&#xff0c;给人带来新一年的希望&#xff01;NetBenchmark是针对网络服务压测的开源组件&#xf…

HTML怎么去除数组的重复元素,js去除数组中重复元素并排序

/p>"http://www.w3.org/TR/html4/strict.dtd">003_obj//去掉数组中重复的元素var arr[1,2,2,3,3,5,5,1,2,4,7,8,96,3,5,2,1,4,5];//解析步骤//1.把数组转换成一个JS对象//2.把数组中的值变成JS对象中的Key//3.把这个对象再还原成数组//将数组转换成对象functio…

AcWing 1234. 倍数问题

众所周知&#xff0c;小葱同学擅长计算&#xff0c;尤其擅长计算一个数是否是另外一个数的倍数。 但小葱只擅长两个数的情况&#xff0c;当有很多个数之后就会比较苦恼。 现在小葱给了你 n 个数&#xff0c;希望你从这 n 个数中找到三个数&#xff0c;使得这三个数的和是 K 的倍…

如何使用Serilog.AspNetCore记录ASP.NET Core3.0的MVC属性

这是Serilog系列的第三篇文章。第1部分-如何利用Serilog的RequestLogging来精简ASP.NET Core的日志输出第2部分-Serilog高级玩法之用Serilog记录所选终结点附加属性第3部分-使用Serilog.AspNetCore记录MVC属性&#xff08;本文&#xff09;第4部分-从Serilog请求记录中排除运行…

广东省计算机媒体大赛,广东省大学生计算机设计大赛

广东省大学生计算机设计大赛由广东省教育厅主办。比赛宗旨为进一步提高广东省高校计算机教学和信息技术与学科深度融合的水平&#xff0c;激发省内各高校各专业大学生学习计算机知识和技能的兴趣和潜能&#xff0c;提升大学生运用信息技术解决实际问题的综合实践能力&#xff0…