Excelファイルをアップロードし、OLEDBを使用して接続し、データを読み取ります。「microsoft.ACE.oledb.12.0」はローカルコンピューターに登録されていません。

序文

最近、プロジェクトにExcelファイルをアップロードしてインポートし、ファイル内の情報を取得して、ビジネスニーズや一部のデータ処理に応じてデータベースに保存する必要があります。私がそれをどのようにしたかを紹介しましょう。

アイデア

(1)フロントページにファイルアップロードボタンがあります(素敵なボタンが必要な場合は、独自のスタイルを設定するか、layUIのボタンを使用できます)
(2)JSのFormData()オブジェクトを使用して、アップロードするファイルをappend()に追加します入ってください。AJAXを使用してインターフェイスを呼び出し、HttpPostedFileを使用してバックエンドで受信します。これはRequest.Files [0]です。
(3)クライアントによってアップロードされたファイルを取得した後、この場所では、一部のファイルタイプの検証など、ファイルの検証処理を実行できます。イメージファイル、エクセルファイルなど。問題なくローカルファイルにアップロードした後、HttpPostedFileオブジェクトを使用している場合は、彼の保存メソッドSaveAs( "save path")の1つを直接呼び出すことができます
(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)最初に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ファイル

(1)構文形式は次のとおりです
。Provider= Microsoft.ACE.OLEDB.12.0; Data Source =アップロードされたファイルアドレス; Extended Properties = "Excel 12.0 Xml; HDR = YES; IMEX = 1";

Xlsbファイル

(2)構文形式は次のとおりです
。Provider= Microsoft.ACE.OLEDB.12.0; Data Source =アップロードされたファイルアドレス; Extended Properties = "Excel 12.0; HDR = YES"; ";

Xlsmファイル

(3)文法形式は次のとおりです
。Provider= Microsoft.ACE.OLEDB.12.0; Data Source = Uploaded file address; 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ステートメントもほとんど同じです。次に、私の文字列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