Excel模板导出之动态导出

说明

目前Magicodes.IE已支持Excel模板导出时使用JObjectDictionaryExpandoObject来进行动态导出,具体使用请看本篇教程。

本功能的想法、部分实现初步源于arik的贡献,这里再次感谢arik!

在开始本篇教程之前,我们重温一下模板导出的语法:

   {{Company}}  //单元格渲染{{Table>>BookInfos|RowNo}} //表格渲染开始语法{{Remark|>>Table}}//表格渲染结束语法{{Image::ImageUrl?Width=50&Height=120&Alt=404}} //图片渲染{{Image::ImageUrl?w=50&h=120&Alt=404}} //图片渲染{{Image::ImageUrl?Alt=404}} //图片渲染{{Formula::AVERAGE?params=G4:G6}}  //公式渲染{{Formula::SUM?params=G4:G6&G4}}   //公式渲染

如果您对Magicodes.IE的模板导出不太了解,请阅读以下教程:

《Excel模板导出之导出教材订购表》

接下来,我们开始本篇教程:

1.安装包Magicodes.IE.Excel

Install-Package Magicodes.IE.Excel

2.准备Excel模板文件

参考如图:

该文件可以在测试工程中找到,文件名为【DynamicExportTpl.xlsx】。

3.使用JObject完成动态导出

代码比较简单,如下所示:

    string json = @"{'Company': '雪雁','Address': '湖南长沙','Contact': '雪雁','Tel': '136xxx','BookInfos': [{'No':'a1','RowNo':1,'Name':'Docker+Kubernetes应用开发与快速上云','EditorInChief':'李文强','PublishingHouse':'机械工业出版社','Price':65,'PurchaseQuantity':10000,'Cover':'https://img9.doubanio.com/view/ark_article_cover/retina/public/135025435.jpg?v=1585121965','Remark':'备注'},{'No':'a1','RowNo':1,'Name':'Docker+Kubernetes应用开发与快速上云','EditorInChief':'李文强','PublishingHouse':'机械工业出版社','Price':65,'PurchaseQuantity':10000,'Cover':'https://img9.doubanio.com/view/ark_article_cover/retina/public/135025435.jpg?v=1585121965','Remark':'备注'}]}";var jobj = JObject.Parse(json);//模板路径var tplPath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "ExportTemplates","DynamicExportTpl.xlsx");//创建Excel导出对象IExportFileByTemplate exporter = new ExcelExporter();//导出路径var filePath = Path.Combine(Directory.GetCurrentDirectory(), nameof(DynamicExportByTemplate_Test) + ".xlsx");if (File.Exists(filePath)) File.Delete(filePath);//根据模板导出await exporter.ExportByTemplate(filePath, jobj, tplPath);  

上述代码大家可以在单元测试DynamicExportWithJObjectByTemplate_Test中找到。

值得注意的是,由于此处使用了JObject对象,因此在使用时需要按装包Newtonsoft.Json。但是,Magicodes.IE.Excel本身并不依赖Newtonsoft.Json

目前Excel模板动态导出仅支持通过JObject对象,在后续将支持更多动态方式。

运行后可以看到如下图所示的结果:

4.使用Dictionary<string, object>完成动态导出

导出的代码和上面是一样的,只是数据结构使用了Dictionary

