2012-12-11 42 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中,但是如果我再次嘗試一次,則只會顯示列名稱,但不會顯示其中包含空白數據的單行數據。我調試了代碼,發現數據正在進入數據表(dt),但問題在於它映射到datagridview時。在此行中datatable不是在datagridview中映射

dataGridView1.DataSource = dt; 

我應該做些什麼來解決這個

+0

添加dataGridView1.DataBind();以及。 – sajanyamaha

+0

我試過它不起作用 –

回答

1

*編輯*

的問題是,當您清除一個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

相關問題