Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用互操作从DataGrid导出到Excel太慢_C#_Excel_Wpf_Interop - Fatal编程技术网

C# 使用互操作从DataGrid导出到Excel太慢

C# 使用互操作从DataGrid导出到Excel太慢,c#,excel,wpf,interop,C#,Excel,Wpf,Interop,我将要编写一个WPF应用程序,它从数据库中获取数据并在DataGrid中显示。然后用一个按钮创建一个Excel文件并填充数据。对于20000行这样的大量数据,填写Excel的时间太长。有人知道为什么吗?多谢各位 private void copyAlltoClipboard() { Clipboard.Clear(); DataGrid1.SelectAllCells(); DataGrid1.ClipboardCopyMode = Dat

我将要编写一个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;
   }

NET中的VBA自动化不是很有效:(您好,非常感谢您的回答,但为什么是VBA?我写的C#代码不是VBA(Visua Basic for Application)最好的RegardsHi@Yves,您尝试过OpenXml并检查了性能吗?…new Excel.Application()实际上是使用网络互操作的老式OLE COM自动化的一个面具,这似乎是一个沉重的负担:-)