var data = new Dictionary<string, object>()
{{ "Company","雪雁" },{ "Address", "湖南长沙" },{ "Contact", "雪雁" },{ "Tel", "136xxx" },{ "BookInfos",new List<Dictionary<string,object>>(){new Dictionary<string, object>(){{"No","A1" },{"RowNo",1 },{"Name","Docker+Kubernetes应用开发与快速上云" },{"EditorInChief","李文强" },{"PublishingHouse","机械工业出版社" },{"Price",65 },{"PurchaseQuantity",50000 },{"Cover","https://img9.doubanio.com/view/ark_article_cover/retina/public/135025435.jpg?v=1585121965" },{"Remark","买起" }},new Dictionary<string, object>(){{"No","A2" },{"RowNo",2 },{"Name","Docker+Kubernetes应用开发与快速上云" },{"EditorInChief","李文强" },{"PublishingHouse","机械工业出版社" },{"Price",65 },{"PurchaseQuantity",50000 },{"Cover","https://img9.doubanio.com/view/ark_article_cover/retina/public/135025435.jpg?v=1585121965" },{"Remark","k8s真香" }}}}
};
//模板路径
var tplPath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "ExportTemplates","DynamicExportTpl.xlsx");
//创建Excel导出对象
IExportFileByTemplate exporter = new ExcelExporter();
//导出路径
var filePath = Path.Combine(Directory.GetCurrentDirectory(), nameof(DynamicExportWithDictionaryByTemplate_Test) + ".xlsx");
if (File.Exists(filePath)) File.Delete(filePath);//根据模板导出
await exporter.ExportByTemplate(filePath, data, tplPath);

具体代码见DynamicExportWithDictionaryByTemplate_Test

5.使用ExpandoObject完成动态导出

同上,代码如下所示:

dynamic data = new ExpandoObject();
data.Company = "雪雁";
data.Address = "湖南长沙";
data.Contact = "雪雁";
data.Tel = "136xxx";
data.BookInfos = new List<ExpandoObject>() { };dynamic book1 = new ExpandoObject();
book1.No = "A1";
book1.RowNo = 1;
book1.Name = "Docker+Kubernetes应用开发与快速上云";
book1.EditorInChief = "李文强";
book1.PublishingHouse = "机械工业出版社";
book1.Price = 65;
book1.PurchaseQuantity = 50000;
book1.Cover = "https://img9.doubanio.com/view/ark_article_cover/retina/public/135025435.jpg?v=1585121965";
book1.Remark = "买买买";
data.BookInfos.Add(book1);dynamic book2 = new ExpandoObject();
book2.No = "A2";
book2.RowNo = 2;
book2.Name = "Docker+Kubernetes应用开发与快速上云";
book2.EditorInChief = "李文强";
book2.PublishingHouse = "机械工业出版社";
book2.Price = 65;
book2.PurchaseQuantity = 50000;
book2.Cover = "https://img9.doubanio.com/view/ark_article_cover/retina/public/135025435.jpg?v=1585121965";
book2.Remark = "买买买";
data.BookInfos.Add(book2);//模板路径
var tplPath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "ExportTemplates","DynamicExportTpl.xlsx");
//创建Excel导出对象
IExportFileByTemplate exporter = new ExcelExporter();
//导出路径
var filePath = Path.Combine(Directory.GetCurrentDirectory(), nameof(DynamicExportWithExpandoObjectByTemplate_Test) + ".xlsx");
if (File.Exists(filePath)) File.Delete(filePath);//根据模板导出
await exporter.ExportByTemplate(filePath, data, tplPath);

具体代码参考DynamicExportWithExpandoObjectByTemplate_Test

最后

本教程至此就结束了,如有疑问,麻烦大家多多提交Issue。

Magicodes.IE:导入导出通用库,支持Dto导入导出、模板导出、花式导出以及动态导出,支持Excel、Csv、Word、Pdf和Html。

  • Github:

    https://github.com/dotnetcore/Magicodes.IE

  • 码云(手动同步,不维护):

    https://gitee.com/magicodes/Magicodes.IE

相关库会一直更新,在功能体验上有可能会和本文教程有细微的出入,请以相关具体代码、版本日志、单元测试示例为准。

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

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

相关文章

android textview动态设置,android – 如何动态设置文本到TextView?

我想在活动开始时显示连接的ssid和ip地址.它包含一个图像视图(用于标题,因为我没有使用操作栏)和4个文本视图(ssid标签,ssid值,ipaddr标签和ipaddr值)我已经测试了获取ssid和ipaddr的代码,但它们运行良好.问题是我无法将它们显示在TextView中.在此代码中,没有错误,但是当活动开…

