2014-06-18 1 views
4

Excel 파일에서 SQL Server 데이터베이스로 데이터를 가져 오려고합니다. 어디 엑셀에서 첫 번째 행에서 데이터 테이블이 시작되지 않습니다. 여기ASP.NET C#을 사용하여 SQL Server로 Excel 데이터를 가져 오는 방법 테이블의 데이터가 첫 번째 행에서 시작하지 않는 위치는 무엇입니까?

enter image description here

클릭 버튼이 내 코드 : 그냥이 그림과 같이

protected void btnUpload_Click(object sender, EventArgs e) 
     { 
      if (fileUpload.HasFile) 
      { 
       string path = string.Concat(Server.MapPath("~/File/" + fileUpload.FileName)); 
       fileUpload.SaveAs(path); 

       string connExcelString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", path); 
       OleDbConnection ExcelConn = new OleDbConnection(connExcelString); 
       try 
       { 


        OleDbCommand cmd = new OleDbCommand("select * from [Sheet1$]", ExcelConn); 

        ExcelConn.Open(); 
        OleDbDataReader dr = cmd.ExecuteReader(); 


        string connSql = @"Data Source=.; Database=dbtest; User Id=sa; Password=mypassword;"; 

        SqlBulkCopy bulkcopy = new SqlBulkCopy(connSql); 

        SqlBulkCopyColumnMapping mapNPM = new SqlBulkCopyColumnMapping("npm", "npm"); 
        bulkcopy.ColumnMappings.Add(mapNPM); 
        SqlBulkCopyColumnMapping mapProdi = new SqlBulkCopyColumnMapping("prodi", "prodi"); 
        bulkcopy.ColumnMappings.Add(mapProdi); 
        SqlBulkCopyColumnMapping mapGrade = new SqlBulkCopyColumnMapping("grade", "grade"); 
        bulkcopy.ColumnMappings.Add(mapGrade); 

        bulkcopy.DestinationTableName = "testUpload"; 
        bulkcopy.WriteToServer(dr); 

        msg.Text = "success"; 
       } 
       catch (Exception ex) 
       { 
        msg.Text = ex.Message.ToString(); 
       } 
       finally 
       { 
        ExcelConn.Close(); 
       } 
      } 

     } 

내가 파일을 업로드하려고

는 첫 번째 행과 엑셀 데이터 테이블, 데이터는 SQL로 성공적인 수입했다 섬기는 사람. 그러나 파일 데이터가 그 그림처럼 보이면 메시지 반환은 다음과 같습니다. The given ColumnName 'npm' does not match up with any column in data source.

내 문제를 해결하도록 도와 줄 수 있습니까?

+0

하려는 SO에서보세요 아래 기사 http://stackoverflow.com/questions/9713048/skip-first-row-in-read-of-excel-file –

답변

1

나는 내 자신의 질문에 대한 답을 찾았습니다. Office Interop을 사용하도록 OLEDB를 변경하는 대신 Excel 파일에서 데이터를 검색하는 방법을 변경했습니다. 그래서 참조 사무실 Interop를 추가하고 이렇게 될 소스 코드를 수정 :

protected void btnUpload_Click(object sender, EventArgs e) 
     { 
      if (fileUpload.HasFile) 
      { 
       string path = string.Concat(Server.MapPath("~/File/" + fileUpload.FileName)); 
       fileUpload.SaveAs(path); 

       Microsoft.Office.Interop.Excel.Application appExcel; 
       Microsoft.Office.Interop.Excel.Workbook workbook; 
       Microsoft.Office.Interop.Excel.Range range; 
       Microsoft.Office.Interop.Excel._Worksheet worksheet; 

       appExcel = new Microsoft.Office.Interop.Excel.Application(); 
       workbook = appExcel.Workbooks.Open(path, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 
       worksheet = (Microsoft.Office.Interop.Excel._Worksheet)workbook.Sheets[1]; 
       range = worksheet.UsedRange; 

       int rowCount = range.Rows.Count; 
       int colCount = range.Columns.Count; 

       System.Data.DataTable dt = new System.Data.DataTable(); 
       dt.Columns.Add("npm"); 
       dt.Columns.Add("prodi"); 
       dt.Columns.Add("grade"); 

       for (int Rnum = 3; Rnum <= rowCount; Rnum++) 
       { 
        DataRow dr = dt.NewRow(); 
        //Reading Each Column value From sheet to datatable Colunms     
        for (int Cnum = 1; Cnum <= colCount; Cnum++) 
        { 
         dr[Cnum - 1] = (range.Cells[Rnum, Cnum]).Value2.ToString(); 
        } 
        dt.Rows.Add(dr); // adding Row into DataTable 
        dt.AcceptChanges(); 
       } 

       workbook.Close(true); 
       appExcel.Quit(); 

       try 
       { 
        string connSql = @"Data Source=.; Database=dbkuring; User Id=sa; Password=pohodeui;"; 

        SqlBulkCopy bulkcopy = new SqlBulkCopy(connSql); 

        SqlBulkCopyColumnMapping mapNPM = new SqlBulkCopyColumnMapping("npm", "npm"); 
        bulkcopy.ColumnMappings.Add(mapNPM); 
        SqlBulkCopyColumnMapping mapProdi = new SqlBulkCopyColumnMapping("prodi", "prodi"); 
        bulkcopy.ColumnMappings.Add(mapProdi); 
        SqlBulkCopyColumnMapping mapGrade = new SqlBulkCopyColumnMapping("grade", "grade"); 
        bulkcopy.ColumnMappings.Add(mapGrade); 

        bulkcopy.DestinationTableName = "testUpload"; 
        bulkcopy.WriteToServer(dt); 

        msg.Text = "success"; 
       } 
       catch (Exception ex) 
       { 
        msg.Text = ex.Message.ToString(); 
       } 


      } 
     } 

데이터를 읽는 방법을 많이 행 건너 뛰려면, 난 그냥이 코드를 수정 : for (int Rnum = 3; Rnum <= rowCount; Rnum++)