分享一个导出数据到 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 下载其源码深入了解

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

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

  • 28
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中可以使用Apache POI和Freemarker两个库来实现根据模板导出数据到word的解决方案。 Apache POI是一个Java API,可以用于读写Microsoft Office格式的文档,包括Word、Excel和PowerPoint等。使用Apache POI,可以在Java程序中创建、修改和读取Word文档,将数据填充到Word文档中的模板中,生成新的Word文档。 Freemarker一个模板引擎,可以将数据填充到模板中,生成新的文本文件,包括HTML、XML、JSON和Word等。使用Freemarker,可以将数据填充到Word文档中的模板中,生成新的Word文档。 具体实现步骤如下: 1. 创建Word文档模板,使用Word软件设计好需要填充数据的文档模板。 2. 使用Apache POI读取Word文档模板,获取到需要填充数据的位置和格式。 3. 使用Freemarker数据填充到Word文档模板中,生成新的Word文档。 4. 将生成的新的Word文档保存到文件或输出到浏览器。 这是一个基本的实现流程,具体实现细节可以参考相关的文档和示例代码。以下是一个基本的示例代码: ``` // 1. 创建Word文档模板 FileInputStream fis = new FileInputStream("template.docx"); XWPFDocument templateDoc = new XWPFDocument(fis); fis.close(); // 2. 使用Apache POI读取Word文档模板 for (XWPFParagraph paragraph : templateDoc.getParagraphs()) { List<XWPFRun> runs = paragraph.getRuns(); for (XWPFRun run : runs) { String text = run.getText(0); if (text != null && text.contains("${")) { // 找到需要填充的位置 // 可以使用正则表达式或者字符串替换等方式进行定位 } } } // 3. 使用Freemarker数据填充到Word文档模板中 Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg.setDefaultEncoding("UTF-8"); cfg.setClassForTemplateLoading(this.getClass(), "/templates"); Template template = cfg.getTemplate("template.ftl"); Map<String, Object> data = new HashMap<>(); data.put("name", "张三"); data.put("age", 20); StringWriter sw = new StringWriter(); template.process(data, sw); String content = sw.toString(); // 4. 将生成的新的Word文档保存到文件或输出到浏览器 XWPFDocument newDoc = new XWPFDocument(); XWPFParagraph newParagraph = newDoc.createParagraph(); XWPFRun newRun = newParagraph.createRun(); newRun.setText(content); FileOutputStream fos = new FileOutputStream("output.docx"); newDoc.write(fos); fos.close(); newDoc.close(); ``` 上述代码使用了一个模板文件`template.ftl`,该文件中包含了需要填充的数据的位置和格式。在代码中,使用Freemarker数据填充到模板中,生成新的内容`content`,然后将新的内容生成为一个新的Word文档并保存到文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值