导入不同业务数据通过Excel实现
很多公司都用到了老系统移植到新系统,数据自然也需要迁移,这个解决方案之一就是使用Excel文件导入。
结合公司实现,然后简单写了个Demo。
(PS:去找朋友本想着花几十分钟弄出来炫耀一波,结果花了三四个小时。究其原因,还是JS问题,JS以后尽量放在Html后面,这样就不用担心渲染问题了。)
首先上效果图:



下面介绍下具体实现:
--将学生和课程数据导入到数据库
--以stu开头的是学生,以tea开头的是老师 后面加个_区分学校
--创建学生老师学校表
--下载导入文件
--根据规则匹配学校,然后决定插入学生表还是老师表
--显示导入结果
--学校表
--主键Id,学校名称,学校编号
--学生表
--主键Id,学生姓名,学生年级,学生年龄,所在学校
--老师表
--主键Id,老师姓名,老师年龄,所在学校
create table School(
Id int primary key identity,
Name nvarchar(),
Num nvarchar()
)
create table Student(
Id int primary key identity,
Name nvarchar(),
Grade int,
Age int,
SchoolNum nvarchar()
) create table Teacher(
Id int primary key identity,
Name nvarchar(),
Age int,
SchoolNum nvarchar()
)
后台代码实现:
using ExportExcelDemo.Core;
using ExportExcelDemo.Core.Helper;
using ExportExcelDemo.Core.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc; namespace ExportExcelDemo.Web.Controllers
{
public class HomeController : Controller
{
private const string prefix_stu = "stu";
private const string prefix_tea = "tea";
public readonly string[] _fileTypes = { prefix_stu, prefix_tea };
public ActionResult Index()
{ SchoolManager schoolManager = new SchoolManager();
string schoolNum = schoolManager.GetSchoolNum("廊坊师范学院");
ViewBag.SchoolNum = schoolNum;
return View();
} [HttpPost()]
public JsonResult ImportData()
{
try
{
//文件类型,学校编号
Tuple<string, string, HttpPostedFileBase> tuble = ValidateFile();
var file = tuble.Item3;
var server = HttpContext.Server;
string tempFileDownloadFolder = server.MapPath("~/Temp/Downloads");
AppFileHelper.DeleteFilesInFolderIfExists(tempFileDownloadFolder, file.FileName);
//保存到临时文件夹
var tempFilePath = Path.Combine(tempFileDownloadFolder, file.FileName);
file.SaveAs(tempFilePath);
string r = string.Empty;
r = ImportDataInteral(tempFilePath, tuble.Item1, tuble.Item2); return Json(r); }
catch (Exception ex)
{
return Json(ex.Message);
}
} /// <summary>
/// 验证文件是否合规
/// </summary>
/// <returns></returns> public Tuple<string, string, HttpPostedFileBase> ValidateFile()
{
if (Request.Files.Count <= || Request.Files[] == null)
{
throw new Exception("未找到文件");
}
var file = Request.Files[];
if (file.ContentLength > * * ) //5m
{
throw new Exception("文件不能超过5M");
}
string[] names = System.IO.Path.GetFileNameWithoutExtension(file.FileName).Split('_');//下划线分隔
string msg = "文件名称错误,请根据导入提示来修改文件名称";
if (names.Length != )
{
throw new Exception(msg);
}
if (!_fileTypes.Contains(names[].ToLower()))
{
throw new Exception(msg);
}
if (string.IsNullOrWhiteSpace(names[]))
{
throw new Exception(msg);
}
SchoolManager schoolManager = new SchoolManager();
string schoolNum = schoolManager.GetSchoolNum(names[]);
if (string.IsNullOrEmpty(schoolNum))
{
throw new Exception("传入的学校名不存在");
}
return new Tuple<string, string, HttpPostedFileBase>(names[], names[],file); } private string ImportDataInteral(string filePath,string fileDateType,string schoolNum)
{
DataSet ds = ExeclHelper.ToDataTable(filePath);//根据文件路径转换为
DataTable dt = ds.Tables[]; int rowsCount = dt.Rows.Count;
int totalRows = rowsCount; StringBuilder successMessage = new StringBuilder();
StringBuilder errMessage = new StringBuilder(); Action<DataRow, string> action;
switch (fileDateType)
{
case prefix_stu:
action = RowDataProcessForStu;break;
case prefix_tea:
action = RowDataProcessForTea;break;
default:
return errMessage.Append($"文件名前缀{fileDateType}错误").ToString();
}
for (int i = ; i < dt.Rows.Count; i++)
{
DataRow dr = dt.Rows[i];
try
{
action(dr, schoolNum);
successMessage.Append($"第{i + 1}行:导入成功\r\n");
}
catch (System.Exception ex)
{
var error = $"第{i + 1}行 :{ex.Message}\r\n";
errMessage.Append(error);
continue;
}
}
return errMessage.ToString() + successMessage.ToString(); } private void RowDataProcessForStu(DataRow dr,string schoolNum)
{
Student model = new Student();
model.Name = dr[].ToString();
model.Grade =Convert.ToInt32(dr[]);
model.Age=Convert.ToInt32(dr[]);
model.SchoolNum = schoolNum;
StudentManager studentManager = new StudentManager();
studentManager.InsertStudent(model); } private void RowDataProcessForTea(DataRow dr, string schoolNum)
{
Teacher model = new Teacher();
model.Name = dr[].ToString();
model.Age = Convert.ToInt32(dr[]);
model.SchoolNum = schoolNum;
TeacherManager teacherManager = new TeacherManager();
teacherManager.InsertTeacher(model);
} }
}
前台Html实现:
@{
ViewBag.Title = "导入数据";
}
<div class="page-title">
<div class="title-env">
<h1 class="title"><i class="fa fa-file-text"></i>导入</h1>
</div>
<div class="breadcrumb-env">
</div>
</div>
<div class="row form-leftlabel">
<div class="col-md-12">
<div class="row">
<div class="col-sm-12">
<div class="panel panel-default">
<div class="panel-heading">
<h1 class="panel-title">导入说明</h1>
</div>
<div class="panel panel-default">
<div class="panel-body">
<form class="form-horizontal form-leftlabel">
<div class="form-group">
<label class="col-sm-3 control-label">学生数据:</label>
<div class="col-sm-7">
<label> Execl文件名称规则:<b>stu_学校名称</b>,如:stu_学校名称</label>
<div class="form-group">
<a class="btn btn-default" href="~/Temp/Downloads/stu_学校名称.xlsx" download="学生信息导入.xlsx">下载学生模板文件<i class="fa-download"></i></a>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">老师数据:</label>
<div class="col-sm-7">
<label> Execl文件名称规则:<b>tea_学校名称</b>,如:tea_学校名称</label>
<div class="form-group">
<a class="btn btn-default" href="~/Temp/Downloads/tea_学校名称.xlsx" download="老师信息导入.xlsx">下载老师模板文件<i class="fa-download"></i></a>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h1 class="panel-title">导入操作</h1>
</div>
<div class="panel-body">
<form id="DataImportForm" method="POST" action="@Url.Action("ImportData", "Home", new {area = string.Empty})">
<div class="col-sm-7">
<input type="file" placeholder="选择模板文件并上传" name="selectExecl" value="" class="form-control " id="selectMemberTxt"
accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" />
</div>
<div class="col-sm-5">
<button class="button button-plain2 button-rounded" type="submit" id="btnImport">导入</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="panel panel-default">
<div class="panel-heading">
<h1 class="panel-title">导入结果</h1>
</div>
<div class="panel-body">
<div class="col-sm-7">
<textarea id="verifyResult" class="form-control" value="" rows=""></textarea>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="~/Scripts/jquery-3.3.1.min.js"></script>
<script src="~/Scripts/jquery.form.js"></script><!--提交表单-->
<link href="~/Content/jquery-ui/jquery-ui.min.css" rel="stylesheet" />
<script src="~/Content/layer/layer.js"></script><!--layer控件-->
<script src="~/Content/ExportExcel.js"></script>
ExportExcel.js实现:
var index;
//Appearance/Logo
$('#DataImportForm').ajaxForm({ beforeSubmit: function (formData, jqForm, options) { var $fileInput = $('#DataImportForm input[name=selectExecl]');
var files = $fileInput.get()[].files; if (!files.length) {
layer.msg("请选择execl文件", { icon: });
return false;
} var file = files[]; var type = file.name.substring(file.name.lastIndexOf(".")).toLowerCase();
if (type != '.xlsx') {
layer.msg("请选择后缀名为.xlsx格式的excel文件", { icon: });
return false;
} //File size check
if (file.size > * * ) //5m
{
layer.msg("文件不能超过5m", { icon: });
return false;
}
$('#verifyResult').val("");
index =layer.msg("导入中...", {
icon:
, shade: 0.5,
time: false //取消自动关闭
}); return true;
},
success: function (response) { $('#verifyResult').val(response);
layer.close(index);//手动关闭 }
});
码云连接: https://gitee.com/shuai7boy/ExportExcelDemo
导入不同业务数据通过Excel实现的更多相关文章
- 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件
小程序导入,别人导出的数据库json文件,错误信息如下: 导入数据库失败, Error: Poll error, 导入数据任务(id:373985)异常,错误信息:解析导入文件错误,请检查导入文件内容 ...
- SQL SERVER 导入、导出数据到Exce(使用OpenRowset,、OpenDataSource函数)以及访问远程数据库(openrowset/opendatasource/openquery)
启用Ad Hoc Distributed Queries 在使用openrowset/opendatasource前搜先要启用Ad Hoc Distributed Queries服务,因为这个服务不安 ...
- 销售合同金额数据从Excel导入
一.业务需求 1.新增了销售合同金额的字段,但是老数据没有这个字段:所以销售合同金额从销售合同附件的各品种金额之和. 2.制作好excel字段模板,将此模板发送给销售业务部门来统计并完成excel表格 ...
- 如何从投票的网站的管理后台导出已投票的邀请码数据至Excel,并且稍修改,再导入到现场抽奖软件中?
第一步:进入投票网站的管理后台,导出 已投票 的 邀请码 相关信息至Excel中,下图所示: 并且 删除第一行表头汉字信息. 第二步:把第A列 数值 信息 转换 为 文本 信息(注:转换方法详细点击此 ...
- Excel连接到MySQL,将Excel数据导入MySql,MySQL for Excel,,
Excel连接到MySQL 即使当今时代我们拥有了类似微软水晶报表之类的强大报表工具和其他一些灵活的客户管 理应用工具,众多企业在分析诸如销售统计和收入信息的时候,微软的Excel依然是最常用的工具. ...
- pl/sql 如何将Excel文件数据导入oracle的数据表?
1.准备导入数据的excel文件 注意:excel列名和数据表列名必须相同,excel文件sheet2和sheet3可以删除 1)excel文件格式 2)数据表格式 2.打开pl/sql ,找到工具- ...
- C#导入导出数据到Excel的通用类代码
Excel文件导入导出,需引用Microsoft Excel 11.0 Object Library ///////////////////////////////////////////////// ...
- .NET环境下导出Excel表格的两种方式和导入两种类型的Excel表格
一.导出Excel表格的两种方式,其中两种方式指的是导出XML数据类型的Excel(即保存的时候可以只需要修改扩展名为.xls)和真正的Excel这两种. using System; using Sy ...
- 使用POI导出百万级数据到excel的解决方案
1.HSSFWorkbook 和SXSSFWorkbook区别 HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls,一张表最大支持65536行数据,256列 ...
随机推荐
- 网络编程_socketserver
一.socketserver 网络编程 1.socketserver支持多用户并发处理:2.socketserver是对socket的再封装;处理步骤:1.创建一个socketserver类2.继承B ...
- Bullet:Python的函数中参数是引用吗?
别的语言中关于函数有传值和传引用的区分. 关于此,流传很广的一个说法是 他们在现象的区别之一就是值传递后的变化,受到影响的就是引用,未受到影响的就是传值. 在学习中,也曾碰到过这个问题,网上关于这 ...
- Spring框架学习之SpringAOP(二)
AOP概念 AOP(Aspect-Oriented Programming,面向切面编程),AOP是OOP(面向对象编程)的补充和完善 AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用 ...
- 338. Counting Bits(动态规划)
Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the ...
- 清北学堂模拟赛d1t3 听音乐(music)
题目描述 LYK喜欢听音乐,总共有n首音乐,有m个时刻,每个时刻LYK会听其中一首音乐,第i个时刻会听第ai首音乐.它给自己定了一个规定,就是从听音乐开始,听的每连续n首音乐都是互不相同的.例如当n= ...
- poj1330 lca 最近公共祖先问题学习笔记
首先推荐两个博客网址: http://dongxicheng.org/structure/lca-rmq/ http://scturtle.is-programmer.com/posts/30055. ...
- JAVA大数据项目+整理的Mysql数据库32条军规
http://www.jianshu.com/users/a9b2d43bb94e/latest_articles
- sqlyog
https://github.com/webyog/sqlyog-community/wiki/Downloads
- CF #329 D
D题,LCA是很明显的.要注意的是,因为是除法,所以最多可以除x>2的有64次,当大于64时可以直接返回0.而且注意到可能会有很多值为1的边,可以使用路径压缩,把边为1的边压缩掉,类似于并查集的 ...
- nyoj 95
#include<stdio.h> #include<queue> #include<algorithm> using namespace std; stru ...