大的datagridview导出为ex​​cel

即时通讯尝试导出到Visual C#中的Visual Studio 2010的WinForms应用程序的excel(.xls),问题是它要永远保存,到目前为止,我有4220行和20列。 有没有更快的方法来做到这一点。 注:我从保存的Excel文件填充datagridview。 我感谢你的帮助….我的保存代码如下:

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(); } 

通过各种search和通过上面的答案我读过这个代码后,它的工作速度非常快(几乎是瞬间),而我刚刚花了不到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(); 

您希望尽量减less您在.NET代码和Excel进程之间进行的调用次数 – 这些执行速度非常慢,因此逐个填充单元格需要很长时间。

最好将网格的内容放入一个数组中:然后可以通过一次操作将其转储到Excel表单中。

将数组写入Excel范围

使用互操作来逐个单元格复制是非常缓慢的。 我会build议使用复制粘贴代替。 有关如何将数据复制到剪贴板的示例,请参阅此msdn文章 ; 然后可以使用interop将值粘贴到电子表格中。

试试ExcelLibrary 。

“这个项目的目标是提供一个原生的.NET解决scheme来创build,读取和修改Excel文件,而不使用COM互操作或OLEDB连接。

与本地.NET库相比,COM对象通常较慢。

你也应该看看这个线程 。