Экспорт из DataGrid в Excel с Interop выполняется слишком медленно

2

Я собираюсь написать приложение 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);
    }
  • 0
    Автоматизация VBA в dot NET не очень эффективна :(
  • 0
    Привет Сион, большое спасибо за ответ, но почему VBA? Я пишу код C # не VBA (Visua Basic для приложений) С наилучшими пожеланиями
Показать ещё 2 комментария
Теги:
excel
wpf
interop

1 ответ

0

Это метод, который я использую в настоящее время.
Но это очень похоже на ваш код. Но я использую объект данных для копирования содержимого в буфер обмена. Это работает отлично для меня. Но ряд строк, таких как 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;
   }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню