1.前端(vue)代码

2.公共类ExcelHelper

3.后端(netcore)代码

思路:导入类似于上传,将excel上传后将流转换为数据

1.前端(Vue)代码

这里使用的是ElementUI的el-upload上传控件

需要注意的是http-request方法,每次上传文件,该方法都会被调用一次,所以后台处理的时候一次只处理一个文件

<el-col :span="1">
<el-upload
class="upload-demo"
action="#"
accept=".xls,.xlsx"
multiple
:http-request="importVeteranDiretoryExcel"
:file-list="fileListIntroduce">
<el-button size="small" type="primary">导入</el-button>
</el-upload>
</el-col> data(){ return { fileListIntroduce: [], //导入列表 } } methods:{ //目录导入
importVeteranDiretoryExcel(params){
// console.log(params.file);
let dType = null;
//判断是第几部分
if(this.tabVal === 'fristTab') {
dType = 0;
} else if(this.tabVal === 'secondTab') {
dType = 1;
} else if (this.tabVal === 'thirdlyTab') {
dType = 2;
}
let _this = this;
let formData = new FormData();
formData.append("file",params.file);
formData.append("vId",this.id);
formData.append("dType",dType);
importVeteranDiretory(formData).then((res)=>{
if (res.data.success == true) {
this.$message({
type:"success",
message: res.data.msg
});
} else if(res.data.success == false) {
this.$message({
type:"warning",
message: res.data.msg
});
}
this.fileListIntroduce=[];
if(this.tabVal === 'fristTab') {
this.onFirstTab();
} else if(this.tabVal === 'secondTab') {
this.onSecondTab();
} else if (this.tabVal === 'thirdlyTab') {
this.onThirdlyTab();
}
});
} }

2.公共类ExcelHelper

目前只用到了导入,如果后期用到导出会再更新

public class ExcelHelper
{
/// <summary>读取excel
/// 默认第一行为表头,导入第一个工作表
/// </summary>
/// <param name="strFileName">excel文档路径</param>
/// <returns></returns>
public static DataTable Import(string strFileName)
{
DataTable dt = new DataTable(); HSSFWorkbook hssfworkbook;
using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
{
hssfworkbook = new HSSFWorkbook(file);
}
ISheet sheet = hssfworkbook.GetSheetAt(0);
System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); IRow headerRow = sheet.GetRow(0);
int cellCount = headerRow.LastCellNum; for (int j = 0; j < cellCount; j++)
{
ICell cell = headerRow.GetCell(j);
dt.Columns.Add(cell.ToString());
} for (int i = (sheet.FirstRowNum + 2); i <= sheet.LastRowNum; i++)
{
IRow row = sheet.GetRow(i);
DataRow dataRow = dt.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null)
dataRow[j] = row.GetCell(j).ToString();
}
dt.Rows.Add(dataRow);
}
return dt;
} }

3.后端(netcore)代码

接口其实是可以接受多文件的

        /// <summary>
/// excel导入
/// </summary>
/// <param name="formCollection">表单集合值</param>
/// <returns>服务器存储的文件信息</returns> [HttpPost]
public MessageModel<string> ImportVeteranDiretory(IFormCollection formCollection)
{
List<TBase_VeteranDirectory> directorylist = new List<TBase_VeteranDirectory>();
var vId = Request.Form["vId"];
var dType = Request.Form["dType"];
int cnt = 0;
try
{
//FormCollection转化为FormFileCollection
var files = (FormFileCollection)formCollection.Files;
//List<TBase_VeteranDirectory> directorylist = new List<TBase_VeteranDirectory>();
if (files.Any())
{
PdfLeadingHelper.DelectDir(PathHelper.VeteranDiretoryExcel);
foreach (var file in files)
{ string filePath = string.Empty;
//文件保存
using (var fs = System.IO.File.Create($"{PathHelper.VeteranDiretoryExcel}\\{file.FileName}"))
{
file.CopyTo(fs);
fs.Flush();
} DataTable dt = ExcelHelper.Import($"{PathHelper.VeteranDiretoryExcel}\\{file.FileName}");
foreach (DataRow dr in dt.Rows)
{
TBase_VeteranDirectory directory = new TBase_VeteranDirectory();
directory.VId = int.Parse(vId);
directory.DType = int.Parse(dType);
directory.MaterialName = dr[0].ToString(); if (dr[1].ToString() == "")
directory.MaterialYear = null;
else
directory.MaterialYear = int.Parse(dr[1].ToString()); if (dr[2].ToString() == "")
directory.MaterialMonth = null;
else
directory.MaterialMonth = int.Parse(dr[2].ToString()); if (dr[3].ToString() == "")
directory.MaterialDay = null;
else
directory.MaterialDay = int.Parse(dr[3].ToString()); //directory.MaterialYear = dr[1].ToString() == "" ? (null) : int.Parse(dr[1].ToString());
//directory.MaterialMonth = dr[2].ToString() == "" ? 0 : int.Parse(dr[2].ToString());
//directory.MaterialDay = dr[3].ToString() == "" ? 0 : int.Parse(dr[3].ToString());
directory.Page = dr[4].ToString() == "" ? 0 : int.Parse(dr[4].ToString());
directory.Collator = dr[5].ToString() ?? "";
directory.CreateBy = _user.Name;
directory.CreateId = _user.ID;
if (!string.IsNullOrEmpty(directory.MaterialName))
{
directorylist.Add(directory);
}
}
cnt = _tVeteranDiretoryService.Add(directorylist).Result;
}
}
else
{
return new MessageModel<string>()
{
msg = "导入失败,未检测上传的文件信息",
success = cnt > 0,
response = cnt.ObjToString()
};
}
}
catch (Exception ex)
{
log.Error($"{ex.ToString()}");
return new MessageModel<string>()
{
msg = "导入失败,请检查文件内容" + ex.Message,
success = cnt > 0,
response = cnt.ObjToString()
};
} if (directorylist.Any())
{
//_tImgDetailInfoService.Add(insertPicData);
return new MessageModel<string>()
{
msg = "导入成功,成功导入" + cnt + "条信息",
success = cnt > 0,
response = cnt.ObjToString()
};
}
else
{
return new MessageModel<string>()
{
msg = "网络打瞌睡了,导入失败",
success = cnt > 0,
response = cnt.ObjToString()
};
}
}

