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. Apache Jena Fuseki使用

    下载Apache Jena Fuseki 先从apache官网下载fuseki压缩包.然后解压到目标文件夹. apache官网:http://jena.apache.org/download/ 这里我 ...

  2. [leetcode] 116. 填充同一层的兄弟节点

    116. 填充同一层的兄弟节点 其实就是个二叉树的层次遍历 class Solution { public void connect(TreeLinkNode root) { if (root == ...

  3. 浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决

    浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决 ​ 在前几个月时,我们项目出现了分布式事务的问题,那么什么是分布式事务问题呢,简单的说,我们有俩服务A和B,它们对应 ...

  4. nginx的请求处理

      nginx的请求处理¶ nginx使用一个多进程模型来对外提供服务,其中一个master进程,多个worker进程.master进程负责管理nginx本身和其他worker进程. 所有实际上的业务 ...

  5. Vue之前后端交互

    Vue之前后端交互 一.前后端交互模式 接口调用方式 原生ajax 基于jQuery的ajax fetch axios 异步 JavaScript的执行环境是「单线程」 所谓单线程,是指JS引擎中负责 ...

  6. CVPR2019目标检测论文看点:并域上的广义交

    CVPR2019目标检测论文看点:并域上的广义交 Generalized Intersection over Union Generalized Intersection over Union: A ...

  7. Redis系列(四):地理信息

    除了Bitmaps和HyperLogLog,Redis还提供了关于地理空间的相关操作,主要是经纬度.Redis提供的地理信息操作是有误差的,最大误差可能会达到5%.Redis提供的Geo的操作如下: ...

  8. dataguard日志损坏处理

    ===== 问题 ===== 日志损坏无法应用日志(开启MRP应用系统会因无法应用日志而关闭) Completed: ALTER DATABASE RECOVER MANAGED STANDBY DA ...

  9. 深入理解java虚拟机笔记Chapter4

    JDK命令行工具 其中的重中之重是 jstat 命令!而它最常用的参数就是 -gcutil,使用格式如下: jstat -gcutil [pid] [intervel] [count] 输出如下 D: ...

  10. 面试官:给我讲讲SpringBoot的依赖管理和自动配置?

    1.前言 从Spring转到SpringBoot的xdm应该都有这个感受,以前整合Spring + MyBatis + SpringMVC我们需要写一大堆的配置文件,堪称配置文件地狱,我们还要在pom ...