分享一个导出数据到 Excel 的解决方案

news2024/12/26 15:44:34

image

前言

许多业务场景下需要处理和分析大量的数据,而 Excel 是广泛使用的文件格式,几乎所有人都能打开和查看 Excel 文件,因此将数据库中的原始数据处理后,导出到 Excel 是一个很常见的功能,对于数据管理、分析、备份、展示以及与外部系统集成等方面都具有重要的作用。

之前分享了如何使用 Magicodes.IE.Excel 上传和读取 Excel的方案(请参考前文《分享一个 ASP.NET Web Api 上传和读取 Excel 的方案》),今天继续分享如何使用 Magicodes.IE.Excel 导出 Excel 到模板的方案。

Step By Step 步骤

  1. 创建一个 .NET Console 项目

  2. 安装以下 Nuget 包

    Magicodes.IE.Excel

  3. 新建一个 ExcelUtil.cs,写导出到 Excel 到模板的方法,留意注释

    using Magicodes.ExporterAndImporter.Core.Models;
    using Magicodes.ExporterAndImporter.Core;
    using Magicodes.ExporterAndImporter.Excel;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MRHelper.Utils
    {
    	public static class ExcelUtil
    	{
    		/// <summary>
    		/// 根据模板导出到excel
    		/// </summary>
    		/// <typeparam name="T"></typeparam>
    		/// <param name="templateModel">要导出的数据</param>
    		/// <param name="savePath">保存目录</param>
    		/// <param name="fileName">保存文件名称</param>
    		/// <param name="templatePath">Excel 模板</param>
    		/// <returns></returns>
    		public static async Task<string> ExportExcelByTemplate<T>(T templateModel, string savePath, string fileName, string templatePath) where T : class, new()
    		{
    			IExportFileByTemplate exporter = new ExcelExporter();
    			
    			// 如果保存目录不存在,则新建
    			if (!Directory.Exists(savePath))
    			{
    				Directory.CreateDirectory(savePath);
    			}
    			
    			// 如果要导出的文件名已经存在,先删除
    			var filePath = savePath + fileName;
    			if (File.Exists(filePath)) File.Delete(filePath);
    			
    			// 导出数据
    			await exporter.ExportByTemplate(filePath, templateModel, templatePath);
    			
    			return filePath;
    		}
    	}
    }
    
  4. 写一个数据实体类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MRHelper.Entity
    {
    	/// <summary>
    	/// 数据实体
    	/// </summary>
    	public class ZqReportEntity
    	{
    		/// <summary>
    		/// 类型
    		/// </summary>
    		public string ChannelType { get; set; }
    
    		/// <summary>
    		/// 编码
    		/// </summary>
    		public string ChannelCode { get; set; }
    
    		/// <summary>
    		/// 账户
    		/// </summary>
    		public string AccountNature { get; set; }
    
    		/// <summary>
    		/// 金额
    		/// </summary>
    		public decimal Cash { get; set; }
    
    		/// <summary>
    		/// 冻结原因
    		/// </summary>
    		public string FreezeReason { get; set; }
    	}
    }
    
  5. 新建一个 Excel 导出 DTO 类,留意注释

    using MRHelper.Entity;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MRHelper.ExcelExportDTO
    {
    	// 可以在这个 Dto 类中,对数据作进一步处理,比如添加报表制作人等等属性
    	public class ZqReportExportDto
    	{
    		// 说明:
    		// 1. 是 public 类型
    		// 2. 用在 Excel 模板中
    		public List<ZqReportEntity> ExportDtoList { get; set; }
    
    		public ZqReportExportDto()
    		{
    
    		}
    
    		public ZqReportExportDto(List<ZqReportEntity> dataDetails)
    		{
    			ExportDtoList = dataDetails;
    		}
    	}
    }
    
  6. 新建一个 Excel 文件,命名为 ZqReportTemplate.xlsx,编写 Excel 模板,如图:

    [图片]

  7. 将上一步创建的 Excel 模板放到项目中,并在属性中设置复制到输出目录为 “如果较新则复制”,如图:

    [图片]

  8. 编写导出数据的方法

    using MRHelper.Entity;
    using MRHelper.ExcelExportDTO;
    using MRHelper.Utils;
    
    namespace MRHelper
    {
    	class Program
    	{
    		static void Main(string[] args)
    		{
    			// 1. 获取要导出的数据
    			// 可以直接手动添加模拟数据,或者从数据库中获取
    			var excelDataList = ......
    			
    			// 2. 导出
    			var exportDto = new ZqReportExportDto(excelDataList);
    			string savePath = @"d:\zqexport\";
    			string fileName =@"test.xlsx";
    			string templatePath = @"ExcelTemplate/ZqReportTemplate.xlsx";
    
    			string fileUrl = ExcelUtil.ExportExcelByTemplate(exportDto, savePath, fileName, templatePath).Result;
    			
    			// 3. 打印出生成的 Excel 文件
    			Console.WriteLine(fileUrl);
    		}
    	}
    }
    

