Я собираюсь написать приложение WPF, которое берет данные из базы данных и отображает их в DataGrid. Затем с помощью кнопки создается файл Excel и заполняется данными. При больших количествах, таких как 20000 строк, заполнение в Excel занимает слишком много времени. У кого-то есть идея, почему? Спасибо
private void copyAlltoClipboard()
{
Clipboard.Clear();
DataGrid1.SelectAllCells();
DataGrid1.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
ApplicationCommands.Copy.Execute(null, DataGrid1);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
copyAlltoClipboard();
Excel.Application xlexcel;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
xlexcel = new Excel.Application();
xlexcel.Visible = true;
xlWorkBook = xlexcel.Workbooks.Add(misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
Excel.Range CR = (Excel.Range)xlWorkSheet.Cells[1, 1];
CR.Select();
xlWorkSheet.PasteSpecial(CR, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true);
}
Это метод, который я использую в настоящее время.
Но это очень похоже на ваш код. Но я использую объект данных для копирования содержимого в буфер обмена. Это работает отлично для меня. Но ряд строк, таких как 20000, в любом случае повлияет на выступления.
private void btnExportToExcel_Click(object sender, EventArgs e)
{
copyDataGridToClipboard();
Microsoft.Office.Interop.Excel.Application xlexcel;
Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
xlexcel = new Microsoft.Office.Interop.Excel.Application();
xlexcel.Visible = true;
xlWorkBook = xlexcel.Workbooks.Add(misValue);
xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
Microsoft.Office.Interop.Excel.Range CR = (Microsoft.Office.Interop.Excel.Range)xlWorkSheet.Cells[1, 1];
CR.Select();
xlWorkSheet.PasteSpecial(CR, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true);
}
private void copyDataGridToClipboard()
{
YourDataGridView.MultiSelect = true;
yourDataGridView.SelectAll();
DataObject dataObj = yourDataGridView.GetClipboardContent();
if (dataObj != null)
{
Clipboard.SetDataObject(dataObj);
}
yourDataGridView.MultiSelect = true;
}