ASP.NET Core中如何将类字段作为Excel表头写入Excel文件?
在ASP.NET Core中实现以实体字段为表头的Excel写入功能
嘿,这个需求用ASP.NET Core结合EPPlus库来实现是社区里最常用的方案之一,我给你一步步拆解怎么做:
第一步:安装Excel处理库
我们用EPPlus,它对.NET Core支持很好,API也简洁。如果你是非商用场景,可以用MIT许可证的旧版本(4.x),安装命令如下:
用NuGet包管理器控制台:
Install-Package EPPlus -Version 4.5.3.3
或者用.NET CLI:
dotnet add package EPPlus --version 4.5.3.3
注意:EPPlus 5及以上版本采用Polyform Noncommercial License,非商用免费,商用需要付费授权。如果是商用项目,你也可以选择NPOI(Apache许可证,完全免费),但EPPlus的API更易用。
第二步:创建对应的数据实体类
你给出的JSON字段正好可以对应一个实体类,这样后续操作更规范:
public class Vehicle { public string Feature { get; set; } public string RegistrationNumber { get; set; } public string OwnerName { get; set; } public string MobileNumber { get; set; } public string Make { get; set; } public string Model { get; set; } public string RegistrationDate { get; set; } public string MakeYear { get; set; } public string ModelYear { get; set; } public string UsageType { get; set; } public string EngineNumber { get; set; } public string VehicleType { get; set; } public string Color { get; set; } }
第三步:编写Excel生成逻辑
我们写一个静态工具类,负责把List<Vehicle>转换成Excel文件的字节数组,这里会自动用实体类的属性名作为Excel表头:
using OfficeOpenXml; using System.Collections.Generic; using System.IO; using System.Reflection; public static class ExcelGenerator { public static byte[] GenerateVehicleExcel(List<Vehicle> vehicles) { // 针对EPPlus 4.x设置非商用许可证上下文 ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (var package = new ExcelPackage()) { // 创建工作表 var worksheet = package.Workbook.Worksheets.Add("车辆信息"); // 获取实体类的所有属性,用来生成表头 var vehicleProperties = typeof(Vehicle).GetProperties(); // 写入表头行(第一行) for (int colIndex = 0; colIndex < vehicleProperties.Length; colIndex++) { var cell = worksheet.Cells[1, colIndex + 1]; cell.Value = vehicleProperties[colIndex].Name; // 给表头加个加粗样式,更美观 cell.Style.Font.Bold = true; } // 写入数据行(从第二行开始) for (int rowIndex = 0; rowIndex < vehicles.Count; rowIndex++) { var currentVehicle = vehicles[rowIndex]; for (int colIndex = 0; colIndex < vehicleProperties.Length; colIndex++) { worksheet.Cells[rowIndex + 2, colIndex + 1].Value = vehicleProperties[colIndex].GetValue(currentVehicle); } } // 自动调整列宽,避免内容被截断 worksheet.Cells.AutoFitColumns(); // 将Excel包转换成字节数组返回 return package.GetAsByteArray(); } } }
第四步:在控制器中提供下载接口
把你现有的GetVehicles方法返回的JSON解析成List<Vehicle>,然后调用上面的工具类生成Excel,最后返回给用户下载:
using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Text.Json; public class VehicleController : Controller { public IActionResult DownloadVehiclesExcel() { // 获取你的JSON数据 var vehicleJson = GetVehicles(); // 解析成Vehicle列表 var vehicles = JsonSerializer.Deserialize<List<Vehicle>>(vehicleJson); // 生成Excel字节数组 var excelBytes = ExcelGenerator.GenerateVehicleExcel(vehicles); // 返回Excel文件供用户下载 return File( fileContents: excelBytes, contentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileDownloadName: "车辆信息表.xlsx" ); } // 你原有的GetVehicles方法 public string GetVehicles() { string jsonResult = "[{Feature: '', RegistrationNumber: '', OwnerName: '', MobileNumber: '',Make: '',Model:''," + "RegistrationDate: '',MakeYear: '',ModelYear: '',UsageType: '',EngineNumber: '',VehicleType: '', Color: ''}]"; return jsonResult; } }
一些额外的小技巧和注意事项
- 自定义表头名称:如果不想用属性名作为表头(比如想把
RegistrationNumber改成“车牌号”),可以给属性加[DisplayName]特性,然后在生成表头时读取这个特性的值,替换掉属性名。 - 数据类型优化:如果你的
RegistrationDate是日期格式的字符串,建议转换成DateTime类型再写入Excel,这样Excel会自动识别为日期格式,方便后续操作。 - 性能优化:如果数据量很大,建议使用EPPlus的
LoadFromCollection方法(更高效),比如:
这个方法会自动填充数据,你只需要手动写表头就行。worksheet.Cells["A2"].LoadFromCollection(vehicles, printHeaders: false);
内容的提问来源于stack exchange,提问作者Alvina Jose




