上传数据、下载模板文件解决方案(前端:antd;后端:.Net Core WebAPI)
一、Excel 模板下载
通过静态文件下载。
将模板文件放在根目录的 public 文件夹下备用。
下载事件方法如下:(通过临时生成一个 a 标签,触发后再移除)
downLoadExcelModel = () => {
var a = document.createElement("a");
a.href = "./ModelName.xlsx";
a.download = "模板文件名.xlsx";
a.style.display = "none";
document.body.appendChild(a);
a.click();
a.remove();
};
二、上传 Excel 表格
通过 Upload 控件上传目标文件,然后调用后台接口进行数据处理:(部分简单的变量处理省略)
1 //先引入 axios
2 import axios from 'axios';//npm install axios
3 import { UploadOutlined } from '@ant-design/icons';
4
5 //控件上传事件
6 uploadDictList=({file, fileList})=>{
7 console.log("file.status",file.status);
8 if (file.status === "done") {
9 const formData = new FormData()
10 formData.append('file', fileList[fileList.length - 1].originFileObj);
11 console.log("formData:",formData);
12 axios({
13 method: 'post',
14 url: '/api/List?paraname='+this.state.typecode,//配置访问接口
15 data: formData,
16 headers: { "Content-Type": "multipart/form-data"}
17 }).then(({data}) => {
18 console.log("baxk-data:",data);
19 if(data.code==200)
20 message.success(`上传成功!(成功/总数:${data.desc})`)
21 else
22 message.error("上传失败,请稍后重试!");
23 }).catch((err) =>{
24 console.log(err);
25 message.error("上传失败,请稍后重试!");
26 })
27 }
28 else if (file.status === "error") {
29 message.error(`上传失败,请稍后重试!${file.name}`);
30 }
31 }
32
33 //控件
34 <Upload
35 fileList={fileList}
36 showUploadList={false}
37 onChange={this.uploadDictList}
38 >
39 <Button disabled={uploadable} type="primary" icon={<UploadOutlined />} style={{margin:"20px 20px 20px 0"}}>上传数据项</Button>
40 </Upload>
三、.Net Core 3.0 WebAPI 文件接收与解析
主要就是 IFormCollection 来接收传入文件。
1 using Dapper;
2 using Microsoft.AspNetCore.Cors;
3 using Microsoft.AspNetCore.Http;
4 using Microsoft.AspNetCore.Mvc;
5 using NPOI.HSSF.UserModel;
6 using NPOI.SS.UserModel;
7 using NPOI.XSSF.UserModel;
8 using System;
9 using System.Collections.Generic;
10 using System.Data;
11 using System.IO;
12 using System.Linq;
1 [HttpPost]
2 public BackDataModel UploadddList(string ddtype, IFormCollection file)
3 {
4 var fileobj = file.Files[0];
5 string filename = Path.GetFileName(fileobj.FileName);
6 var filesize = fileobj.Length;//获取上传文件的大小单位为字节byte
7 string fileType = System.IO.Path.GetExtension(filename);//获取上传文件的扩展名
8 long maxsize = 4000 * 1024;//定义上传文件的最大空间大小为4M
9 if (filesize >= maxsize)
10 return new BackDataModel() { Code = 201, Desc = $"导入失败,表格文件必须小于(4M)。" };
11 var filestream = fileobj.OpenReadStream();
12 DataTable dt = new DataTable();
13 ISheet sheet = null;
14 IWorkbook workbook = null;
15 if (fileType == ".xlsx")//2007以上版本excel
16 workbook = new XSSFWorkbook(filestream);
17 else if (fileType == ".xls")//2007以下版本excel
18 workbook = new HSSFWorkbook(filestream);
19 else
20 throw new Exception("传入的不是Excel文件!");
21 sheet = workbook.GetSheetAt(0);//取第一个 sheet
22 var idddModellist_insert = new List<IdddModel>();
23 int countall = 0;
24 if (sheet != null)
25 {
26 IRow firstRow = sheet.GetRow(0);//首行值设置为表头
27 int cellCount = firstRow.LastCellNum;
28 if (cellCount != 6 || firstRow.Cells[0].StringCellValue != "代码" || firstRow.Cells[1].StringCellValue != "名称" || firstRow.Cells[2].StringCellValue != "备注1"
29 || firstRow.Cells[3].StringCellValue != "备注2" || firstRow.Cells[4].StringCellValue != "备注3" || firstRow.Cells[5].StringCellValue != "备注4")
30 {
31 return new BackDataModel() { Code = 201, Desc = $"导入失败,请按照‘模板’填值后重试!" };
32 }
33 for (int i = firstRow.FirstCellNum; i < cellCount; i++)
34 {
35 ICell cell = firstRow.GetCell(i);
36 if (cell != null)
37 {
38 string cellValue = cell.StringCellValue.Trim();
39 if (!string.IsNullOrEmpty(cellValue))
40 {
41 DataColumn dataColumn = new DataColumn(cellValue);
42 dt.Columns.Add(dataColumn);
43 }
44 }
45 }
46 DynamicParameters dynamicParameters = new DynamicParameters();
47 dynamicParameters.Add("@typename", ddtype);
48 string sql_getddinfo = "select * from aa where g>0";
49 var ddinfolist = db.factory.Query<IdddModel>(sql_getddinfo, dynamicParameters).ToList();
50 int ddnumber = 1;
51 for (int j = sheet.FirstRowNum + 1; j <= sheet.LastRowNum; j++)//遍历行
52 {
53 var idddModel = new IdddModel();
54 IRow row = sheet.GetRow(j);
55 if (row == null || row.Cells.Count != 6 ||
56 ((row.GetCell(0) == null || row.GetCell(0).StringCellValue.Length == 0) && (row.GetCell(1) == null || row.GetCell(1).StringCellValue.Length == 0)))//值不为空
57 {
58 continue;
59 }
60 countall++;
61 if (row.GetCell(0) != null && row.GetCell(1).CellType == CellType.String)
62 {
63 idddModel.ddcode = row.GetCell(0).ToString();
64 }
65 if (row.GetCell(1) != null && row.GetCell(1).CellType == CellType.String)
66 {
67 idddModel.ddname = row.GetCell(1).ToString();
68 }
69 if (row.GetCell(2) != null)
70 {
71 idddModel.Remark1 = row.GetCell(2).ToString();
72 }
73 if (row.GetCell(3) != null)
74 {
75 idddModel.Remark2 = row.GetCell(3).ToString();
76 }
77 if (row.GetCell(4) != null)
78 {
79 idddModel.Remark3 = row.GetCell(4).ToString();
80 }
81 if (row.GetCell(5) != null)
82 {
83 idddModel.Remark4 = row.GetCell(5).ToString();
84 }
85 if (ddinfolist.Where(dd => dd.ddcode == idddModel.ddcode && dd.ddname == idddModel.ddname)
86 {
87 idddModel.ddtypecode = ddinfolist?[0].ddtypecode;
88 idddModel.ddtypename = ddinfolist?[0].ddtypename;
89 idddModel.ID = Guid.NewGuid().ToString();
90 idddModel.Snumber = ddinfolist.Count + ddnumber;
91 idddModel.Insert_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
92 idddModel.Update_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
93 idddModel.ff = 1;
94 idddModellist_insert.Add(idddModel);
95 ddnumber++;
96 }
97 }
98 string sql_insertdd = $"insert into ";
99 int backnum = db.factory.Execute(sql_insertdd, idddModellist_insert);
100 if (backnum != 1 && idddModellist_insert.Count > 0)
101 return new BackDataModel() { Code = 201, Desc = $"数据保存不成功,请刷新列表确认!" };
102 }
103 else
104 {
105 return new BackDataModel() { Code = 201, Desc = $"导入失败,未取到表格中数据!" };
106 }
107 return new BackDataModel() { Code = 200, Desc = $"{idddModellist_insert.Count}/{countall}" };
108 }
以上代码已验证可用,若有疑问,请留言讨论。
上传数据、下载模板文件解决方案(前端:antd;后端:.Net Core WebAPI)的更多相关文章
- XShell上传、下载本地文件到linux服务器
Python之道发表于程序员八阿哥订阅 1.2K 腾讯云服务器 年付3折起 首次购买云服务器 最低3折起 超高性价比 限时抢购 Xshell很好用,然后有时候想在windows和linux上传或下载某 ...
- SpringMVC下文件的上传与下载以及文件列表的显示
1.配置好SpringMVC环境-----SpringMVC的HelloWorld快速入门! 导入jar包:commons-fileupload-1.3.1.jar和commons-io-2.4.ja ...
- .NET环境下上传和下载Word文件
一.上传Word文档或者其他文档 1.简单地上传文件的web服务方法如下 [WebMethod] public void UploadFile() { using (TransactionScope ...
- php 上传文件实例 上传并下载word文件
上传界面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- linux学习 XShell上传、下载本地文件到linux服务器
(一)通过命令行的方式 1.linux服务器端设置 在linux主机上,安装上传下载工具包rz及sz; 如果不知道你要安装包的具体名称,可以使用yum provides */name 进行查找系统自带 ...
- 使用fastDFS上传和下载图片文件
package com.xuecheng.test.fastdfs;import org.csource.common.MyException;import org.csource.fastdfs.* ...
- Webapi上传数据(XML)敏感字符解决方案
方法名加特性 [ValidateInput(false)] 配置文件加 <httpRuntime requestValidationMode="2.0" targetFram ...
- SpringMVC学习09(文件的上传和下载)
文件上传和下载 准备工作 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况 ...
- Java实现FTP文件与文件夹的上传和下载
Java实现FTP文件与文件夹的上传和下载 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制 ...
随机推荐
- 多环境配置 - SpringBoot 2.7.2 实战基础
优雅哥 SpringBoot 2.7.2 实战基础 - 06 -多环境配置 在一个项目的开发过程中,通常伴随着多套环境:本地环境 local.开发环境 dev.集成测试环境 test.用户接受测试环境 ...
- LuoguP1922 女仆咖啡厅桌游吧 (树形动态规划)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- Blazor VS Vue
Vue--两分钟概述 Vue 是一个JavaScript 框架. 在其最简单的模式中,您可以简单地将核心 Vue 脚本包含在您的应用程序中,然后开始构建您的组件. 除此之外,对于更复杂的应用程序, ...
- 服务器部署 Vue 和 Django 项目的全记录
本篇记录我在一个全新服务器上部署 Vue 和 Django 前后端项目的全过程,内容包括服务器初始配置.安装 Django 虚拟环境.python web 服务器 uWSGI 和反向代理 Nginx ...
- 从零开始Blazor Server(14)--修改密码
目前,我们只做了在用户管理里强行修改密码,而没有做用户自行修改密码的功能,今天我们来实现它. 首先,我们的用户密码修改最好的位置应该就是在头像下面的下拉菜单里,所以我们在那里的LinkTemplate ...
- Markdown使用指南
1. Markdown是什么? Markdown是一种轻量级标记语言,它以纯文本形式(易读.易写.易更改)编写文档,并最终以HTML格式发布. Markdown也可以理解为将以MARKDOWN语法编写 ...
- San(COCI2017.2)题解
题意 一个人为了楼顶的金币要去跳楼,但是不能往更矮的楼上跳. 求在一个长为N的序列中总点权值和大于等于K的不下降序列数. N<=40,K<=4e10 官方题解 折半搜索的经典例子!N在20 ...
- 简单创建一个SpringCloud2021.0.3项目(四)
目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 上三篇教程 3. 日志处理 1. 创建日志公共模块 2. Eureka引入日志模块 4. 到此的功能代码 5. 注册中心换成naco ...
- Android平台摄像头/屏幕/外部数据采集及RTMP推送接口设计描述
好多开发者提到,为什么大牛直播SDK的Android平台RTMP推送接口怎么这么多?不像一些开源或者商业RTMP推送一样,就几个接口,简单明了. 不解释,以Android平台RTMP推送模块常用接口, ...
- yum install lrzsz
yum install lrzsz rz:从本地上传文件至服务器 sz filename:从服务器下载文件至本地