前言
最近有在项目中需要上传导入Excel文件,来获取文件内的信息,根据业务的需求以及一些数据的处理,来保存在数据库中。下面我来介绍我是如何实现的。
思路
(1)前端页面上有个文件上传按钮(如果要好看的按钮,可以自己设样式,或者使用layUI的按钮)
(2)在JS中使用FormData() 对象,将需要上传的文件append()追加进去。使用AJAX调用接口,在后端 使用 HttpPostedFile 来接收,也就是Request.Files[0]
(3)获取到客户端上传的文件之后,这个地方可以对文件的一些验证处理,比如一些文件类型的验证,是否为图像文件,excel文件等。没问题之后对他进行上传到本地文件,如果使用的是 HttpPostedFile对象,那么可以直接调用他的一个保存方法SaveAs(“保存的路径”)
(4)文件上传之后,使用OleDb 对象来读取。一边读取的同时,就可以按需取数来保存至数据库。
具体实现
JavaScript 代码
//点击上传Excel事件,我这里使用的是Layui的上传文件按钮,所以事件也是使用的是它的格式。
upload.render({
elem: '#btn_Excel'
, url: '/'
, auto: false
, acceptMime: ".xlsx,.xls"
, before: function (obj) {}
, type: "file"
, accept: 'file' //普通文件
, choose: function (obj) {
var files = obj.pushFile();
obj.preview(function (index, file, result) {
var formData = new FormData();
//这里这个file就是我们选择好了的文件对象
//将它追加在FormData对象中
formData.append("file", file);
$.ajax({
url: "/后端接口",//填写你自己的后端接口
type: 'POST',
data: formData,
// 告诉jQuery不要去处理发送的数据
processData: false,
// 告诉jQuery不要去设置Content-Type请求头
contentType: false,
beforeSend: function () {
layui.use('layer', function () {
layerloadindex = layer.load(1, {
shade: [0.1, '#fff'] //0.1透明度的白色背景
, content: '文件上传中...请稍候...',
success: function (layero) {
layero.find('.layui-layer-content').css({
'padding-top': '39px',
'width': '180px'
});
}
});
});
},
success: function (data) {
if (data == "true") {
//关闭 加载动画
layer.close(layerloadindex);
//给出提示
layer.msg('文件上传成功!!');
} else { layer.msg(data); }
},
error: function (data) {
layer.close(layerloadindex);
layer.msg(data);
}
});
});
}
, done: function (res) {}
, error: function () {}
});
后端代码 (我这边使用到的是一般处理文件)
/// <summary>
/// Excel文件读取
/// </summary>
/// <param name="Postfile"></param>
/// <param name="cDate"></param>
/// <returns></returns>
private string RdIn_upload_keep(HttpPostedFile Postfile, string cDate)
{
//对文件日期进行检查
cDate = dyTools.checkTools.CheckDateFormation(cDate);
if (cDate == "") cDate = DateTime.Now.ToString("yyyy-MM-dd");
//【这里可以执行,上传是否重复可以考虑对数据库进行覆盖即是对表的删除】
//这里是将时间转化成年月模式,比如2020-10-01 处理之后就是2020-10
cDate = cDate.Split('-')[0] +'-'+ cDate.Split('-')[1];
//将存取Excel的虚拟路径映射为物理路径
string cPath = HttpContext.Current.Request.MapPath("/Content/excel");
//获取文件名字
string cFileName = Path.GetFileName(Postfile.FileName);
//获取文件的扩展名
string cFileExt = Path.GetExtension(cFileName);
if (cFileExt != ".xlsx") return "Excel文件不正确";
//生成一个新文件名称
string cNewFileName = Guid.NewGuid().ToString();
cNewFileName = cPath + "\\" + cNewFileName + cFileExt;
Postfile.SaveAs(cNewFileName);
那这个地方就已经是对Excel文件的保存了,那么之后需要做的就是使用OLEDB对象连接读取了。
(1)首先导入命名空间 using System.Data.OleDb;
导入完成之后,那么就可以接下来的操作了。
注意哦,是紧接上面方法的代码啊。
OleDbConnection dbOle = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + cNewFileName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'");
try { dbOle.Open(); }
catch{return "不能打开EXCEL文件";}
OleDbCommand dbOleCommand = dbOle.CreateCommand();
string cSheet = "Sheet1";
OleDbConnection 数据源连接对象(里面参数是连接字符串)这个地方就要注意了,不同的文件后缀,连接字符串是不同的
例如:
Xlsx文件
(一)以下 是语法格式:
Provider= Microsoft.ACE.OLEDB.12.0; Data Source= 上传的文件地址; Extended Properties= “Excel 12.0 Xml;HDR=YES;IMEX=1”;
Xlsb文件
(二)以下 是语法格式:
Provider= Microsoft.ACE.OLEDB.12.0; Data Source= 上传的文件地址; Extended Properties= “Excel 12.0;HDR=YES”;";
Xlsm文件
(三)以下 是语法格式:
Provider= Microsoft.ACE.OLEDB.12.0; Data Source= 上传的文件地址; Extended Properties= “Excel 12.0 Macro;HDR=YES”;;
所以我们这边需要的是Xlsx文件 ,所用到的连接字符串为第一个,同时我们只需要把Excel当做是一个数据库就好了,那么读取表那就好说了。
比如我们现在读取数据
OleDbCommand dbOleCommand = dbOle.CreateCommand();
string cSheet = "Sheet1";
dbOleCommand.CommandText = "SELECT * FROM [" + cSheet + "$]";
OleDbDataReader dbOleRec = dbOleCommand.ExecuteReader();
就这样读取就好了,有CommandText 属性,还有ExecuteReader()对象,就连sql语句都差不多是相通的。那我这里string cSheet = “Sheet1”; 为什么是Sheet1呢?那大家就需要根据自己的情况而定了。
既然都ExecuteReader 出来了,想必大家知道该怎么做了吧。
if (dbOleRec.HasRows)
{
while (dbOleRec.Read())
{
//就在这个地方读取就好了
}
}
注意: 读取的时候按索引来,不要按Excel中上面的A,B,C,D……AA什么的来。dbOleRec[0].ToString()。接下来可以根据自己的业务需求来进行数据的处理,或者保存至数据库。
走到这一步来了,那么你就会碰到一些问题。
未在本地计算机上注册“microsoft.ACE.oledb.12.0”
看到了吗,同志们,我也是栽到这个坑里面来的,我也找了好久的解决方案。哈哈哈没事,我给大家推荐他的解决方案吧,我就是使用到他的办法,最终解决了!未在本地计算机上注册“microsoft.ACE.oledb.12.0 解决方案
最后
今天的分享就到此结束了。有问题,当然可以下方留言。欢迎指正。一起学习,共同进步