简述原型模型的特点_3D打印硅胶复模手板的步骤和特点有哪些

硅胶手板是一种主要用于手板模制作的硅胶制品&#xff0c;手板硅胶主要要求&#xff1a;不缩水、不变形&#xff0c;硬度合适不太复杂的产品使用。硅胶手板经常用硅胶模具来制造为产品快速成型复制提供便利性&#xff0c;产品收缩率可达到千分之二&#xff0c;主要用于手板模型…

快速成长为数据挖掘高手的秘诀

随着大数据时代的到来&#xff0c;数据挖掘的重要性越发显著。所谓数据挖掘&#xff0c;一般是指从大型数据库中将隐藏的预测信息抽取出来的过程&#xff0c;而更为精确的解释就是“从数据中挖掘知识”。目前而言&#xff0c;数据挖掘大致分为四个层次&#xff1a;纯粹数据加工…

C#得到CPU的序列号、硬盘序列号、网卡序列号

//得到cpu信息 public static void GetCpuIndex() { string _cpuInfo ""; ManagementClass cimobject new ManagementClass("Win32_Processor"); ManagementObjectCollection moc cimobject.GetInstances(); …

ASP.NET Core 基于角色的 JWT 令牌

原文&#xff1a;https://bit.ly/3vYljq3作者&#xff1a;Rick Strahl翻译&#xff1a;精致码农-王亮声明&#xff1a;我翻译技术文章不是逐句翻译的&#xff0c;而是根据我自己的理解来表述的。其中可能会去除一些本人实在不知道如何组织但又不影响理解的句子。ASP.NET Core 中…

圆形比例分布图怎么做_解读宝山区2035总体规划:建设用地的比例在上海非中心城区中最高...

《上海市宝山区总体规划暨土地利用总体规划(2017-2035)》已经发布&#xff0c;在宝山区2035总体规划中&#xff0c;一个重要的核心指标成为了亮点&#xff0c;这就是宝山区的建设用地面积为244.3平方公里。宝山区的陆地总面积是301.6平方公里&#xff0c;由此宝山区建设用地面积…

截获android屏幕服务,如何捕获android设备屏幕内容?

使用以下代码&#xff1a;Bitmap bitmap;View v1 MyView.getRootView();v1.setDrawingCacheEnabled(true);bitmap Bitmap.createBitmap(v1.getDrawingCache());v1.setDrawingCacheEnabled(false);这MyView是View我们需要在屏幕中包含的内容。你也可以DrawingCache通过View这种…

Lanchester战争模型:用可分离变量的微分方程占卜战事

看过国产的战争题材电视剧《亮剑》的各位老铁一定熟悉李云龙集结重兵攻打县城的故事。在故事中&#xff0c;李云龙利用人数上的优势对平安县城进行了围点打援&#xff0c;最后用二营长的意大利炮消灭了城楼上的鬼子官。但是众所周知&#xff0c;抗日时期中国军队的单兵作战能力…

微软软件安装平台

http://www.microsoft.com/web/downloads/platform.aspx 转载于:https://www.cnblogs.com/kkun/archive/2011/03/09/1978039.html

如何在 C# 中使用 yield

yield关键词是在 C# 2.0 中被引入的&#xff0c;我们都知道实现了 IEnumerable 接口的类都可以用于被 foreach 迭代&#xff0c;这是因为 IEnumerable 接口中提供了一个可迭代的 GetEnumerator() 方法&#xff0c;代码定义如下&#xff1a;public interface IEnumerable{IEnume…

通过听力写代码?盲人程序员就是这样做的