总结

  1. Magicodes.IE.Excel 导出数据到 Excel 的性能非常高,10 几个字段,20000 多条数据,导出用时不到 7 秒。
  2. 代码简单,导出的核心代码只有 2 行
  3. 采用模板的方式,可以预先设置 Excel 的行高、标题、字体等样式,导出来的 Excel 内容样式比较美观专业。
  4. Magicodes.IE.Excel 导出数据到 Excel 不需要机器上安装 Office 或 Wps 等软件
  5. 本文提供的例子可以应付大部分的业务场景,但事实上,Magicodes.IE.Excel 还可以处理更复杂的数据,大家有兴趣可以到 GitHub 下载其源码深入了解

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊人生。

都看到这了,求个点赞、关注、在看三连呗,感谢支持。

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

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

相关文章

汽车电子工程师入门系列——CAN 规范系列通读

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

【一生一芯】笔记

文章目录 一级目录二级目录三级目录缓存的验证 一级目录 二级目录 三级目录 缓存的验证

c++习题04-忙碌的工人

目录 一&#xff0c;问题 二&#xff0c;思路 1&#xff0c;图形 2&#xff0c;分析 3&#xff0c;伪代码 三&#xff0c;代码 一&#xff0c;问题 二&#xff0c;思路 1&#xff0c;图形 根据题目&#xff0c;绘制出来的图形如下&#x1f447; 之后再绘制甲经过楼梯…

Hadoop 安装与伪分布的搭建

目录 1 SSH免密登录 1.1 修改主机名称 1.2 修改hosts文件 1.3 创建hadoop用户 1.4 生成密钥对免密登录 2 搭建hadoop环境与jdk环境 2.1 将下载好的压缩包进行解压 2.2 编写hadoop环境变量脚本文件 2.3 修改hadoop配置文件&#xff0c;指定jdk路径 2.4 查看环境是否搭建完成 3 …

文华财经通达信同花顺期货通盘立方博易大师主图指标公式源码

买线:EMA(C,2); 卖线:EMA(SLOPE(C,21)*20C,42); BU:CROSS(买线,卖线); SEL:CROSS(卖线,买线); STICKLINE1(买线>卖线,LOW,MIN(O,C),0.1,1),COLORRED; STICKLINE1(买线>卖线,MAX(O,C),HIGH,0.1,1),COLORRED; STICKLINE(买线>卖线,CLOSE,OPEN,8,1),COLORRED; STI…

解锁iCloud的全能潜力:从新手到专家的终极指南!

在今天这个数字化日益发达的时代&#xff0c;云服务已经成为我们生活中不可或缺的一部分。苹果公司的iCloud服务&#xff0c;作为一个集成的云服务平台&#xff0c;为用户提供了数据存储、备份、同步等多样化的功能。通过本文&#xff0c;我们将深入探讨如何高效利用iCloud&…

itext生成pdf文件demo示例

需求 在PDF文件中植入一些信息&#xff08;pdf模版&#xff09; 制作模版 可以看到下面红色箭头标注位置&#xff0c;这都是我们需要动态写入数据的表单域&#xff0c;可以使用wps等工具来制作 点击编辑表单&#xff0c;可以给对应空间添加表单域&#xff0c;表单域名称是ke…

【React】代码简化与拓展安装

安装如下拓展&#xff1a; 只需敲击rcc即可搭建框架

SPFA的拓展应用

spfa的拓展应用——负环 理论 01分数规划负环&#xff1a;一个环边权之和小于零 求负环的基本方法,基于SPFA&#xff1a; 都是基于抽屉原理&#xff0c;如果超过n条边&#xff0c;那一定有两个点相同&#xff0c;那就一定存在一个环 (1) 统计每个点入队次数&#xff0c;如…

