上传Excel文件,使用OLEDB连接并读取数据,未在本地计算机上注册“microsoft.ACE.oledb.12.0“

前言

最近有在项目中需要上传导入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 解决方案

最后

今天的分享就到此结束了。有问题,当然可以下方留言。欢迎指正。一起学习,共同进步

猜你喜欢

转载自blog.csdn.net/WenRouDG/article/details/108961699