前言
许多业务场景下需要处理和分析大量的数据,而 Excel 是广泛使用的文件格式,几乎所有人都能打开和查看 Excel 文件,因此将数据库中的原始数据处理后,导出到 Excel 是一个很常见的功能,对于数据管理、分析、备份、展示以及与外部系统集成等方面都具有重要的作用。
之前分享了如何使用 Magicodes.IE.Excel 上传和读取 Excel的方案(请参考前文《分享一个 ASP.NET Web Api 上传和读取 Excel 的方案》),今天继续分享如何使用 Magicodes.IE.Excel 导出 Excel 到模板的方案。
Step By Step 步骤
-
创建一个 .NET Console 项目
-
安装以下 Nuget 包
Magicodes.IE.Excel
-
新建一个 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; } } }
-
写一个数据实体类
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; } } }
-
新建一个 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; } } }
-
新建一个 Excel 文件,命名为 ZqReportTemplate.xlsx,编写 Excel 模板,如图:
[图片]
-
将上一步创建的 Excel 模板放到项目中,并在属性中设置复制到输出目录为 “如果较新则复制”,如图:
[图片]
-
编写导出数据的方法
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); } } }
总结
- Magicodes.IE.Excel 导出数据到 Excel 的性能非常高,10 几个字段,20000 多条数据,导出用时不到 7 秒。
- 代码简单,导出的核心代码只有 2 行
- 采用模板的方式,可以预先设置 Excel 的行高、标题、字体等样式,导出来的 Excel 内容样式比较美观专业。
- Magicodes.IE.Excel 导出数据到 Excel 不需要机器上安装 Office 或 Wps 等软件
- 本文提供的例子可以应付大部分的业务场景,但事实上,Magicodes.IE.Excel 还可以处理更复杂的数据,大家有兴趣可以到 GitHub 下载其源码深入了解
我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊人生。
都看到这了,求个点赞、关注、在看三连呗,感谢支持。