2012-07-17 6 views
0

하드 코딩 스타일을 사용하지 않고 데이터 표보기로 Excel을 읽으려고합니다. 나는 이것을 시도하는 동안 오류에 직면했다. 누구나 나를 도와 줄 수 있습니까?하드 코드를 사용하지 않고 DataGridView로 Excel

Excel.Workbook workbook; 
     Excel.Worksheet NwSheet; 
     Excel.Range ShtRange; 
     Microsoft.Office.Interop.Excel.Application ExcelObj = null; 
     OpenFileDialog filedlgExcel = new OpenFileDialog(); 
     filedlgExcel.Title = "Select file"; 
     filedlgExcel.InitialDirectory = @"c:\"; 
     filedlgExcel.FileName = txtFileName.Text; 
     filedlgExcel.Filter = "Excel Sheet(*.xlsx)|*.xlsx|All Files(*.*)|*.*"; 
     filedlgExcel.FilterIndex = 1; 
     filedlgExcel.RestoreDirectory = true; 
     if (filedlgExcel.ShowDialog() == DialogResult.OK) 
     { 
      //Excel.Workbook theWorkbook = ExcelObj.Workbooks.Open(
      // filedlgExcel.FileName, 0, true, 5, 
      // "", "", true, Excel.XlPlatform.xlWindows, "\t", false, false, 
      // 0, true); 
      workbook = ExcelObj.Workbooks.Open(filedlgExcel.FileName , Missing.Value, Missing.Value, 
       Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
       Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); 
      NwSheet = (Excel.Worksheet)workbook.Sheets.get_Item(1); 
     ShtRange = NwSheet.UsedRange; //gives the used cells in sheet 
     //Reading Excel file. 
     //Creating dataTable to read the containt of the Sheet in File. 

     //Set header name 
     for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++) 
     { 
      dt.Columns.Add(new DataColumn((ShtRange.Cells[1, Cnum] as Excel.Range).Value2.ToString())); 
     } 
     dt.AcceptChanges(); 
     //store coumn names to array 
     string[] columnNames = (from dc in dt.Columns.Cast<DataColumn>() select dc.ColumnName).ToArray(); 

     //populate fields 
     for (int Rnum = 2; Rnum <= ShtRange.Rows.Count; Rnum++) 
     { 
      DataRow dr = dt.NewRow(); 
      for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++) 
      { 
       dr[Cnum - 1] = (ShtRange.Cells[Rnum, Cnum] as Excel.Range).Value2.ToString(); 
      } 
      dt.Rows.Add(dr); 
      dt.AcceptChanges(); 
     } 
     workbook.Close(true, Missing.Value, Missing.Value); 
     ExcelObj.Quit(); 

     foreach (DataRow dr in dt.Rows) 
     { 
      string strEmployee = dr["Employee Name"].ToString(); 
      obj1 = new List<employeeschedule>(); 
      for (int i = 1; i < dt.Columns.Count; i++) 
      { 
       string period = dr[i].ToString(); 
       string[] split = period.Split('–'); 
       employeeschedule es = new employeeschedule(); 
       string day = columnNames[i]; 
       if (split[0] == "Rest Day") 
       { 
        es.day = day; 
        es.startTime = split[0]; 
        es.endTime = split[0]; 
        es.restDay = "Yes"; 
       } 
       else 
       { 
        es.day = day; 
        es.startTime = split[0]; 
        es.endTime = split[1]; 
        es.restDay = "No"; 
       } 
       obj1.Add(es); 
      } 

      dict.Add(strEmployee, obj1); 
      dgvEmployeeShift.DataSource = dt; 
     } 
      } 
     } 

그들은이 부분에서 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다"라는 오류를 표시했습니다.

workbook = ExcelObj.Workbooks.Open(filedlgExcel.FileName , Missing.Value, Missing.Value, 
       Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
       Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); 

어떤 도움을 주시면 감사하겠습니다.

답변

1

당신은 처음에 null로 ExcelObj를 설정 한 다음이

Microsoft.Office.Interop.Excel.Application ExcelObj = null; 

= new Microsoft.Office.Interop.Excel.Application();

+0

당신이 모든 Missing.Value 필드가 필요하지 않습니다 그들은 선택 사항이며 당신은 할 수 있습니다

은 MSDN 문서/튜토리얼 링크에서보세요 그냥 내버려둬. – Dan

+0

ExcelObj가 선언되고 있으므로 새 ExcelObj()가 될 수 없습니다. 다른 방법? – Philemon

+0

예 죄송합니다, 위의 편집을 참조하십시오. 해야합니다 = 새로운 Excel.Application(); – Dan

1

다른 방법으로는 엑셀 시트 (들)을 읽어 OleDb 제공자를 사용하게하려고 초기화하지 않습니다.

string [email protected]"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;Extended Properties=" + "\"Excel 12.0 Xml;HDR=YES;IMEX=1\""; 
DataTable dt=new DataTable(); 
string sql="Select * From [Sheet1$]"; 
using(OleDbConnection cn=new OleDbConnection(cnstr)) 
{ 
    using(OleDbDataAdapter adapter=new OleDbDataAdapter(sql,cn)) 
    { 
    adapter.Fill(dt); 
    } 
} 

은 OleDb는 ADO.NET (.NET 프레임 워크의 데이터베이스 통합 API)의 제공자 API이며 Microsoft Access 데이터베이스 또는 Microsoft Excel 스프레드 시트 및 더 많은 등 다양한 데이터 소스에서 데이터를 노출합니다. 또한,

  1. How To Use ADO.NET to Retrieve and Modify Records in an Excel Workbook With Visual Basic .NET
  2. How to transfer data to an Excel workbook by using Visual C# 2005 or Visual C# .NET
+0

OleDb에 익숙하지 않아 사용을 권장하기 때문에 통합 문서를 사용하고 있습니다. – Philemon

+0

쿼리 문자열에 특정 범위를 포함시키는 방법은 무엇입니까? – sam

관련 문제