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. 开源月刊《HelloGitHub》第 62 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这里有实战项目.入门教程.黑科技.开源书籍.大厂开源项目等,涵盖多种编程语言 Pyt ...

  2. TcaplusDB君 · 行业新闻汇编(5月25日)

    TcaplusDB君一直密切关注着游戏行业和数据库行业的动态.以下是TcaplusDB君收集的近期的游戏行业和数据库行业的新闻,汇编整理,献给大家观看. (本篇文章部分内容来自网络) 第十一届中国数据 ...

  3. 治理对象ing

    计算治理项包括产出表未被读.暴力扫描.数据膨胀.数据倾斜.出错节点.导入为空和输入为空. 存储的治理项包括生命周期过长.未管理表.废弃表.空表.逻辑未管理表.逻辑废弃表.逻辑空表和黑盒物化空表.

  4. 90%的人都不知道的Node.js 依赖关系管理(下)

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://dzone.com/articles/node-dependency-manage ...

  5. xss-代码角度理解与绕过filter

    0x00 原理   xss全称为cross site scripting,中文为跨站脚本攻击.它允许web用户将恶意代码植入到提供给用户使用的页面.代码包括HTML代码和客户端脚本. 0x01 危害 ...

  6. python 定时任务APScheduler 使用介绍

    python 定时任务APScheduler 使用介绍   介绍: APScheduler的全称是Advanced Python Scheduler.它是一个轻量级的 Python 定时任务调度框架. ...

  7. RedisPool

    class RedisPool(object): instance = None def __init__(self, host='192.168.2.129', port=7000, passwor ...

  8. 使用ONNX将模型转移至Caffe2和移动端

    使用ONNX将模型转移至Caffe2和移动端 本文介绍如何使用 ONNX 将 PyTorch 中定义的模型转换为 ONNX 格式,然后将其加载到 Caffe2 中.一旦进入 Caffe2, 就可以运行 ...

  9. python+selenium基础篇,By定位元素

    1.By定位和find_element_by_XXXXXX是一样的,如下图所示,定位元素的方法都是一样的 2.使用By定位代码如下所示 from selenium import webdriver f ...

  10. jmeter工作目录介绍、jmeter元件及组件介绍

    一.jmeter工作目录介绍: bin:放置各项配置文件(如日志设置.JVM设置).启动文件.启动Jar包.示例脚本等: docs:放置JMeter API的离线帮助文档: extras:JMeter ...