一、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)的更多相关文章

  1. XShell上传、下载本地文件到linux服务器

    Python之道发表于程序员八阿哥订阅 1.2K 腾讯云服务器 年付3折起 首次购买云服务器 最低3折起 超高性价比 限时抢购 Xshell很好用,然后有时候想在windows和linux上传或下载某 ...

  2. SpringMVC下文件的上传与下载以及文件列表的显示

    1.配置好SpringMVC环境-----SpringMVC的HelloWorld快速入门! 导入jar包:commons-fileupload-1.3.1.jar和commons-io-2.4.ja ...

  3. .NET环境下上传和下载Word文件

    一.上传Word文档或者其他文档 1.简单地上传文件的web服务方法如下 [WebMethod] public void UploadFile() { using (TransactionScope ...

  4. php 上传文件实例 上传并下载word文件

    上传界面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  5. linux学习 XShell上传、下载本地文件到linux服务器

    (一)通过命令行的方式 1.linux服务器端设置 在linux主机上,安装上传下载工具包rz及sz; 如果不知道你要安装包的具体名称,可以使用yum provides */name 进行查找系统自带 ...

  6. 使用fastDFS上传和下载图片文件

    package com.xuecheng.test.fastdfs;import org.csource.common.MyException;import org.csource.fastdfs.* ...

  7. Webapi上传数据(XML)敏感字符解决方案

    方法名加特性 [ValidateInput(false)] 配置文件加 <httpRuntime requestValidationMode="2.0" targetFram ...

  8. SpringMVC学习09(文件的上传和下载)

    文件上传和下载 准备工作 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况 ...

  9. Java实现FTP文件与文件夹的上传和下载

    Java实现FTP文件与文件夹的上传和下载 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制 ...

随机推荐

  1. 零基础学Java(14)对象构造

    对象构造 之前学习了编写简单的构造器,可以定义对象的初始状态.但是,由于对象构造非常重要,所以Java提供了多种编写构造器的机制. 重载 有些类有多个构造器.例如,可以如下构造一个空的StringBu ...

  2. 记一次有意思的 SQL 实现 → 分组后取每组的第一条记录

    开心一刻 今天,朋友气冲冲的走到我面前 朋友:我不是谈了个女朋友,谈了三个月嘛,昨天我偷看她手机,你猜她给我备注什么 我:备注什么? 朋友:舔狗 2 号! 我一听,气就上来了,说道:走,找她去,这婆娘 ...

  3. idea主类main左侧栏启动按钮消失原因

    今天在开发完一个小项目后,打开idea发现我的springboot项目的启动类左侧栏的按钮消失了,然后我又去看了看mapp等文件的调转也全部消失了,我就很纳闷是不是idea配置坏了,赶忙点击导航栏的按 ...

  4. K8S中部署apisix(非ingress)

    不使用pvc的方式在K8S中部署apisix-gateway 简介 因为公司项目准备重构,现在做技术储备,之前公司项目使用的ocelot做网关,ocelot是.net平台下的一个网关,也是很不错,但是 ...

  5. windows绕过杀软添加账户密码

    windows绕过杀软添加账户密码 起因:system权限下存在杀软无法添加账户信息 绕过方法 1.C#脚本 运行后会在目标机器上创建一个用户为 wh4am1 密码为 qqai@love 的 Admi ...

  6. 「题解报告」P4577 [FJOI2018]领导集团问题

    题解 P4577 [FJOI2018]领导集团问题 题解区好像没有线段树上又套了二分的做法,于是就有了这片题解. 题目传送门 怀着必 WA 的决心交了两发,一不小心就过了. 题意 求一个树上最长不下降 ...

  7. ansible 003 常用模块

    常用模块 file 模块 管理被控端文件 回显为绿色则,未变更,符合要求 黄色则改变 红色则报错 因为默认值为file,那么文件不存在,报错 改为touch则创建 将state改为directory变 ...

  8. 全局索引与分区索引对于SQL性能影响的比较

    KingbaseES 提供了对于分区表 global index 的支持.global index 不仅提供了对于唯一索引功能的改进(无需包含分区键),而且在性能上相比非global index (l ...

  9. with function 语法支持

    通过with子句,我们可以把很多原本需要存储过程来实现的复杂逻辑用一句SQL来进行表达.KingbaseES 从V008R006C004B0021 版本开始,支持 with function 语法.例 ...

  10. (一)JPA的快速入门

    JPA简介 JPA是什么 JPA 是Java Persistence API的缩写,是一套由Java官方制定的ORM标准.当制定这套标准以后,市场上就出现很多JPA框架.如:OpenJPA(apach ...