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. 从Lombok到JSR-269

    前言 Lombok的出现帮助开发人员在开发工程中消除了大部分冗余代码:繁琐的get.set方法甚至建造者模式. Lombok的实现方式是什么呢? 新建一个测试类使用Lombok的Getter和Sett ...

  2. 如何使用 IoC

    创建Maven工程,pom.xml添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project x ...

  3. 为Go项目编写Makefile

    为Go项目编写Makefile 借助Makefile我们在编译过程中不再需要每次手动输入编译的命令和编译的参数,可以极大简化项目编译过程. make介绍 make是一个构建自动化工具,会在当前目录下寻 ...

  4. 并发编程-Condition

    Condition 一个Lock中应该绑定一个Condition对象.Condition是Java提供用来实现等待/通知的类. 我们知道Object对象提供了wait.waitAll.notify.n ...

  5. 使用现代C++如何避免bugs(下)

     使用现代C++如何避免bugs(下) About virtual functions Virtual functions hinder a potential problem: the thing ...

  6. 英特尔Intel® Arria® 10 FPGA加速器设计

    英特尔Intel Arria 10 FPGA加速器设计 Introducing the Intel Vision Accelerator Design with Intel Arria 10 FPGA ...

  7. 【NX二次开发】Block UI 指定矢量

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

  8. 使用 Docker 部署 Node 应用

    容器将应用与环境打包整合,解决了应用外部依赖的痛点,打包后通过窗口可方便地部署到任意环境,用过就知道很香. 创建示例应用 以 NestJS 为例,先创建一个示例应用. $ npm i -g @nest ...

  9. 9种设计模式在Spring中的运用,一定要非常熟练

    1.简单工厂(非23种设计模式中的一种) 实现方式: BeanFactory.Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数 ...

  10. noip2006总结

    T1 能量项链 原题 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子 ...