You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动