一Michael Forzano&#xff0c;Amazon2018 年 3 月&#xff0c;Amazon 官网「工作在 Amazon」栏目有一篇文章&#xff0c;介绍了他们的一位盲人程序员 Michael Forzano。&#xff08;视频来自&#xff1a;阑夕&#xff09;Amazon 软件工程师 Michael Forzano 出生就因先天疾病而…

android修改电量颜色,android状态栏电池颜色?

鸿蒙传说/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java在Intent.ACTION_BATTERY_CHANGED broadcast处理中调用fireBatteryLevelChanged()方法fireBatteryLevelChanged中会回掉BatteryStateChangeCallbackframewor…

access 战地1不加入ea_炒牛肉时,想要牛肉嫩滑又不老,只需加入1样东西,很多人都不懂...

炒牛肉时&#xff0c;想要牛肉嫩滑又不老&#xff0c;只需加入1样东西&#xff0c;很多人都不懂冬季滋补怎么能少得了牛肉&#xff0c;牛肉中含有非常丰富的营养成分&#xff0c;其中蛋白质的含量尤为丰富还有大量的氨基酸&#xff0c;能够提高身体的抗病能力&#xff0c;特别适…

张亚勤:PC之外的争夺战

文 / 陈振烨 尽管经常有公司抢走微软的风头&#xff0c;但当今世界&#xff0c;微软仍然是当之无愧的IT霸主。过去几个季度&#xff0c;微软各项核心数据非常给力&#xff0c;2011财年第一季度净利润54亿美元&#xff0c;营收162亿美元&#xff1b;而2010财年187.6亿美元的净利…

优化 ASP.NET Core Docker 镜像的大小

在这容器化的世界里&#xff0c;我们已经很少直接通过文件发布来运行asp.net core程序了。现在大多数情况下&#xff0c;我们都会使用docker来运行程序。在使用docker之前&#xff0c;我们往往需要打包我们的应用程序。asp.net core程序的镜像打包&#xff0c;网上有很多教程&a…

监督学习:KNN(K-近邻)算法实现手写数字识别的三种方法

没人会看的开场白&#xff1a;本来觉得自己从数据建模转人工智能方向应该问题不大&#xff08;自我感觉自己算法学的不错&#xff09;。结果一个K-邻近实现手写数字识别的代码就让我改了三四天。虽然网上这方面的代码是很多&#xff0c;但是我运行了好几个&#xff0c;结果都不…

xp怎样安装android-studio,Xposed 框架的安装

借鉴&#xff1a;安装流程&#xff1a;安装 雷电模拟器3.93下载安装xposed框架。xposed 框架在Dalvik 虚拟机和ART虚拟机上的安装不一样(至于ART虚拟机和Dalvik虚拟机的区别&#xff0c;可以参阅 文章)如果Android 版本不小于 5.0&#xff0c;就是ART版本的虚拟机&#xff0c;需…

cta策略 有哪些_CTA 主流的交易策略都有哪些?

CTA策略(Commodity Trading Advisor Strategy)称为商品交易顾问策略&#xff0c;也称作管理期货。主要通过在基本和技术分析中导入数量模型&#xff0c;并借助计算机系统根据数量模型产生的买卖信号进行投资交易。CTA基金策略完全通过不同期货合约及调期合约多/空头寸进行投资&…

饭碗和大师

最近受到一些同事的质疑&#xff0c;说你老刘只关心市场销售&#xff0c;对做技术的同事漠不关心&#xff0c;因为你的博客里头就没有怎么提过&#xff01; 当然首先得向这写技术大师和小师们道歉&#xff01;其实老刘并非不关心做技术的同事&#xff0c;只是因为老刘自愧对…

在 .NET Core 5 中集成 Create React app

翻译自 Camilo Reyes 2021年2月22日的文章 《Integrate Create React app with .NET Core 5》 [1]本文演示了如何将 Create React app 与 .NET Core 集成&#xff0c;以生成一个移除了几个依赖项的脚手架。Create React app 是社区中创建一个全新 React 项目的首选方式。该工具…