Сохранить данные из Excel в DataGrid, из DataGrid в SQL
Нужно сохранить данные из Excel в Datagrid. Читаю Excel через ClosedXML.Excel. Данные собираются, попадают в грид, но сохранить весь грид в бд никак не получается, кучу способов перепробовал. Ниже открытие и чтение Excel файла.
internal class Metric
{
public int IDОбращения { get; set; }
public string IdКлиента { get; set; }
public string ФИО { get; set; }
public string НомерТелефона { get; set; }
public string Email { get; set; }
public string Услуга { get; set; }
public string Статус { get; set; }
public string ОценкаКлиента { get; set; }
}
public IEnumerable<Metric> EnumerateMetrics(string xlsxpath)
{
using (var workbook = new XLWorkbook(xlsxpath))
using (var worksheet = workbook.Worksheets.Worksheet(1))
{
int n = workbook.Worksheet(1).LastRowUsed().RowNumber();
for (int row = 5; row < n + 1 ; ++row)
{
var me = new Metric
{
IDОбращения = worksheet.Cell($"A{row}").GetValue<int>(),
IdКлиента = worksheet.Cell($"B{row}").GetValue<string>(),
ФИО = worksheet.Cell($"C{row}").GetValue<string>(),
НомерТелефона = worksheet.Cell($"D{row}").GetValue<string>(),
Email = worksheet.Cell($"E{row}").GetValue<string>(),
Услуга = worksheet.Cell($"F{row}").GetValue<string>(),
Статус = worksheet.Cell($"G{row}").GetValue<string>(),
ОценкаКлиента = worksheet.Cell($"H{row}").GetValue<string>(),
};
yield return me;
}
}
}
Далее код заполнения Datagrid, чтение строк в DataTable и сохранение в бд
private ExcelImportSheet ex = new ExcelImportSheet();
public void Button_Click_8(object sender, RoutedEventArgs e)
{
var openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Excel Files|*.xls;*.xlsx";
if ((bool)openFileDialog.ShowDialog())
{
string path = openFileDialog.FileName;
dg2.ItemsSource = ex.EnumerateMetrics(path);
DataTable dt = new DataTable();
foreach (DataGridColumn column in dg2.Columns)
{
if (column is DataGridTextColumn)
{
dt.Columns.Add(column.Header.ToString(), typeof(int));
}
else if (column is DataGridCheckBoxColumn)
{
dt.Columns.Add(column.Header.ToString(), typeof(string));
}
}
foreach (object item in dg2.SelectedItems)
{
DataRowView rowView = (DataRowView)item;
DataRow row = dt.NewRow();
foreach (DataGridColumn column in dg2.Columns)
{
if (column is DataGridTextColumn)
{
string value = (rowView[column.Header.ToString()]).ToString();
row[column.Header.ToString()] = value;
}
else if (column is DataGridCheckBoxColumn)
{
int value = (int)(rowView[column.Header.ToString()]);
row[column.Header.ToString()] = value;
}
}
dt.Rows.Add(row);
string connectionString = @"Data Source=DESKTOP-4RVGC6V;Initial Catalog=Clientsmfc;Integrated Security=True";
SqlConnection Con = new SqlConnection(connectionString);
Con.Open();
SqlCommand cmd = new SqlCommand("INSERT INTO MyTable (IDОбращения, IdКлиента, ФИО, НомерТелефона, Email, Услуга, Статус, ОценкаКлиента) VALUES (@IDОбращения, @IdКлиента, @ФИО, @НомерТелефона, @Email, @Услуга, @Статус, @ОценкаКлиента)", Con);
cmd.Parameters.Add("@IDОбращения", SqlDbType.Int, 50, "IDОбращения");
cmd.Parameters.Add("@IdКлиента", SqlDbType.NVarChar, 50, "IdКлиента");
cmd.Parameters.Add("@ФИО", SqlDbType.NVarChar, 50, "ФИО");
cmd.Parameters.Add("@НомерТелефона", SqlDbType.NVarChar, 50, "НомерТелефона");
cmd.Parameters.Add("@Email", SqlDbType.NVarChar, 40, "Email");
cmd.Parameters.Add("@Услуга", SqlDbType.NVarChar, 500, "Услуга");
cmd.Parameters.Add("@Статус", SqlDbType.NVarChar, 50, "Статус");
cmd.Parameters.Add("@ОценкаКлиента", SqlDbType.NVarChar, 5, "ОценкаКлиента");
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.InsertCommand = cmd;
adapter.Fill(dt);
Con.Close();
}
}
}
Источник: Stack Overflow на русском