.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;
 }
posted @ 2024-06-26 11:48  Twolp  阅读(31)  评论(0编辑  收藏  举报