linux 下neo4j的安装

一、neo4j简介 Neo4j 是一个高性能的 NoSQL 图形数据库,它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j 也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。 neo4j与jdk版本对应 neo4j的版本需要与jdk版本相适配,否则容易出现安装失…

个人搭建cppreference网站

近日,由于购买的腾讯云服务器要过期了,之前在服务器搭建的cppreference也要重新搭建,故写下此文章 cppreference的访问速度也慢,故自己WSL子系统简单搭键一下是个不错的选择 环境准备 首先,自己先安装Nginx,在网上找安装教程即可下载cppreference网站资源包:https://pan.baidu…

Redis基础教程(一):redis数据类型

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

【sqlmap命令学习及测试dvwa_SQL_Injection】

文章目录 1.sqlmap命令及 不同级别探索 能否注入命令option1.1 low等级1.2 Medium等级1. 3 High等级 2. 注入流程2.1 数据库2.2 指定数据库表名2.3 指定表的 字段名2.4 内容2.5 当前用户信息2.6 用户密码2.7 其他 1.sqlmap命令及 不同级别探索 能否注入 命令option sqlmap -u…

无刷直流电机(BLDCM)位置识别SVPWM控制

无刷直流电机&#xff0c;即BLDCM&#xff0c;在各个行业应用非常广泛。我们最熟悉的是在四轴飞行器中的应用&#xff0c;其中的电机基本都是BLDCM。除此之外&#xff0c;汽车电子、家用电器、航空航天、办公自动化、机器人等领域都有重要应用。 梯形波/方波无刷直流电机被称为…

【爆肝34万字】从零开始学Python第2天: 判断语句【入门到放弃】

目录 前言判断语句True、False简单使用作用 比较运算符引入比较运算符的分类比较运算符的结果示例代码总结 逻辑运算符引入逻辑运算符的简单使用逻辑运算符与比较运算符一起使用特殊情况下的逻辑运算符 if 判断语句引入基本使用案例演示案例补充随堂练习 else 判断子句引入else…

2024年度总结:不可错过的隧道IP网站评估推荐

随着网络技术的飞速发展&#xff0c;隧道IP服务成为了许多企业和个人在进行网络活动时的得力助手。作为专业的测评团队&#xff0c;我们经过一整年的深入研究和测试&#xff0c;为大家带来了三款备受瞩目的隧道IP网站推荐——品易HTTP、极光HTTP和一G代理。接下来&#xff0c;我…

AI产品经理面试

把优秀当习惯把优秀当习惯肯定不是口头说说&#xff0c;那有什么判断标准吗&#xff1f; 当我做完一件事儿的时候&#xff0c;我会看它有没有突破我的舒适圈、能不能惊艳到我自己。这就是我的判断标准。 在自我介绍和经历介绍时&#xff0c;面试者应该注重以下几个方面&#xf…

字节码编程ASM之插桩调用其他类的静态方法

写在前面 源码 。 本文看下通过ASM如何实现插桩调用其他类的静态方法。 1&#xff1a;编码 假定有如下的类&#xff1a; public class PayController {public void pay(int userId, int payAmount) {System.out.println("用户&#xff1a;" userId ", 调用…

GPIO和PIN

文章目录 1 GPIO和Pin1.1 GPIO和Pin基础概念1.2 GPIO输入模式1.3 GPIO输出模式1.4 GPIO的HAL库1.4.1 一些HAL库表示1.4.2 HAL库常用GPIO函数1.4.3 GPIO点亮led灯程序例子 1 GPIO和Pin 1.1 GPIO和Pin基础概念 ​ 单片机有很多的引脚&#xff0c;为了操控每一个引脚&#xff0c…

ChatGPT之母:AI自动化将取代人类,创意性工作或将消失

目录 01 AI取代创意性工作的担忧 1.1 CTO说了啥 02 AI已开始大范围取代人类 01 AI取代创意性工作的担忧 几天前的采访中&#xff0c;OpenAI的CTO直言&#xff0c;AI可能会扼杀一些本来不应该存在的创意性工作。 近来一篇报道更是印证了这一观点。国外科技媒体的老板Miller用…