.net6 导入导出
一.下载依赖包 (MiniExcel)
二.导出
/// <summary>
/// 导出(使用于文件较小,数据量不大的情况)
/// </summary>
/// <param name="pageIndex">页索引</param>
/// <param name="pageSize">页容量</param>
/// <param name="userName">查询条件</param>
/// <returns></returns>
[HttpGet]
public IActionResult Upload(int pageIndex, int pageSize, string? userName)
{
//源数据
var values = _userService.UserList(pageIndex, pageSize, userName).list;
var data = new List<object>();
foreach (var item in values)
{
data.Add(new
{
//更改头部字段名称
编号 = item.UserId,
用户名 = item.UserName,
密码 = item.Password,
添加时间 = item.AddTime,
是否删除 = item.IsDel ? "是" : "否"
});
}
//开辟内存空间
var memoryStream = new MemoryStream();
//写入数据
memoryStream.SaveAs(data);
//返回文件流 (从第一行读取到最后)
memoryStream.Seek(0, SeekOrigin.Begin);
//"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" =>excel格式
//memoryStream =>文件流
return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
//文件名
FileDownloadName = "demo.xlsx"
};
}
前台调用(vue) 简单写法
function daoImport() {
location.href = "http://localhost:35891/api/Users/Upload?pageIndex=" + form.pageIndex + "&pageSize=" + form.pageSize + "&userName=" + form.userName + "";
}
标准写法 异步
async function downLoadDemo() {
const response = await axios.get('http://localhost:35891/api/Users/Upload?pageIndex=' + form.pageIndex + '&pageSize=' + form.pageSize + '&userName=' + form.userName + '', {
responseType: 'blob', // 指定响应类型为 blob(用于存储大量的二进制文件)
// headers: { 头部:JWT验证
// Authorization: `Bearer ${sessionStorage.getItem('token')}`
// }
},
);
// 创建一个临时链接
const url = window.URL.createObjectURL(response.data);
// 创建一个 <a> 标签
const link = document.createElement('a');
//将<a>标签指向临时链接
link.href = url
//文件下载的名字
let fileName = '下载的名字';
link.setAttribute('download', fileName);
// 添加到 DOM 中并点击下载
document.body.appendChild(link);
link.click();
// 清理创建的 URL 对象
window.URL.revokeObjectURL(url);
}
三.导入
/// <summary>
/// 导入用户
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
[HttpPost]
public IActionResult Import(IFormFile file)
{
//判断条件(封装到公共类中 可不写)
//var isExcel = Common.PublicClass.IsExcel(file);
//if (!isExcel)
//{
// return Ok("文件为空或者文件格式不正确");
//}
//在内存中开辟空间
var memory = new MemoryStream();
//将文件流写入到内存中
file.CopyTo(memory);
//将内存流转为excel
var list = memory.Query<UserInfo>().ToList();
//调用服务层方法 批量添加
int n = _userService.AddRange(list);
return Ok(n);
}
前台调用 Element-plus 官网 Upload
记得更改Action地址
封装验证Excel合法
public static bool IsExcel(IFormFile file)
{
if (file == null)
{
return false;
}
string lastName = Path.GetExtension(file.FileName);
if (lastName != ".xls" && lastName != ".xlsx")
{
return false;
}
if (file.Length > 1024 * 1024 * 5)
{
return false;
}
return true;
}
四:用户想要批量导入 下载模版
/// <summary>
/// 导出模版
/// </summary>
/// <returns></returns>
[HttpGet]
public IActionResult UploadExcel()
{
//模版数据
var values = new[]
{
new{用户名="zhangsan",密码="123",是否删除="False"}
};
//开辟内存空间
var memoryStream = new MemoryStream();
//写入数据
memoryStream.SaveAs(values);
//返回文件流 (从第一行读取到最后)
memoryStream.Seek(0, SeekOrigin.Begin);
//"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" =>excel格式
//memoryStream =>文件流
return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
//文件名
FileDownloadName = "demo.xlsx"
};
}
注:下载模版标题如是中文
/// <summary>
/// 用户
/// </summary>
public class UserInfo
{
[Key]
public int UserId { get; set; }
[DisplayName("用户名")]
public string UserName { get; set; }
[DisplayName("密码")]
public string Password { get; set; }
[DisplayName("添加时间")]
public DateTime AddTime { get; set; } = DateTime.Now;
[DisplayName("是否删除")]
public bool IsDel { get; set; } = false;
}