2012-12-11 4 views
1
{  
      DialogResult dialogResult = MessageBox.Show("Sure", "Some Title", MessageBoxButtons.YesNo); 
     if (dialogResult == DialogResult.Yes) 
     { 
      dt = dsSource.Tables[Index]; 
      dt.Reset(); 
      Excel.Workbook workbook; 
      Excel.Worksheet NwSheet; 
      Excel.Range ShtRange; 
      Microsoft.Office.Interop.Excel.Application ExcelObj = new Microsoft.Office.Interop.Excel.Application(); 
      OpenFileDialog filedlgExcel = new OpenFileDialog(); 
      filedlgExcel.Title = "Select file"; 
      filedlgExcel.InitialDirectory = @"c:\"; 
      //filedlgExcel.FileName = textBox1.Text; 
      filedlgExcel.Filter = "Excel Sheet(*.xlsx)|*.xlsx|All Files(*.*)|*.*"; 
      filedlgExcel.FilterIndex = 1; 
      filedlgExcel.RestoreDirectory = true; 
      if (filedlgExcel.ShowDialog() == DialogResult.OK) 
     { 

      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; 
      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(); 
      string[] columnNames = new String[dt.Columns.Count]; 
      for (int i = 0; i < dt.Columns.Count; i++) 
      { 
       columnNames[0] = dt.Columns[i].ColumnName; 
      } 
      //string[] columnNames = (from dc in dt.Columns.Cast<DataColumn>() select dc.ColumnName).ToArray(); 


      for (int Rnum = 2; Rnum <= ShtRange.Rows.Count; Rnum++) 
      { 
       DataRow dr = dt.NewRow(); 
       for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++) 
       { 
        if ((ShtRange.Cells[Rnum, Cnum] as Excel.Range).Value2 != null) 
        { 
         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(); 

      dataGridView1.DataSource = dt;     

} 

이것은 Excel 데이터를 DataGridview로 가져 오는 데 사용하는 코드입니다. 버튼 클릭시 작성됩니다. 처음 버튼을 클릭하면 수행 된 작업이 완벽합니다. 데이터는 datagridview에 표시되지만 다시 시도하면 열 이름 만 표시되지만 아무 데이터도없는 빈 행이 하나의 행에 표시됩니다. 코드를 디버깅하고 데이터가 datatable (dt)에 들어가는 것을 알았지 만 문제는 datagridview에 매핑 될 때 어딘가에 있습니다. 내가 해결하기 위해 어떻게해야이 줄datagridview에서 데이터 테이블이 매핑되지 않습니다.

dataGridView1.DataSource = dt; 

에이

+0

) (dataGridView1.DataBind를 추가; 게다가. – sajanyamaha

+0

나는 그것을 시도하지 않았다. –

답변

1

* EDIT *

문제는 당신이 DataTable의 선택을 취소 할 때, 그것은 단지 행을 제거한다는 것이다. 열을 제거하기 위해이 작업을 수행 할 필요가 : -

dt.Columns.Clear(); 

dt.Reset()

데이터를 제거하지 않습니다, 그냥 모든 변경 사항을 삭제합니다.

단추를 클릭 할 때마다이 이벤트를 호출 할 때마다 DataTable에 보유 된 이전 행인 & 열을 제거해야합니다.

아래의 코드는 나를 위해 잘 작동 : -

private void button1_Click(object sender, EventArgs e) 
     { 
      dt.Columns.Clear(); 
      dt.Rows.Clear(); 


      Excel.Workbook workbook; 
      Excel.Worksheet NwSheet; 
      Excel.Range ShtRange; 
      Microsoft.Office.Interop.Excel.Application ExcelObj = new Microsoft.Office.Interop.Excel.Application(); 

      OpenFileDialog filedlgExcel = new OpenFileDialog(); 
      filedlgExcel.Title = "Select file"; 
      filedlgExcel.InitialDirectory = @"c:\"; 

      filedlgExcel.Filter = "Excel Sheet(*.xlsx)|*.xlsx|All Files(*.*)|*.*"; 
      filedlgExcel.FilterIndex = 1; 
      filedlgExcel.RestoreDirectory = true; 
      if (filedlgExcel.ShowDialog() == DialogResult.OK) 
      { 
       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; 
       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(); 
       string[] columnNames = new String[dt.Columns.Count]; 
       for (int i = 0; i < dt.Columns.Count; i++) 
       { 
        columnNames[0] = dt.Columns[i].ColumnName; 
       } 
       //string[] columnNames = (from dc in dt.Columns.Cast<DataColumn>() select dc.ColumnName).ToArray(); 


       for (int Rnum = 2; Rnum <= ShtRange.Rows.Count; Rnum++) 
       { 
        DataRow dr = dt.NewRow(); 
        for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++) 
        { 
         if ((ShtRange.Cells[Rnum, Cnum] as Excel.Range).Value2 != null) 
         { 
          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(); 

       dataGridView1.DataSource = dt; 
      } 
     } 
    } 
+0

아니 동일한 문제가 작동하지 않습니다. 처음 성공적으로 가져 오지만 두 번째 시간 만 가져올 때 열 이름 없음 행 –

+0

그러면 DataTable이 올바르지 않아서보아야합니다. – Derek

+0

내 편집을 참조하십시오. – Derek

관련 문제