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. 浅析PriorityBlockingQueue优先级队列原理

    介绍 当你看本文时,需要具备以下知识点 二叉树.完全二叉树.二叉堆.二叉树的表示方法 如果上述内容不懂也没关系可以先看概念. PriorityBlockingQueue是一个无界的基于数组的优先级阻塞 ...

  2. 在windows上 使用celery 报错

    在windows上 使用celery 报错       在windows上 使用celery 报错 ValueError: not enough values to unpack (expected ...

  3. 查询rman备份信息常用指令

      查询rman备份信息常用指令 ----登陆到rman $rman target / ----以精简的格式查看备份信息 RMAN> list backup of database summar ...

  4. 华为4D成像雷达、智能驾驶平台MDC 810

    华为4D成像雷达.智能驾驶平台MDC 810 2020年10月底,华为发布了HI品牌,在今年2021年上海国际车展前夕,华为以 "专新致智" 为主题,举办HI新品发布会,发布了包括 ...

  5. 向Relay添加算子

    向Relay添加算子 为了在Relay IR中使用TVM算子,需要在Relay中注册算子,以确保将其集成到Relay的类型系统中. 注册算子需要三个步骤: 使用RELAY_REGISTER_OPC + ...

  6. CentOS 7 部署 node 项目

    CentOS 7 部署 node 项目 安装 node 环境 方法一:使用 wget 的方式下载压缩包进行解压 淘宝node镜像地址,进入地址选择自己想要安装的版本 wget https://npm. ...

  7. UiPath 中 List 集合的实例化与使用

    >>>跳过BB,空降正文<<< 目录 前言 正文 1. 创建 List 变量 2. 实例化 List 变量 3. 集合的使用 后记 前言 大家好呀,我是 白墨,一个 ...

  8. LeetCode 每日一题「判定字符是否唯一」

    我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. 题目 ...

  9. 【NX二次开发】Block UI 指定位置

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  10. 空指针的解决方案Optional包装类

    有道云笔记地址 (建议有道云打开,markdown文档,直接拷贝过来有一些问题) 引言 在java的开发中,有一个问题始终会伴随着开发的进程.记得我第一个项目的时候,有一个同事在评论我的代码的时候说到 ...