2013-07-10 26 views
3

请帮助解决从的Excel文件DataGridView控制导入数据与下面的代码:导入Excel数据的DataGridView在Visual Studio 2010

private void button5_Click(object sender, EventArgs e) 
{ 
    Excel.Application app = new Microsoft.Office.Interop.Excel.Application(); 
    Excel.Workbook workbook =app.Workbooks.Open(@"C:\Users\Admin\Desktop\Dropbox\Vandit's Folder\Internship\test.xlsx"); 
    Excel.Worksheet worksheet = workbook.ActiveSheet; 

    rcount = worksheet.UsedRange.Rows.Count; 

    int i = 0; 

    for(;i<rcount;i++) 
    { 
     dataGridView1.Rows[i].Cells["Column1"].Value = worksheet.Cells[i + 1, 1].Value; 
     dataGridView1.Rows[i].Cells["Column2"].Value = worksheet.Cells[i + 1, 2].Value; 
    } 
} 

当我运行这段代码,我总是得到一个异常说

"Index was out of range. Must be non-negative and less than the size of the collection." 
"Parameter name: index." 
+0

见,'dataGridView1'的'rowcount'是0因此,当调用dataGridView1.Rows [i] .Cells [“Column1”]。Value“时,未找到行[0]并抛出异常。代码在这里做的是修改datagrid中现有的单元格的值,这些值现在还不存在。所以请不要将插入数据修改为datagrid。 –

回答

2

dataGridView1假设有2列,

private void button5_Click(object sender, EventArgs e) 
{ 
    Excel.Application app = new Microsoft.Office.Interop.Excel.Application(); 
    Excel.Workbook workbook =app.Workbooks.Open(@"C:\Users\Admin\Desktop\Dropbox\Vandit's Folder\Internship\test.xlsx"); 
    Excel.Worksheet worksheet = workbook.ActiveSheet; 

    rcount = worksheet.UsedRange.Rows.Count; 

    int i = 0;   

    for(;i<rcount;i++) 
    { 
     //dataGridView1.Rows[i].Cells["Column1"].Value = worksheet.Cells[i + 1, 1].Value; 
     //dataGridView1.Rows[i].Cells["Column2"].Value = worksheet.Cells[i + 1, 2].Value; 
     dataGridView1.Rows.Add(worksheet.Cells[i + 1, 1].Value, worksheet.Cells[i + 1, 2].Value); 
    } 
} 

dataGridView1假设具有0列,

private void button5_Click(object sender, EventArgs e) 
{ 
    Excel.Application app = new Microsoft.Office.Interop.Excel.Application(); 
    Excel.Workbook workbook =app.Workbooks.Open(@"C:\Users\Admin\Desktop\Dropbox\Vandit's Folder\Internship\test.xlsx"); 
    Excel.Worksheet worksheet = workbook.ActiveSheet; 

    rcount = worksheet.UsedRange.Rows.Count; 

    int i = 0; 

    //Initializing Columns 
    dataGridView1.ColumnCount = worksheet.UsedRange.Columns.Count; 
    for(int x=0;x<dataGridView1.ColumnCount;x++) 
    { 
      dataGridView1.Columns[x].Name = "Column "+x.ToString(); 
    } 

    for(;i<rcount;i++) 
    { 
     //dataGridView1.Rows[i].Cells["Column1"].Value = worksheet.Cells[i + 1, 1].Value; 
     //dataGridView1.Rows[i].Cells["Column2"].Value = worksheet.Cells[i + 1, 2].Value; 
     dataGridView1.Rows.Add(worksheet.Cells[i + 1, 1].Value, worksheet.Cells[i + 1, 2].Value); 
    } 
} 
+0

非常感谢。它完美的工作! –

+0

快乐是我的...感谢它的工作,因为我忘了提及我手动编写了更改并没有测试它们。 :) –

2

您可以添加像下面的行

for(int i=0;i<rcount;i++) 
{ 
dataGridView1.Rows.Add(orksheet.Cells[i + 1, 1].Value, worksheet.Cells[i + 1, 2].Value); 
} 

你正在做的是设置gridview的现有行的值。如果gridview没有索引,那么你会得到异常

但没有所有这些,你可以使用Ado.net并从Excel中读取数据并将其绑定到gridview。检查下面的示例代码从这个KB article

// Create connection string variable. Modify the "Data Source" 
// parameter as appropriate for your environment. 
String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + 
    "Data Source=" + Server.MapPath("../ExcelData.xls") + ";" + 
    "Extended Properties=Excel 8.0;"; 

// Create connection object by using the preceding connection string. 
OleDbConnection objConn = new OleDbConnection(sConnectionString); 

// Open connection with the database. 
objConn.Open(); 

// The code to follow uses a SQL SELECT command to display the data from the worksheet. 

// Create new OleDbCommand to return data from worksheet. 
OleDbCommand objCmdSelect =new OleDbCommand("SELECT * FROM myRange1", objConn); 

// Create new OleDbDataAdapter that is used to build a DataSet 
// based on the preceding SQL SELECT statement. 
OleDbDataAdapter objAdapter1 = new OleDbDataAdapter(); 

// Pass the Select command to the adapter. 
objAdapter1.SelectCommand = objCmdSelect; 

// Create new DataSet to hold information from the worksheet. 
DataSet objDataset1 = new DataSet(); 

// Fill the DataSet with the information from the worksheet. 
objAdapter1.Fill(objDataset1, "XLData"); 

// Bind data to DataGrid control. 
DataGrid1.DataSource = objDataset1.Tables[0].DefaultView; 
DataGrid1.DataBind(); 

// Clean up objects. 
objConn.Close(); 
0

此错误意味着,抛出错误的索引或者在GridView控件不存在或存在列Excel文件丢失。

datagridView中的索引数必须等于您为datagridview发送的字段数。

0

尝试下面代码

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;