netcore3.1 + vue (前后端分离)Excel导入的更多相关文章

  1. netcore3.1 + vue (前后端分离) ElementUI多文件带参数上传

    vue前端代码 前端主要使用了ElementUI的el-uploda插件,除去业务代码需要注意的是使用formdata存储片上传时所需的参数 <el-upload class="upl ...

  2. netcore3.1 + vue (前后端分离) IIS 部署

    1.安装 aspnetcore-runtime-3.1.1-win-x64.exe 2.安装dotnet-hosting-3.1.1-win.exe 3.安装urlrewrite和applicatio ...

  3. netcore3.1 + vue (前后端分离)生成PDF(多pdf合并)返回前端打印

    1.使用Adobe Acrobat XI Pro编辑pdf模板 2.公共类代码 3.service层调用 4.Controller层 5.前端(Vue) 因为print.js不支持宋体,所以打算用后台 ...

  4. Springboot+vue前后端分离项目,poi导出excel提供用户下载的解决方案

    因为我们做的是前后端分离项目 无法采用response.write直接将文件流写出 我们采用阿里云oss 进行保存 再返回的结果对象里面保存我们的文件地址 废话不多说,上代码 Springboot 第 ...

  5. Flask + vue 前后端分离的 二手书App

    一个Flask + vue 前后端分离的 二手书App 效果展示: https://blog.csdn.net/qq_42239520/article/details/88534955 所用技术清单 ...

  6. 解决Django+Vue前后端分离的跨域问题及关闭csrf验证

      前后端分离难免要接触到跨域问题,跨域的相关知识请参:跨域问题,解决之道   在Django和Vue前后端分离的时候也会遇到跨域的问题,因为刚刚接触Django还不太了解,今天花了好长的时间,查阅了 ...

  7. 喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了

    折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...

  8. 两个开源的 Spring Boot + Vue 前后端分离项目

    折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...

  9. beego-vue URL重定向(beego和vue前后端分离开发,beego承载vue前端分离页面部署)

    具体过程就不说,是搞这个的自然会动,只把关键代码贴出来. beego和vue前后端分离开发,beego承载vue前端分离页面部署 // landv.cnblogs.com //没有授权转载我的内容,再 ...

随机推荐

  1. Linux下记录登录用户历史操作

    前言:众所周知Linux是一个可以同时让多个用户登录的操作系统,每个用户的操作都影响着Linux运行,除了要做好安全工作以外,防止人为恶意损坏也是很关键的,比如有人恶意执行危险命令,要查找就得记录所有 ...

  2. node.js学习(3)模块

    1.创建文件 count.js 2 调用 3 改造 4 调用 5 再改造 6 在再改造

  3. 使用Jprofiler分析Java项目的内存开销情况并利用强制回收控制内存

    一.问题背景 自己开发的Java项目中占用太多的Heap Space.即使在Eclipse的虚拟机参数中设置"-Xms128m -Xms2048m -XX:MetaspaceSize=512 ...

  4. ALD技术产品形态

    ALD技术产品形态 原子层沉积研究设备 TFS 200是适合科学研究和企业研发的最灵活的ALD平台.倍耐克 TFS 200专门设计用于多用户研究环境中把可能发生的交叉污染降至最低. 大量的可用选项和升 ...

  5. CUDA 7流简化并发

    CUDA 7流简化并发 异构计算是指有效使用系统中的所有处理器,包括CPU和GPU.为此,应用程序必须在多个处理器上同时执行功能.CUDA应用程序通过在流(按顺序执行的命令序列)中,执行异步命令来管理 ...

  6. Postman之newman的安装

    一.newman简介:newman是为Postman而生,专门用来运行Postman编写好的脚本:使用newman,你可以很方便的用命令行来执行postman collections. 二.newma ...

  7. 牛客网论坛最具争议的Java面试成神笔记,牛客网下载量已突破十万

    程序员内部一直流传这一句话: 面试看牛客 刷题看力扣 牛客网作为国内最牛的程序员面试网站,一直在程序员内部颇负盛名,其中用户更是卧虎藏龙! 有国内一线大厂的企业招聘 还有一些低调的互联网大牛实力就和天 ...

  8. 剑指 Offer 07. 重建二叉树

    链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/ 标签:树.递归 题目 输入某二叉树的前序遍历和中序遍历的结果,请重建该二 ...

  9. 关于Linux服务器部署

    服务器信息: 此小节的内容: SecurityCRT:用来连接到Linux服务器命令操作. FTP(FTPRush):本地文件和Linux服务器文件交互的 工具服务器 借助客户端工具来链接到Linux ...

  10. 【dp】10-15题解 snake vs block

    snake vs block 题目描述 Tgopknight最近迷上了一款叫做Snake vs Block的游戏,他总觉得他自己玩出的不是最优解,但是他忙于享受游戏的乐趣,只好请你帮忙找出最优解. S ...