Magicodes.IE.Excel Magicodes.IE.Core 在asp.net core中,操作exel的示例。包括:读取、写入、上传、下载等

139 阅读2分钟

下面给出一份完整的 ASP.NET Core 6/7 示例,演示如何借助 Magicodes.IE.Excel + Magicodes.IE.Core 完成
“读取(导入)、写入(导出)、上传、下载” 四大常用 Excel 场景。直接复制即可运行,也可以按模块拆解到自己的项目里。


  1. 安装 NuGet 包

dotnet add package Magicodes.IE.Excel
dotnet add package Magicodes.IE.Excel.AspNetCore   # 提供 XlsxFileResult

  1. 定义导入/导出 DTO

// ImportDto.cs(上传时接收)
public class ImportDto
{
    [ImporterHeader(Name = "编号")]
    public int    Id   { get; set; }

    [ImporterHeader(Name = "姓名")]
    public string Name { get; set; }

    [ImporterHeader(Name = "年龄")]
    public int    Age  { get; set; }
}

// ExportDto.cs(下载时使用)
[ExcelExporter(Name = "用户数据", AutoFitAllColumn = true)]
public class ExportDto
{
    [ExporterHeader(DisplayName = "编号")]
    public int    Id   { get; set; }

    [ExporterHeader(DisplayName = "姓名")]
    public string Name { get; set; }

    [ExporterHeader(DisplayName = "年龄")]
    public int    Age  { get; set; }
}

  1. 读取(导入)Excel —— 上传接口

[ApiController]
[Route("api/[controller]")]
public class ExcelController : ControllerBase
{
    private readonly IExcelImporter _importer;
    public ExcelController(IExcelImporter importer) => _importer = importer;

    /// <summary>
    /// 上传并读取 Excel
    /// </summary>
    [HttpPost("upload")]
    public async Task<IActionResult> Upload(IFormFile file)
    {
        if (file == null || file.Length == 0)
            return BadRequest("未检测到文件");

        using var stream = file.OpenReadStream();
        var result = await _importer.Import<ImportDto>(stream);

        if (result.HasError)
            return BadRequest(result.Exception?.Message);

        return Ok(result.Data);   // 直接返回读取到的数据
    }
}
  • 前端用 <input type="file">multipart/form-data POST 即可。
  • 支持 .xlsx 文件,不支持 .xls

  1. 写入(导出)Excel —— 下载接口

[HttpGet("download")]
public async Task<IActionResult> Download()
{
    // 1. 构造要导出的数据(真实场景从数据库查询)
    var data = new List<ExportDto>
    {
        new() { Id = 1, Name = "张三", Age = 18 },
        new() { Id = 2, Name = "李四", Age = 22 }
    };

    // 2. 一行代码直接返回文件流
    return new XlsxFileResult<ExportDto>(data, fileDownloadName: "用户数据.xlsx");
}
  • XlsxFileResultMagicodes.IE.Excel.AspNetCore 提供,内部自动设置 Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheetContent-Disposition: attachment

  1. 启动层配置(Program.cs)

// 如使用依赖注入
builder.Services.AddScoped<IExcelImporter, ExcelImporter>();
builder.Services.AddScoped<IExcelExporter, ExcelExporter>();

  1. 运行测试

  • 上传
    POST https://localhost:5001/api/excel/upload
    Body → form-data → key=file, value=选择 .xlsx 文件

  • 下载
    GET https://localhost:5001/api/excel/download
    浏览器会直接弹出 “用户数据.xlsx” 下载框。


  1. 常见问题速查

问题解决方案
需要自定义表头/合并单元格/多Sheet使用模板导出功能,见官方文档
Docker 环境乱码安装字体库:apt-get install -y fonts-dejavu-core
超过 100 万行大文件设置 [ExcelExporter(MaxRowNumberOnASheet = 500000)] 自动分页

官方资源

ExcelImporterExcelExporter 并不是你自己写的类,而是 Magicodes.IE.Excel 这个官方 NuGet 包已经实现好的两个内置组件,直接引用即可使用。


✅ 它们在哪?

类型命名空间实现类名所在程序集
导入器Magicodes.ExporterAndImporter.ExcelExcelImporterMagicodes.IE.Excel.dll
导出器Magicodes.ExporterAndImporter.ExcelExcelExporterMagicodes.IE.Excel.dll

✅ 使用方式(直接 new 或依赖注入)

1. 直接 new 使用(控制台/脚本)

using Magicodes.ExporterAndImporter.Excel;

IExcelImporter importer = new ExcelImporter();
IExcelExporter exporter = new ExcelExporter();

2. 依赖注入(ASP.NET Core)

builder.Services.AddScoped<IExcelImporter, ExcelImporter>();
builder.Services.AddScoped<IExcelExporter, ExcelExporter>();

推荐:在 ASP.NET Core 中这样注入后,控制器中通过构造函数就能拿到实例。


✅ 示例:导入 & 导出 Excel 文件

导入 Excel(读取)

var result = await importer.Import<YourDto>(fileStream);

导出 Excel(写入)

var result = await exporter.Export("users.xlsx", listOfYourDto);

✅ 源码位置(开源)

GitHub 项目地址:
github.com/dotnetcore/…


✅ 总结一句话

你不需要实现 ExcelImporter/ExcelExporter,它们已经是 Magicodes.IE 提供的现成工具类,安装包后直接用即可