搜索

查看: 3056|回复: 11

[ASP.NET] .Net6.0+Vue3实现数据简易导入功能全过程

[复制链接]
发表于 2023-5-4 11:33:41 | 显示全部楼层 |阅读模式
Editor 2023-5-4 11:33:41 3056 11 看全部
目录
  • 前言
  • 1. 前端上传文件到后台进行数据存储
  • 1.1编写文件上传接口
  • 1.2存储上传文件路径,读取数据并进行存储
  • 1.3前端Vue建立创建列表数据页面,包含表格功能及分页功能
  • 1.4调用接口获取表格数据方法
  • 1.5后台开发数据返回接口
  • 1.6主页面创建上传文件组件并进行引用
  • 1.7FleUpload页面主要上传文件到服务器,并回调父页面存储接口
  • 1.8这里的title,accept参数由父页面传值过来,可以进行组件复用
  • 1.9提交保存时回调父页面存储数据方法
  • 1.10父页面方法调用接口进行数据存储,存储成功后关闭子页面
  • 1.11后台数据存储接口
  • 2前端读取数据,发送读取数据到后台进行数据存储
  • 2.1创建上传数据组件并引用
  • 2.2DataUpload页面主要读取选择文件数据,并进行展示
  • 2.3文件上传成功方法,保存数据到临时变量进行分页处理
  • 2.4数据绑定到表格上,这里需要通过当前选择页码及页面显示数量处理需要绑定到表格上的数据
  • 2.5点击确认导入按钮回调父页面方法进行数据保存
  • 2.6父页面方法调用接口进行数据存储,存储成功后关闭子页面
  • 2.7后台数据存储接口
  • 总结
    前言
    在开发的过程中,上传文件或者导入数据是一件很常见的事情,导入数据可以有两种方式:
  • 前端上传文件到后台,后台读取文件内容,进行验证再进行存储
  • 前端读取数据,进行数据验证,然后发送数据到后台进行存储
    这两种方式需要根据不同的业务才进行采用
    这次用.Net6.0+Vue3来实现一个数据导入的功能
    接下来分别用代码来实现这两种方式

    1. 前端上传文件到后台进行数据存储
    1.1编写文件上传接口
    [DisableRequestSizeLimit]
            [HttpPost]
            public IActionResult Upload()
            {
                var files = Request.Form.Files;
                long size = files.Sum(f => f.Length);
                string contentRootPath = AppContext.BaseDirectory;
                List filenames = new List();
                foreach (IFormFile formFile in files)
                {
                    if (formFile.Length > 0)
                    {
                        string fileExt = Path.GetExtension(formFile.FileName);
                        long fileSize = formFile.Length;
                        string newFileName = System.Guid.NewGuid().ToString() + fileExt;
                        var filePath = contentRootPath + "/fileUpload/";
                        if (!Directory.Exists(filePath))
                        {
                            Directory.CreateDirectory(filePath);
                        }
                        using (var stream = new FileStream(filePath + newFileName, FileMode.Create))
                        {
                            formFile.CopyTo(stream);
                        }
                        filenames.Add(newFileName);
                    }
                }
                return Ok(filenames);
            }
    这里只是上传文件分了两步走,第一步把文件上传到服务器,第二步调用接口把返回的文件路径发送给后台进行数据保存

    1.2存储上传文件路径,读取数据并进行存储
    ///
            /// 上传文件数据
            ///
            ///
            ///
            [HttpPut]
            public IActionResult Put(DataInput uploadStuInfoInput)
            {
                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
                var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "fileUpload", uploadStuInfoInput.filePath);
                if (!System.IO.File.Exists(filePath))
                {
                    return BadRequest("导入失败,文件不存在!");
                }
                var row = MiniExcelLibs.MiniExcel.Query(filePath).ToList();
                companies.AddRange(row.Select(x => new Company { Name = x.名称, Address = x.地址 }));
                return Ok("导入成功!");
            }
    1.3前端Vue建立创建列表数据页面,包含表格功能及分页功能
          
          
       
      0'>
          
       


    1.4调用接口获取表格数据方法
    const getData = () => {
          axios.get('/Company', { params: state.searchInput }).then(function (response) {
            state.tableData = response.data;
          })
        }
    1.5后台开发数据返回接口
    [HttpGet]
            public dynamic Get([FromQuery] SelectInput selectInput)
            {
                return new
                {
                    total = companies.Count(),
                    data = companies.Skip((selectInput.pageIndex - 1) * selectInput.pageSize).Take(selectInput.pageSize).ToList()
                };
            }
    1.6主页面创建上传文件组件并进行引用
    import FileUpload from '@/components/FileUpload.vue';
    并绑定子页面回调方法fileUploadchildClick

    1.7FleUpload页面主要上传文件到服务器,并回调父页面存储接口
       
          
            
            将文件拖到此处,或点击上传
            请选择({{  accept  }})文件
          
          
            
              导入
              取消
            
          
       
      
    1.8这里的title,accept参数由父页面传值过来,可以进行组件复用
    选择文件成功回调方法
    const fileUploadEnd = (response, file) => {
          state.fileresponse = file.name;
          state.formData.filePath = response[0];
          if (state.fileList.length > 0) {
            state.fileList.splice(0, 1);
          }
        }
    1.9提交保存时回调父页面存储数据方法
    const submit = () => {
          if (state.formData.filePath == '') {
            ElMessage.error('请选择上传的文件')
            return;
          }
          context.emit('childClick', state.formData)
        }
    1.10父页面方法调用接口进行数据存储,存储成功后关闭子页面
    const fileUploadchildClick = (e) => {
          axios.put('/Company', {
            filePath: e.filePath,
          }).then(function (response) {
            if (response.status == 200) {
              ElMessage.success(response.data);
              fileUpload.value.cancel();
              getData();
            } else {
              ElMessage.error(response.data)
            }
          })
        }
    1.11后台数据存储接口
    ///
            /// 上传文件数据
            ///
            ///
            ///
            [HttpPut]
            public IActionResult Put(DataInput uploadStuInfoInput)
            {
                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
                var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "fileUpload", uploadStuInfoInput.filePath);
                if (!System.IO.File.Exists(filePath))
                {
                    return BadRequest("导入失败,文件不存在!");
                }
                var row = MiniExcelLibs.MiniExcel.Query(filePath).ToList();
                companies.AddRange(row.Select(x => new Company { Name = x.名称, Address = x.地址 }));
                return Ok("导入成功!");
         }
    2前端读取数据,发送读取数据到后台进行数据存储
    2.1创建上传数据组件并引用
    import DataUpload from '@/components/DataUpload.vue';
    并绑定子页面回调方法dataUploadchildClick

    2.2DataUpload页面主要读取选择文件数据,并进行展示
       
          
          将文件拖到此处,或点击上传
       
       
          
            确认导入
          
       
       
          
          
       
         0'>
          
       
      
    2.3文件上传成功方法,保存数据到临时变量进行分页处理
    const uploadChange = async (file) => {
          let dataBinary = await readFile(file.raw)
          let workBook = XLSX.read(dataBinary, { type: 'binary', cellDates: true })
          let workSheet = workBook.Sheets[workBook.SheetNames[0]]
          let data: any = XLSX.utils.sheet_to_json(workSheet)
          let tHeader = state.colunm.map(obj => obj.lable)
          let filterVal = state.colunm.map(obj => obj.key)
          tHeader.map(val => filterVal.map(obj => val[obj]))
          const tempData: any = [];
          data.forEach((value) => {
            const ob = {};
            tHeader.forEach((item, index) => {
              ob[filterVal[index]] = value[item].toString();
            })
            tempData.push(ob);
          })
          state.tempTableData = tempData;
          getData();
        }
    2.4数据绑定到表格上,这里需要通过当前选择页码及页面显示数量处理需要绑定到表格上的数据
    const getData = () => {
          const tempData: any = [];
          state.tempTableData.forEach((value, index) => {
            if (index >= ((state.searchInput.PageIndex - 1) * state.searchInput.PageSize) && index
    2.5点击确认导入按钮回调父页面方法进行数据保存
    const submit = () => {
          context.emit('childClick', state.tempTableData)
        }
    2.6父页面方法调用接口进行数据存储,存储成功后关闭子页面
    const dataUploadchildClick = (data) => {
          axios.post('/Company', data)
            .then(function (response) {
              if (response.status == 200) {
                ElMessage.success(response.data);
                dataUpload.value.cancel();
                getData();
              } else {
                ElMessage.error(response.data)
              }
            })
        }
    2.7后台数据存储接口
    /// 上传数据
            ///
            ///
            ///
            [HttpPost]
            public IActionResult Post(List  companiesInput)
            {
                companies.AddRange(companiesInput);
                return Ok("保存成功!");
            }
    最后关于这个数据导入的功能就完成了,代码中有很多得伪代码,而且很多功能还待完善,后续再进行补充
    附上git地址:https://gitee.com/wyf854861085/file-upload.git
    Git演示图:

    2022821164109651.gif

    2022821164109651.gif


    总结
    到此这篇关于.Net6.0+Vue3实现数据简易导入功能的文章就介绍到这了,更多相关.Net Vue3数据导入功能内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛
  • 回复

    使用道具 举报

    发表于 2023-6-28 18:35:08 | 显示全部楼层
    我的苦恼冉 2023-6-28 18:35:08 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    回复

    使用道具 举报

    发表于 2023-6-29 10:03:23 | 显示全部楼层
    dxf17 2023-6-29 10:03:23 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-29 16:20:49 | 显示全部楼层
    123456833 2023-6-29 16:20:49 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-6-29 17:27:04 | 显示全部楼层
    米老鼠和蓝精鼠v 2023-6-29 17:27:04 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    回复

    使用道具 举报

    发表于 2023-6-29 19:56:18 | 显示全部楼层
    麻辣鸡翅 2023-6-29 19:56:18 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-30 10:16:02 | 显示全部楼层
    丁侦球 2023-6-30 10:16:02 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-6-30 13:50:26 | 显示全部楼层
    胡37 2023-6-30 13:50:26 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-6-30 22:30:46 | 显示全部楼层
    贰十岁装成熟装s 2023-6-30 22:30:46 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    发表于 2023-7-3 09:02:09 | 显示全部楼层
    戏做顿 2023-7-3 09:02:09 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表