2012-03-13 150 views
0

IM尝试使用Visual Studio 2010中的C#,问题是它正在采取永远保存,导出的datagridview擅长的WinForms应用程序(的.xls),到目前为止,我有4220行和20列。有没有更快的方法来做到这一点。注意:我正在从保存的excel文件填充datagridview。我感谢您的帮助....我保存的代码如下:大的datagridview导出到Excel

private void btnSave_Click(object sender, EventArgs e) 
    { 
     Excel.Application xlApp; 
     Excel.Workbook xlWorkBook; 
     Excel.Worksheet xlWorkSheet; 
     object misValue = System.Reflection.Missing.Value; 

     xlApp = new Excel.Application(); 
     xlWorkBook = xlApp.Workbooks.Add(misValue); 
     xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 

     // Get the Header from dataGridView 
     for (int h = 1; h < dataGridView1.Columns.Count + 1; h++) 
     { 
      xlWorkSheet.Cells[1, h] = dataGridView1.Columns[h - 1].HeaderText; 
     } 

     // Get the Cell Values 
     for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) 
     { 
      for (int j = 0; j < dataGridView1.Columns.Count; j++) 
      { 
       DataGridViewCell cell = dataGridView1[j, i]; 
       xlWorkSheet.Cells[i + 2, j + 1] = cell.Value; 
      } 
     } 

     //xlWorkBook.SaveCopyAs("\\FORM TEST.xlsx"); 
     xlWorkBook.SaveAs("\\GB STOCK.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); 
     xlWorkBook.Close(true, misValue, misValue); 
     xlApp.Quit(); 

     xlApp = null; 
     xlWorkBook = null; 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect();  
    } 

回答

2

通过各种搜索,通过上面的答案,我看到这个代码后,它比我的原始速度更快(几乎是瞬间的),只花了2分钟。我非常感谢你的回答,我会研究这些,特别是复制和粘贴方法,这是一个有趣的阅读。我是一个相对较新的(新兴趣),并且刚刚开始了解一些关于导出数据集的概念等。 我知道这绝不是实现我的目标的最佳方式,但它确实是我想要的它目前。再次感谢所有帮助过我的人,我正在学习很多东西。

  int cols; 
      //open file 
      StreamWriter wr = new StreamWriter("GB STOCK.csv", false, Encoding.UTF8); 

      //determine the number of columns and write columns to file 
      cols = dgvStock.Columns.Count; 
      for (int i = 0; i < cols; i++) 
       { 
        wr.Write(dgvStock.Columns[i].Name.ToString().ToUpper() + ","); 
       } 
      wr.WriteLine(); 

      //write rows to excel file 
      for (int i = 0; i < (dgvStock.Rows.Count); i++) 
       { 
        for (int j = 0; j < cols; j++) 
         { 
          if (dgvStock.Rows[i].Cells[j].Value != null) 
           { 
            wr.Write(dgvStock.Rows[i].Cells[j].Value + ","); 
           } 
          else 
           { 
            wr.Write(","); 
           } 
         } 

        wr.WriteLine(); 
       } 
       //close file 
       wr.Close(); 
1

你要尽量减少你让你的.NET代码和Excel进程之间的调用次数 - 这些都是执行速度很慢,因此逐个填充细胞需要很长时间。

不如把你的网格的内容到一个数组:那么你可以转储到Excel工作表在一个单一的操作。

Write Array to Excel Range

0

使用互操作通过细胞复制细胞是很慢的。我会建议使用复制粘贴代替。有关如何将数据复制到剪贴板的例子见this msdn article;然后您可以使用interop将这些值粘贴到电子表格中。

0

尝试ExcelLibrary

“这个项目的目的是提供一个本地的.NET解决方案的创建,读取和修改Excel文件,而无需使用COM互操作或OLEDB连接。”

COM对象通常是比较慢的原生.NET库。

你也应该看看this thread