2017-01-23 61 views
0

我寫了一個簡單的應用程序來將excel數據上傳到sql。我正在使用ADO.NET和OLEDB。所以我有一個目前在sql服務器上只包含ProbeID(這是自動生成的)和ProbeName(這是我從我的xls文件中檢索到)兩個字段的表。我的Excel文件包含一堆列,但我只需要探針名稱。所以當應用程序讀取文件並存儲到oledb時,似乎Name字段總是保持爲空,並且當它插入到db表中時,它將插入適當數量的行,但具有空ProbeName值。我無法弄清楚我的代碼中的問題在哪裏。這是我的上傳方法。我究竟做錯了什麼?使用ASP.NET MVC插入Excel數據到SQL服務器

[HttpPost] 
    public JsonResult UploadExcel(Probe probes, HttpPostedFileBase FileUpload) 
    { 

     var data = new List<string>(); 
     if (FileUpload != null) 
     { 
      // tdata.ExecuteCommand("truncate table OtherCompanyAssets"); 
      if (FileUpload.ContentType == "application/vnd.ms-excel" || FileUpload.ContentType == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") 
      { 


       var filename = FileUpload.FileName; 
       var targetpath = Server.MapPath("~/Doc/"); 
       FileUpload.SaveAs(targetpath + filename); 
       var pathToExcelFile = targetpath + filename; 
       var connectionString = ""; 
       if (filename.EndsWith(".xls")) 
       { 
        connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", pathToExcelFile); 
       } 
       else if (filename.EndsWith(".xlsx")) 
       { 
        connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", pathToExcelFile); 
       } 

       var adapter = new OleDbDataAdapter("SELECT * FROM [report$]", connectionString); 
       var ds = new DataSet(); 

       adapter.Fill(ds, "ExcelTable"); 

       var dtable = ds.Tables["ExcelTable"]; 

       const string sheetName = "report"; 

       var excelFile = new ExcelQueryFactory(pathToExcelFile); 
       var dataInProbe = from a in excelFile.Worksheet<Probe>(sheetName) select a; 

       foreach (var a in dataInProbe) 
       { 
        try 
        { 
         if (a.ProbeName != "") 
         { 
          var pr = new Probe(); 
          pr.ProbeName = a.ProbeName; 
          db.Probes.Add(pr); 

          db.SaveChanges(); 
         } 
         else 
         { 
          data.Add("<ul>"); 
          if (string.IsNullOrEmpty(a.ProbeName)) data.Add("<li> Probe name is required</li>"); 
          data.Add("</ul>"); 
          data.ToArray(); 
          return Json(data, JsonRequestBehavior.AllowGet); 
         } 
        } 

        catch (DbEntityValidationException ex) 
        { 
         foreach (var entityValidationErrors in ex.EntityValidationErrors) 
         { 

          foreach (var validationError in entityValidationErrors.ValidationErrors) 
          { 

           Response.Write("Property: " + validationError.PropertyName + " Error: " + validationError.ErrorMessage); 

          } 

         } 
        } 
       } 
       //deleting excel file from folder 
       if ((System.IO.File.Exists(pathToExcelFile))) 
       { 
        System.IO.File.Delete(pathToExcelFile); 
       } 
       return Json("success", JsonRequestBehavior.AllowGet); 
      } 
      else 
      { 
       //alert message for invalid file format 
       data.Add("<ul>"); 
       data.Add("<li>Only Excel file format is allowed</li>"); 
       data.Add("</ul>"); 
       data.ToArray(); 
       return Json(data, JsonRequestBehavior.AllowGet); 
      } 
     } 
     else 
     { 
      data.Add("<ul>"); 
      if (FileUpload == null) data.Add("<li>Please choose Excel file</li>"); 
      data.Add("</ul>"); 
      data.ToArray(); 
      return Json(data, JsonRequestBehavior.AllowGet); 
     } 
    } 
+0

您可以使用導入導出嚮導將數據從excell導入到SQL SERVER。檢查此鏈接https://msdn.microsoft.com/en-us/library/ms140052.aspx –

+0

謝謝,但我不得不使用ASP.NET MVC,因爲稍後我需要創建UI插入後用戶可以看到插入的數據。 – Vytautas

+0

您標記了sql - server。所以在sql中我們可以用這種方式來完成,並且我們可以在SQL Job中安排它。 –

回答

0

我花了一些時間才能體現出來,但我做到了工作,這只是上載試應用excel文件到數據庫,但對於未來,我認爲這是更容易使用EF代替的數據集。

[HttpPost] 
    public ActionResult UploadExcel(Probe probes, HttpPostedFileBase FileUpload) 
    { 

     var data = new List<string>(); 
     if (FileUpload != null) 
     { 
      if (FileUpload.ContentType == "application/vnd.ms-excel" || FileUpload.ContentType == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") 
      { 
       var filename = FileUpload.FileName; 
       var targetpath = Server.MapPath("~/Doc/"); 
       FileUpload.SaveAs(targetpath + filename); 
       var pathToExcelFile = targetpath + filename; 
       string FileName = Path.GetFileName(FileUpload.FileName); 
       string Extension = Path.GetExtension(FileUpload.FileName); 
       DataTable dataFound = Import_To_Grid(pathToExcelFile, Extension, "Yes"); 
       List<ProbeData> dataProbList = new List<ProbeData>(); 
       foreach (DataRow item in dataFound.Rows) 
       { 
        try 
        { 
         var probeName = item["Probe"].ToString(); 
         var alreadyexist = db.Probes.Where(d => d.ProbeName == probeName).FirstOrDefault(); 
         var probId = 0; 
         if (alreadyexist != null) 
         { 
          probId = alreadyexist.Probe_ID; 
         } 
         else 
         { 
          Probe objProb = new Probe(); 
          objProb.ProbeName = probeName.ToString(); 
          db.Probes.Add(objProb); 
          db.SaveChanges(); 
          probId = objProb.Probe_ID; 
          ProbeData objPD = new ProbeData(); 
          objPD.ProbeId = probId; 
          objPD.ProbeName = objProb.ProbeName; 
          dataProbList.Add(objPD); 
         } 
        } 
        catch (DbEntityValidationException ex) 
        { 
         foreach (var entityValidationErrors in ex.EntityValidationErrors) 
         { 

          foreach (var validationError in entityValidationErrors.ValidationErrors) 
          { 

           Response.Write("Property: " + validationError.PropertyName + " Error: " + validationError.ErrorMessage); 

          } 

         } 
        } 

       } 
       //deleting excel file from folder 
       if ((System.IO.File.Exists(pathToExcelFile))) 
       { 
        System.IO.File.Delete(pathToExcelFile); 
       } 
       ViewBag.ProbeData = dataProbList; 
       //ViewBag.SCImportData = dataSCImporobList; 
       return View("Index"); 
      } 
      else 
      { 
       //alert message for invalid file format 
       data.Add("<ul>"); 
       data.Add("<li>Only Excel file format is allowed</li>"); 
       data.Add("</ul>"); 
       data.ToArray(); 
       return Json(data, JsonRequestBehavior.AllowGet); 
      } 
     } 
     else 
     { 
      data.Add("<ul>"); 
      if (FileUpload == null) data.Add("<li>Please choose Excel file</li>"); 
      data.Add("</ul>"); 
      data.ToArray(); 
      return Json(data, JsonRequestBehavior.AllowGet); 
     } 
    } 
    private DataTable Import_To_Grid(string FilePath, string Extension, string isHDR) 
    { 
     string conStr = ""; 
     switch (Extension) 
     { 
      case ".xls": //Excel 97-03 
       conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"] 
         .ConnectionString; 
       break; 
      case ".xlsx": //Excel 07 
       conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"] 
          .ConnectionString; 
       break; 
     } 
     conStr = String.Format(conStr, FilePath, isHDR); 
     OleDbConnection connExcel = new OleDbConnection(conStr); 
     OleDbCommand cmdExcel = new OleDbCommand(); 
     OleDbDataAdapter oda = new OleDbDataAdapter(); 
     DataTable dt = new DataTable(); 
     cmdExcel.Connection = connExcel; 

     //Get the name of First Sheet 
     connExcel.Open(); 
     DataTable dtExcelSchema; 
     dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
     string SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString(); 
     connExcel.Close(); 

     //Read Data from First Sheet 
     connExcel.Open(); 
     cmdExcel.CommandText = "SELECT * From [" + SheetName + "]"; 
     oda.SelectCommand = cmdExcel; 
     oda.Fill(dt); 
     connExcel.Close(); 
     return dt; 

    }