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

发布于:2024-06-29 ⋅ 阅读:(58) ⋅ 点赞:(0)

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 下载其源码深入了解

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

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