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

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.mzph.cn/web/35999.shtml

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

相关文章

侯捷C++面向对象高级编程(上)-2-构造函数

1.inline函数 2.访问级别 3.构造函数 4.重载

《UDS协议从入门到精通》系列——图解0x38:请求上传

《UDS协议从入门到精通》系列——图解0x38&#xff1a;请求上传 一、简介二、数据包格式2.1 服务请求格式2.2 服务响应格式2.2.1 肯定响应2.2.2 否定响应 三、通信示例 Tip&#x1f4cc;&#xff1a;本文描述中但凡涉及到其他UDS服务的&#xff0c;将陆续提供链接跳转方式以便快…

新学期必备,录取情况统计如何制作?

暑假即将开始&#xff0c;新学期离我们又近了一步&#xff0c;老师们是不是在为如何高效统计录取情况而头疼呢&#xff1f;别担心&#xff0c;分享一个超实用的小技巧——使用易查分小程序的新建填表功能&#xff0c;让你的录取统计工作变得简单又高效&#xff01; 打开易查分小…

gin框架 HTML 模板加载,渲染 使用详解和总结

gin框架中默认的HTML模板渲染使用 LoadHTMLGlob() 或者 LoadHTMLFiles() &#xff0c; 这个地方如果是使用的LoadHTMLGlob() 这个方法的话是有坑的&#xff0c;即当你的模板文件放在不同的文件夹中时&#xff0c;使用这个方式加载会将文件夹也作为文件加载进去&#xff0c;从而…

G882磁力仪拖鱼位置是如何计算的?

根据参考文献&#xff0c;磁力仪拖鱼位置计算有两种方法&#xff1a; 1、直线法 直线计算法是假设不考虑海流、船摆等动态因素的影响&#xff0c;拖鱼与拖点始终和航向相同&#xff0c;即整个拖拽系统与船舶是刚性连接。 2、曲线法 实际海洋磁力测量中&#xff0c;在海风、海…

TP8 JS(html2canvas) 生成二维码并与背景图、文字组合生成分享海报

方法一&#xff1a;前端JS生成(推荐) 注意&#xff1a; 这个网页只能截图图片效果代码&#xff0c;其它任何html效果都不能有&#xff0c;不然截图就不准确 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><t…

Windows宝塔面板部署ThinkPHP8.0创建Vue项目案例

安装ThinkPHP8.0 登录宝塔面板&#xff0c;创建一个站点。 输入composer代码&#xff0c;执行完成后自动创建TP目录 composer create-project topthink/think tp 网站目录设置为tp&#xff0c;运行目录设置为public 设置PHP版本为8.0以上&#xff0c;不然会出现下面的报错代…

软考 有向图 数据库之关系模式范式

假设有一个关系 R(A, B, C, D)&#xff0c;并且已知以下函数依赖&#xff1a; A → B B → C BC → D 求候选键? 求候选码? 候选键/候选码 是同一个概念. 数据库范式也分为1NF,2NF,3NF,BCNF,4NF,5NF。 https://cloud.tencent.com/developer/article/2055118 2NF在1NF的基础…

低代码平台技术及其在CRM系统中的应用

随着信息技术的飞速发展&#xff0c;企业对于高效、灵活、可定制的软件开发需求日益增长。在这一背景下&#xff0c;低代码平台&#xff08;Low-Code Platform, LCP&#xff09;技术应运而生&#xff0c;并以其快速开发、易于维护和高度定制化的特性&#xff0c;逐渐成为企业信…

visual studio 2022配置和使用protobuf

上图证明&#xff0c;我真的测了好多遍&#xff0c;测了好多版本的protobuf&#xff0c;花了很多时间。不过好在最后在vs2022上测通了。 下载protobuf 这里是protobuf下载的地址。 Releases protocolbuffers/protobuf GitHub 个人使用的3.21.9这个版本才跑通的。 1、首先…

FastAPI-Body、Field

参考&#xff1a;模式的额外信息 - 例子 - FastAPI 在FastAPI中&#xff0c;Body和Field是两个常用的注解&#xff0c;它们用于定义请求体中的数据或路径参数、查询参数等的处理方式。这两个注解都来自于Pydantic库&#xff0c;用于数据验证和解析&#xff0c;但它们的应用场景…

第6章_libmodbus使用

文章目录 第6章 libmodbus使用6.1 libmodbus开发库6.1.1 功能概要6.1.2 源码获取6.1.3 源码阅读1. 新建工程2. 同步文件3.打开工程4. 操作示例5. 快捷键 6.1.4 libmodbus与应用程序的关系 6.2 libmodbus源代码解析6.2.1 核心函数6.2.2 框架分析与数据结构6.2.3 情景分析1. 初始…

OOXML入门学习

进入-飞入 <par> <!-- 这是一个并行动画序列的开始。"par"代表并行&#xff0c;意味着在这个标签内的所有动画将同时开始。 --><cTn id"5" presetID"2" presetClass"entr" presetSubtype"4" fill"hold&…

vue3 封装获取文件后缀和name的工具方法以及本地下载方法

获取文件后缀 /*** description&#xff1a;获取附件后缀* param {*} file 文件名称* param {*} isDot 是否显示点 0: 显示 1: 不显示*/ export const getFileType: (file?: string, isDot?: 0 | 1) > string (file, isDot 0) > {if (!file) {throw "file is n…

深度解析:Transformer自注意力机制的计算奥秘

深度解析&#xff1a;Transformer自注意力机制的计算奥秘 在自然语言处理&#xff08;NLP&#xff09;的广阔天地中&#xff0c;Transformer模型犹如一颗璀璨的星辰&#xff0c;以其卓越的性能照亮了序列建模的道路。而这一切&#xff0c;都离不开自注意力机制&#xff08;Sel…

C语言指针速成下篇

c语言的指针下篇终于迎来了收尾&#xff0c;那么废话不多说&#xff0c;我们直接进入正题 指针访问数组 # include <stdio.h> int main () { int arr[ 10 ] { 0 }; // 输⼊ int i 0 ; int sz sizeof (arr)/ sizeof (arr[ 0 ]); // 输⼊ int * p arr //这…

在Tomcat中部署war包

1、准备war包 确保已经有一个有效的war包&#xff0c;该war包包含了web应用程序的所有内容&#xff1b; 2、停止tomcat服务器 在部署之前&#xff0c;确保tomcat服务器已经停止&#xff0c;进入tomcat的配置目录执行命令&#xff1a;[路径]/tomcat/conf&#xff1b; 在Linux…

Socket——向FTP服务器发送消息并获得响应

1、简介 Socket&#xff08;套接字&#xff09;是网络编程中用于描述IP地址和端口的一个抽象概念&#xff0c;通过它可以实现不同主机间的通信。套接字可以分为几种不同的类型&#xff0c;每种类型对应不同的协议和传输模式。 1.1、基本概念 IP地址&#xff1a;用于标识网络…

【管理咨询宝藏137】RB大型卡车集团供应链体系优化设计方案中期汇报

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏137】RB大型卡车集团供应链体系优化设计方案中期汇报 【格式】PDF版本 【关键词】罗兰贝格、供应链管理、运营提升 【核心观点】 - 甲方采取销售…

每天一个项目管理概念之SOW

在项目管理中&#xff0c;Statement of Work&#xff08;SOW&#xff0c;工作说明&#xff09;是定义项目范围、目标、交付成果、时间表和预算的正式文档。 SOW的核心要素 SOW应当包含以下关键组成部分&#xff1a; 项目背景与目标 阐述项目的背景信息、发起原因以及预期达…