Мне нужно экспортировать данные из DataGridView в Excel, но только выбранные ячейки. DataGridView привязан к DataTable. Я видел много примеров того, как копировать выбранные строки, но не могу найти, как копировать только выбранные ячейки в новый DataTable. Это то, что я пробовал до сих пор:
//First, copy structure of DataTable into new one
DataTable dt = ((DataTable)dgv.DataSource).Clone();
//Then insert data into new datatable
foreach (DataGridViewCell cell in dgv.SelectedCells)
{
//We get Index of column and row from bounded DataTable
int col_indx = ((DataTable)dgv.DataSource).Columns.IndexOf(dgv.Columns[cell.ColumnIndex].Name);
int row_indx = ((DataTable)dgv.DataSource).Rows.IndexOf(((DataRowView)dgv.Rows[cell.RowIndex].DataBoundItem).Row);
//First check if row already exists
if (dt.Columns.Contains(dgv.Columns[cell.ColumnIndex].Name))
{
DataRow newrow = dt.NewRow();
newrow[col_indx] = cell.Value;
dt.Rows.InsertAt(newrow, row_indx);
}
else
{
dt.Rows[row_indx][cell_indx] = cell.Value;
}
}
dt.AcceptChanges();
Эта часть вставляет данные в новую таблицу данных, но в отдельных строках, если я выбираю несколько ячеек из той же строки. Как я могу это исправить?
EDIT:
for (int i = 0; i < dgv.Rows.Count; i++)
{
dt.Rows.Add();
for (int j = 0; j < dgv.ColumnCount; j++)
{
if (dgv.Rows[i].Cells[j].Selected == true)
{
dt.Rows[i][j] = dgv.Rows[i].Cells[j].Value;
}
}
}
dt.AcceptChanges();
Это самое близкое, чего я мог достичь. Он копирует выбранные данные в новый DataTable, но, к сожалению, он также сохраняет пустые строки. Поэтому, когда я выбираю ячейки в Datagridview, например, из 3-я строка, выходные данные в Excel будут с первыми 2 строками пустыми. Я хочу этого избежать, но как? ... Другими словами, то, что я выбираю в Datagridview, должно начинаться в новом Datatable из строки 1 и так далее ...