将excel数据粘贴到空白DataGridView – 索引超出范围的exception

我有一个Excel表格,内容如下:

在这里输入图像描述

所以,我想要实现的是从Excel复制并粘贴到一个空白的DataGridView视图。

这是迄今为止的代码:

 private void PasteClipboard(DataGridView myDataGridView) { DataObject o = (DataObject)Clipboard.GetDataObject(); if (o.GetDataPresent(DataFormats.Text)) { string[] pastedRows = Regex.Split(o.GetData(DataFormats.Text).ToString().TrimEnd("\r\n".ToCharArray()), "\r\n"); foreach (string pastedRow in pastedRows) { string[] pastedRowCells = pastedRow.Split(new char[] { '\t' }); using (DataGridViewRow myDataGridViewRow = new DataGridViewRow()) { for (int i = 0; i < pastedRowCells.Length; i++) myDataGridViewRow.Cells[i].Value = pastedRowCells[i]; myDataGridView.Rows.Add(myDataGridViewRow); } } } } 

代码运行时,我收到以下错误:

在这里输入图像说明

我手边接近这个任务吗?

经过一番挖掘,我发现我必须先添加列,然后添加一个新行,获取新创build行的行索引,然后设置单元格值。

这是更新的代码:

 DataObject o = (DataObject)Clipboard.GetDataObject(); if (o.GetDataPresent(DataFormats.Text)) { if (myDataGridView.RowCount > 0) myDataGridView.Rows.Clear(); if (myDataGridView.ColumnCount > 0) myDataGridView.Columns.Clear(); bool columnsAdded = false; string[] pastedRows = Regex.Split(o.GetData(DataFormats.Text).ToString().TrimEnd("\r\n".ToCharArray()), "\r\n"); foreach (string pastedRow in pastedRows) { string[] pastedRowCells = pastedRow.Split(new char[] { '\t' }); if (!columnsAdded) { for (int i = 0; i < pastedRowCells.Length; i++) myDataGridView.Columns.Add("col" + i, pastedRowCells[i]); columnsAdded = true; continue; } myDataGridView.Rows.Add(); int myRowIndex = myDataGridView.Rows.Count - 1; using (DataGridViewRow myDataGridViewRow = myDataGridView.Rows[myRowIndex]) { for (int i = 0; i < pastedRowCells.Length; i++) myDataGridViewRow.Cells[i].Value = pastedRowCells[i]; } } } 

}

在这里它正在工作:

在这里输入图像说明

乐于接受批评和有用的提示,以改善这一点。 这个代码很慢…

定义你的gridview列,如果没有,你必须先定义列。

 private void PasteClipboard(DataGridView myDataGridView) { DataObject o = (DataObject)Clipboard.GetDataObject(); if (o.GetDataPresent(DataFormats.Text)) { string[] pastedRows = Regex.Split(o.GetData(DataFormats.Text).ToString().TrimEnd("\r\n".ToCharArray()), "\r\n"); foreach (string pastedRow in pastedRows) { string[] pastedRowCells = pastedRow.Split(new char[] { '\t' }); using (DataGridViewRow myDataGridViewRow = new DataGridViewRow()) { myDataGridViewRow = (DataGridViewRow) myDataGridView.RowTemplate.Clone(); for (int i = 0; i < pastedRowCells.Length; i++) myDataGridViewRow.Cells[i].Value = pastedRowCells[i]; myDataGridView.Rows.Add(myDataGridViewRow); } } } } 

