在ASP.NET Core MVC项目开发中,文件上传、数据导入与导出是很多业务场景的必备功能,比如用户批量导入用户信息、导出报表数据等,掌握这三个功能的实现逻辑能大幅提升开发效率。

文件上传功能实现
首先需要在控制器中定义接收上传文件的接口,ASP.NET Core MVC通过IFormFile类型来接收前端传递的文件数据,同时需要做好文件类型、大小的校验,避免非法文件上传。
基础的上传接口实现代码如下:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.IO;
using System.Threading.Tasks;
namespace Demo.Controllers
{
public class FileController : Controller
{
// 单文件上传接口
[HttpPost]
public async Task<IActionResult> UploadFile(IFormFile file)
{
// 校验文件是否为空
if (file == null || file.Length == 0)
{
return BadRequest("请选择要上传的文件");
}
// 校验文件大小,限制为10MB以内
if (file.Length > 10 * 1024 * 1024)
{
return BadRequest("文件大小不能超过10MB");
}
// 校验文件类型,只允许上传xlsx、csv格式
var allowedExtensions = new[] { ".xlsx", ".csv" };
var fileExtension = Path.GetExtension(file.FileName).ToLower();
if (!allowedExtensions.Contains(fileExtension))
{
return BadRequest("仅支持上传xlsx、csv格式的文件");
}
// 定义文件保存路径,实际项目中可根据需求调整
var savePath = Path.Combine(Directory.GetCurrentDirectory(), "UploadFiles");
if (!Directory.Exists(savePath))
{
Directory.CreateDirectory(savePath);
}
var fileName = $"{Guid.NewGuid()}{fileExtension}";
var filePath = Path.Combine(savePath, fileName);
// 保存文件到服务器
using (var stream = new FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(stream);
}
return Ok(new { message = "文件上传成功", filePath = filePath });
}
}
}数据导入功能实现
文件上传完成后,接下来需要解析上传的文件内容,将数据导入到数据库中。这里以导入Excel文件为例,需要引入EPPlus库来解析Excel数据,先通过NuGet安装EPPlus包。
Excel数据导入的实现代码如下:
using OfficeOpenXml;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
namespace Demo.Services
{
public class ImportService
{
// 解析Excel并导入数据,假设Excel第一行为表头,对应User实体属性
public async Task<List<User>> ImportUsersFromExcel(string filePath)
{
var userList = new List<User>();
// 设置EPPlus非商业许可
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
using (var package = new ExcelPackage(new FileInfo(filePath)))
{
// 获取第一个工作表
var worksheet = package.Workbook.Worksheets[0];
// 获取行数,跳过第一行表头
var rowCount = worksheet.Dimension.Rows;
for (int row = 2; row <= rowCount; row++)
{
var user = new User
{
// 假设第一列是用户名,第二列是邮箱,第三列是年龄
UserName = worksheet.Cells[row, 1].Text,
Email = worksheet.Cells[row, 2].Text,
Age = int.Parse(worksheet.Cells[row, 3].Text)
};
userList.Add(user);
}
}
// 实际项目中这里可以将userList批量插入数据库
return userList;
}
}
// 用户实体类
public class User
{
public string UserName { get; set; }
public string Email { get; set; }
public int Age { get; set; }
}
}数据导出功能实现
数据导出通常支持Excel、CSV等格式,下面分别介绍两种格式的导出实现方式。
导出为Excel格式
同样使用EPPlus库生成Excel文件,将数据库查询到的数据写入到Excel工作表中,然后返回文件流给前端。
using Microsoft.AspNetCore.Mvc;
using OfficeOpenXml;
using System.Collections.Generic;
using System.IO;
namespace Demo.Controllers
{
public class ExportController : Controller
{
// 导出用户数据为Excel
[HttpGet]
public IActionResult ExportUsersToExcel()
{
// 模拟从数据库查询到的用户数据
var userList = new List<User>
{
new User { UserName = "张三", Email = "zhangsan@ipipp.com", Age = 25 },
new User { UserName = "李四", Email = "lisi@ipipp.com", Age = 28 }
};
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
using (var package = new ExcelPackage())
{
// 创建工作表
var worksheet = package.Worksheets.Add("用户数据");
// 设置表头
worksheet.Cells[1, 1].Value = "用户名";
worksheet.Cells[1, 2].Value = "邮箱";
worksheet.Cells[1, 3].Value = "年龄";
// 填充数据
for (int i = 0; i < userList.Count; i++)
{
worksheet.Cells[i + 2, 1].Value = userList[i].UserName;
worksheet.Cells[i + 2, 2].Value = userList[i].Email;
worksheet.Cells[i + 2, 3].Value = userList[i].Age;
}
// 自动调整列宽
worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();
// 转换为字节数组
var excelBytes = package.GetAsByteArray();
// 返回文件,指定文件类型和文件名
return File(excelBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "用户数据.xlsx");
}
}
}
}导出为CSV格式
CSV格式导出不需要依赖第三方库,直接拼接字符串生成文件内容即可,实现更简单,兼容性也更好。
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Text;
namespace Demo.Controllers
{
public class ExportController : Controller
{
// 导出用户数据为CSV
[HttpGet]
public IActionResult ExportUsersToCsv()
{
var userList = new List<User>
{
new User { UserName = "张三", Email = "zhangsan@ipipp.com", Age = 25 },
new User { UserName = "李四", Email = "lisi@ipipp.com", Age = 28 }
};
// 拼接CSV内容,第一行为表头
var csvBuilder = new StringBuilder();
csvBuilder.AppendLine("用户名,邮箱,年龄");
foreach (var user in userList)
{
// 处理内容中的逗号,避免格式错误
var userName = user.UserName.Contains(",") ? $"\"{user.UserName}\"" : user.UserName;
var email = user.Email.Contains(",") ? $"\"{user.Email}\"" : user.Email;
csvBuilder.AppendLine($"{userName},{email},{user.Age}");
}
var csvBytes = Encoding.UTF8.GetBytes(csvBuilder.ToString());
// 返回文件,指定文件类型和文件名
return File(csvBytes, "text/csv", "用户数据.csv");
}
}
}注意事项
- 文件上传时需要做好校验,避免恶意文件上传导致服务器安全问题
- 大文件上传建议采用分片上传的方式,避免请求超时
- 导入数据时需要做好数据合法性校验,比如邮箱格式、年龄范围等,避免脏数据进入数据库
- 导出大量数据时建议采用流式导出,避免占用过多内存
ASP.NET_Core_MVC文件上传数据导入数据导出Excel操作修改时间:2026-06-04 14:50:52