下面给出一份完整的 ASP.NET Core 6/7 示例,演示如何借助 Magicodes.IE.Excel + Magicodes.IE.Core 完成
“读取(导入)、写入(导出)、上传、下载” 四大常用 Excel 场景。直接复制即可运行,也可以按模块拆解到自己的项目里。
- 安装 NuGet 包
dotnet add package Magicodes.IE.Excel
dotnet add package Magicodes.IE.Excel.AspNetCore # 提供 XlsxFileResult
- 定义导入/导出 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; }
}
- 读取(导入)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-dataPOST 即可。 - 支持
.xlsx文件,不支持.xls。
- 写入(导出)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");
}
XlsxFileResult由Magicodes.IE.Excel.AspNetCore提供,内部自动设置Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet与Content-Disposition: attachment。
- 启动层配置(Program.cs)
// 如使用依赖注入
builder.Services.AddScoped<IExcelImporter, ExcelImporter>();
builder.Services.AddScoped<IExcelExporter, ExcelExporter>();
- 运行测试
-
上传
POSThttps://localhost:5001/api/excel/upload
Body → form-data → key=file, value=选择.xlsx文件 -
下载
GEThttps://localhost:5001/api/excel/download
浏览器会直接弹出 “用户数据.xlsx” 下载框。
- 常见问题速查
| 问题 | 解决方案 |
|---|---|
| 需要自定义表头/合并单元格/多Sheet | 使用模板导出功能,见官方文档 |
| Docker 环境乱码 | 安装字体库:apt-get install -y fonts-dejavu-core |
| 超过 100 万行大文件 | 设置 [ExcelExporter(MaxRowNumberOnASheet = 500000)] 自动分页 |
官方资源
- GitHub 示例仓库:github.com/dotnetcore/…
- 在线文档:docs.xin-lai.com/
ExcelImporter 和 ExcelExporter 并不是你自己写的类,而是 Magicodes.IE.Excel 这个官方 NuGet 包已经实现好的两个内置组件,直接引用即可使用。
✅ 它们在哪?
| 类型 | 命名空间 | 实现类名 | 所在程序集 |
|---|---|---|---|
| 导入器 | Magicodes.ExporterAndImporter.Excel | ExcelImporter | Magicodes.IE.Excel.dll |
| 导出器 | Magicodes.ExporterAndImporter.Excel | ExcelExporter | Magicodes.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实现:github.com/dotnetcore/…ExcelExporter实现:github.com/dotnetcore/…
✅ 总结一句话
你不需要实现 ExcelImporter/ExcelExporter,它们已经是 Magicodes.IE 提供的现成工具类,安装包后直接用即可。