如果没有定义列

 private void PasteClipboard(DataGridView myDataGridView) { //Create COlumns in datagridView myDataGridView = new DataGridView(); myDataGridView.Columns.Add("col1", "Col1"); myDataGridView.Columns.Add("col2", "Col2"); myDataGridView.Columns.Add("col3", "Col3"); myDataGridView.Columns.Add("col4", "Col4"); DataObject o = (DataObject)Clipboard.GetDataObject(); if (o.GetDataPresent(DataFormats.Text)) { string[] pastedRows = Regex.Split(o.GetData(DataFormats.Text).ToString().TrimEnd("\r\n".ToCharArray()), "\r\n"); foreach (string pastedRow in pastedRows) { string[] pastedRowCells = pastedRow.Split(new char[] { '\t' }); using (DataGridViewRow myDataGridViewRow = new DataGridViewRow()) { myDataGridViewRow = (DataGridViewRow) myDataGridView.RowTemplate.Clone(); for (int i = 0; i < pastedRowCells.Length; i++) myDataGridViewRow.Cells[i].Value = pastedRowCells[i]; myDataGridView.Rows.Add(myDataGridViewRow); } } } } 

完美的代码在这里:(写入button)

 DataObject o = (DataObject)Clipboard.GetDataObject(); if (o.GetDataPresent(DataFormats.Text)) { if (myDataGridView.RowCount > 0) myDataGridView.Rows.Clear(); if (myDataGridView.ColumnCount > 0) myDataGridView.Columns.Clear(); bool columnsAdded = false; string[] pastedRows = Regex.Split(o.GetData(DataFormats.Text).ToString().TrimEnd("\r\n".ToCharArray()), "\r\n"); int j=0; foreach (string pastedRow in pastedRows) { string[] pastedRowCells = pastedRow.Split(new char[] { '\t' }); if (!columnsAdded) { for (int i = 0; i < pastedRowCells.Length; i++) myDataGridView.Columns.Add("col" + i, pastedRowCells[i]); columnsAdded = true; continue; } myDataGridView.Rows.Add(); int myRowIndex = myDataGridView.Rows.Count - 1; using (DataGridViewRow myDataGridViewRow = myDataGridView.Rows[j]) { for (int i = 0; i < pastedRowCells.Length; i++) myDataGridViewRow.Cells[i].Value = pastedRowCells[i]; } j++; } } 

由Latheesan的代码修改。

一个非常好的解决scheme发布在这里 :

但是,需要更改一行:

  if (dgv.Rows.Count < (r + rowsInClipboard.Length)) dgv.Rows.Add(r + rowsInClipboard.Length - dgv.Rows.Count); 

需要更改为:

  if (dgv.Rows.Count < (r + rowsInClipboard.Length)) dgv.Rows.Add(r + rowsInClipboard.Length+1 - dgv.Rows.Count); 

如果这一行没有改变,粘贴的最后一行将不会被传递给SQL。

//列数错误Propered :: //

 using System.Linq; DataTable xDataTable = new DataTable(); DataObject XClipboardDat = (DataObject)Clipboard.GetDataObject(); if (XClipboardDat.GetDataPresent(DataFormats.Text)) { string[] XClipboardRows = Regex.Split(XClipboardDat.GetData(DataFormats.Text).ToString(), @"[\r\n]+").Where(y => !string.IsNullOrEmpty(y.ToString())).ToArray(); IEnumerable<string[]> XDatRowCol = XClipboardRows.Select(xRow => Regex.Split(xRow, @"[\t]+").Where(y => !string.IsNullOrEmpty(y.ToString())).ToArray()); int ColNum = XDatRowCol.Select(XDatRow => XDatRow.Length).ToArray().Max<int>(); for (int i = 0; i < ColNum; i++) { xDataTable.Columns.Add(); } foreach(string[] XDatRow in XDatRowCol) { xDataTable.Rows.Add(XDatRow); } dataGridView2.DataSource = xDataTable; } 

我知道这是几年后,但我正在寻找这个问题的解决scheme,并发现了BASA的Latheesan代码的修改。 它只是部分工作,所以修改它,我想为未来的浏览器添加此解决scheme:

 private void Paste(DataGridView d) { DataObject o = (DataObject)Clipboard.GetDataObject(); if (o.GetDataPresent(DataFormats.StringFormat)) { string[] pastedRows = Regex.Split(o.GetData(DataFormats.StringFormat).ToString().TrimEnd("\r\n".ToCharArray()), "\r"); int j = 0; try { j = d.CurrentRow.Index; } catch { } foreach (string pastedRow in pastedRows) { DataGridViewRow r = new DataGridViewRow(); r.CreateCells(d, pastedRow.Split(new char[] { '\t' })); d.Rows.Insert(j, r); j++; } } } 

我刚刚修改了@ Latheesan的代码 ,下面是最短的版本。

 DataObject o = (DataObject)Clipboard.GetDataObject(); if (o.GetDataPresent(DataFormats.Text)) { if (myDataGridView.Rows.Count > 0) myDataGridView.Rows.Clear(); if (myDataGridView.Columns.Count > 0) myDataGridView.Columns.Clear(); bool columnsAdded = false; string[] pastedRows = Regex.Split(o.GetData(DataFormats.Text).ToString().TrimEnd("\r\n".ToCharArray()), "\r\n"); foreach (string pastedRow in pastedRows) { string[] pastedRowCells = pastedRow.Split(new char[] { '\t' }); if (!columnsAdded) { for (int i = 0; i < pastedRowCells.Length; i++) myDataGridView.Columns.Add("col" + i, pastedRowCells[i]); columnsAdded = true; continue; } myDataGridView.Rows.Add(pastedRowCells); //***You don't need following lines, use just above line. *** //myDataGridView.Rows.Add(); //int myRowIndex = myDataGridView.Rows.Count - 1; //using (DataGridViewRow myDataGridViewRow = myDataGridView.Rows[myRowIndex]) //{ // for (int i = 0; i < pastedRowCells.Length; i++) // myDataGridViewRow.Cells[i].Value = pastedRowCells[i]; //} } }