本文转载:http://www.cnblogs.com/herbert/archive/2010/07/28/1787095.html

在C#里面如果对应的把datagridview里面的每个cell的数据一个一个地对应的写入到excel,你会发现非常的慢,这个时候,你可以先把datagrid里面的数据放入到一个二维的string数组里面, 然后利用range对象的value赋值,那样会快很多。代码如下

public static void DataGridViewToExcel(DataGridView dgv){#region   Validate the path and file propertiesSaveFileDialog dlg = new SaveFileDialog();            dlg.DefaultExt = "xlsx ";dlg.Filter = "EXCEL文件(*.XLSX)|*.xlsx ";dlg.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);// Open the save file dialogif (dlg.ShowDialog() == DialogResult.Cancel) return;// Get the filenamestring fileNameString = dlg.FileName;            if (fileNameString.Trim() == " ")return; // Define the rows count and columns countint rowscount = dgv.Rows.Count;int colscount = dgv.Columns.Count;if (rowscount <= 0){MessageBox.Show("No data to save ", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);return;}if (colscount <= 0){MessageBox.Show("No data to save ", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);return;}if (rowscount > 65536){MessageBox.Show("Too much records(The number of the records exceeds 65536),CANNOT SAVE! ", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);return;}if (colscount > 255){MessageBox.Show("Too much columns, CANNOT SAVE! ", "Info ", MessageBoxButtons.OK, MessageBoxIcon.Information);return;}// Check if the file exisitsFileInfo file = new FileInfo(fileNameString);if (file.Exists){try{file.Delete();}catch (Exception error){MessageBox.Show(error.Message, "Cannot delete the file!", MessageBoxButtons.OK, MessageBoxIcon.Warning);return;}}#endregionMicrosoft.Office.Interop.Excel.Application objExcel = null;Microsoft.Office.Interop.Excel.Workbook objWorkbook = null;Microsoft.Office.Interop.Excel.Worksheet objsheet = null;object missing = System.Reflection.Missing.Value;try{     objExcel = new Microsoft.Office.Interop.Excel.Application();objWorkbook = objExcel.Workbooks.Add(missing);objsheet = (Microsoft.Office.Interop.Excel.Worksheet)objWorkbook.ActiveSheet;objExcel.Visible = false;int rowCount = dgv.RowCount;int columnCount = dgv.ColumnCount;string[,] datas = new string[rowCount + 1, columnCount];for (int i = 0; i < columnCount; i++){if (dgv.Columns[i].Visible == true){                       datas[0, i] = dgv.Columns[i].HeaderText.Trim();                        }}for (int row = 0; row < rowCount; row++){for (int col = 0; col < columnCount; col++){if (dgv.Columns[col].Visible == true){try{datas[row + 1, col] = dgv.Rows[row].Cells[col].Value.ToString().Trim();                                }catch (Exception ex){MessageBox.Show("An exception occured:" + ex.Message, "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);}}}}int exportRowCount = rowCount + 1;Range range = objsheet.get_Range("A1", "C" + exportRowCount);range.Value2 = datas;objsheet.Columns.EntireColumn.AutoFit(); // Automatically change the column widthobjWorkbook.SaveAs(fileNameString, missing, missing, missing, missing,missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, missing, missing, missing,missing, missing);}catch (Exception error){MessageBox.Show(error.Message, "Warning ", MessageBoxButtons.OK, MessageBoxIcon.Warning);return;}finally{if (objWorkbook != null) objWorkbook.Close(missing, missing, missing);if (objExcel.Workbooks != null) objExcel.Workbooks.Close();if (objExcel != null) objExcel.Quit();objsheet = null;objWorkbook = null;objExcel = null;}MessageBox.Show(fileNameString + "\n\n Export finished! ", "Info ", MessageBoxButtons.OK, MessageBoxIcon.Information);}

前面有一段代码是check 数据的,其实可以根据自己情况再制定。主要是导入的那几句话。这里要注意一个问题了,就是在visual studio里面

Worksheet.get_Range Method Range get_Range(Object Cell1,Object Cell2
)

这个要注意了,在visual studio 2010以前都可以这样用,但是visual studio 2010里面是下面的形式

Range get_Range(object Cell1, object Cell2 = Type.Missing);

所以这里选定一个范围的cell需要这样写

Range range = objsheet.get_Range("A1", "C" + exportRowCount);

参考文章地址:这里的这个示例给出的是一个可以导出大于60000行数据的代码,就是可以分成多个worksheet

http://www.cnblogs.com/Ihaveadream/archive/2009/01/04/1368525.html

          string saveFileName = "";bool fileSaved = false;SaveFileDialog saveDialog = new SaveFileDialog();saveDialog.DefaultExt = "xls";saveDialog.Filter = "Excel文件|*.xls";saveDialog.FileName = "Sheet1";saveDialog.ShowDialog();saveFileName = saveDialog.FileName;if (saveFileName.IndexOf(":") < 0) return; //被点了取消ExcelApp xlApp = new ExcelApp();if (xlApp == null){strMessage = "无法创建Excel对象,可能您的计算机上未安装Excel软件。";MessageBox.Show("无法创建Excel对象,可能您的计算机上未安装Excel软件。");return;}Workbooks workbooks = xlApp.Workbooks;Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);Worksheet worksheet = (Worksheet)workbook.Worksheets[1];//取得sheet1//写入字段for (int i = 0; i < gridview.Columns.View.VisibleColumns.Count; i++){worksheet.Cells[1, i + 1] = gridview.GetVisibleColumn(i).Caption;}//写入数值int r;for (r = 0; r < table.Rows.Count; r++ ){for (int i = 0; i < gridview.Columns.View.VisibleColumns.Count; i++){if (gridview.GetVisibleColumn(i).ColumnType == typeof(string) || gridview.GetVisibleColumn(i).ColumnType == typeof(Decimal) || gridview.GetVisibleColumn(i).ColumnType == typeof(DateTime)){worksheet.Cells[r + 2, i + 1] = gridview.GetRowCellDisplayText(r, gridview.GetVisibleColumn(i));//dt.Rows[r][i];object obj = table.Rows[r][gridview.GetVisibleColumn(i).FieldName];worksheet.Cells[r + 2, i + 1] = obj == null ? "": "'"+obj.ToString();}}System.Windows.Forms.Application.DoEvents();}if (saveFileName != ""){try{workbook.Saved = true;workbook.SaveCopyAs(saveFileName);fileSaved = true;}catch (Exception ex){strMessage = "导出文件时出错,文件可能正被打开";fileSaved = false;MessageBox.Show("导出文件时出错,文件可能正被打开!"n" + ex.Message);}}else{fileSaved = false;}xlApp.Quit();GC.Collect();//强行销毁if (fileSaved && System.IO.File.Exists(saveFileName)) System.Diagnostics.Process.Start(saveFileName); //打开EXCEL

上导出的代码在网上铺天盖地了已经,它仅适合导出那些最多几百几千的数据量,当使用上述代码导出10万甚至20多万的海量数据时,至少几个小时甚至导出失败。。。。

经过几天的研究,本人发现上述导出的核心代码存在问题,导致速度缓慢,下边看看我修改后的程序:

string saveFileName = "";bool fileSaved = false;SaveFileDialog saveDialog = new SaveFileDialog();saveDialog.DefaultExt = "xls";saveDialog.Filter = "Excel文件|*.xls";saveDialog.FileName = "Sheet1";saveDialog.ShowDialog();saveFileName = saveDialog.FileName;if (saveFileName.IndexOf(":") < 0) return; //被点了取消ExcelApp xlApp = new ExcelApp();if (xlApp == null){strMessage = "无法创建Excel对象,可能您的计算机上未安装Excel软件。";MessageBox.Show("无法创建Excel对象,可能您的计算机上未安装Excel软件。");return;}Workbooks workbooks = xlApp.Workbooks;Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);Worksheet worksheet = (Worksheet)workbook.Worksheets[1];//取得sheet1long rows = table.Rows.Count;/*下边注释的两行代码当数据行数超过行时,出现异常:异常来自HRESULT:0x800A03EC。因为:Excel 2003每个sheet只支持最大行数据

            //Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[table.Rows.Count+2, gridview.Columns.View.VisibleColumns.Count+1]);

            //fchR.Value2 = datas;*/if (rows > 65535){long pageRows = 60000;//定义每页显示的行数,行数必须小于int scount = (int)(rows / pageRows);if (scount * pageRows < table.Rows.Count)//当总行数不被pageRows整除时,经过四舍五入可能页数不准{scount = scount + 1;}for (int sc = 1; sc <= scount; sc++){if (sc > 1){object missing = System.Reflection.Missing.Value;worksheet = (Excel.Worksheet)workbook.Worksheets.Add(missing, missing, missing, missing);//添加一个sheet}else{worksheet = (Worksheet)workbook.Worksheets[sc];//取得sheet1}string[,] datas = new string[pageRows + 1, gridview.Columns.View.VisibleColumns.Count + 1];for (int i = 0; i < gridview.Columns.View.VisibleColumns.Count; i++) //写入字段{datas[0, i] = gridview.GetVisibleColumn(i).Caption;}Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, gridview.Columns.View.VisibleColumns.Count]);range.Interior.ColorIndex = 15;//15代表灰色range.Font.Bold = true;range.Font.Size = 9;int init = int.Parse(((sc - 1) * pageRows).ToString());int r = 0;int index = 0;int result;if (pageRows * sc >= table.Rows.Count){result = table.Rows.Count;}else{result = int.Parse((pageRows * sc).ToString());}for (r = init; r < result; r++){index = index + 1;for (int i = 0; i < gridview.Columns.View.VisibleColumns.Count; i++){if (gridview.GetVisibleColumn(i).ColumnType == typeof(string) || gridview.GetVisibleColumn(i).ColumnType == typeof(Decimal) || gridview.GetVisibleColumn(i).ColumnType == typeof(DateTime)){object obj = table.Rows[r][gridview.GetVisibleColumn(i).FieldName];datas[index, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式}}System.Windows.Forms.Application.DoEvents();}Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[index + 2, gridview.Columns.View.VisibleColumns.Count + 1]);fchR.Value2 = datas;worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[index + 1, gridview.Columns.View.VisibleColumns.Count]);//15代表灰色range.Font.Size = 9;range.RowHeight = 14.25;range.Borders.LineStyle = 1;range.HorizontalAlignment = 1;}}else{string[,] datas = new string[table.Rows.Count + 2, gridview.Columns.View.VisibleColumns.Count + 1];for (int i = 0; i < gridview.Columns.View.VisibleColumns.Count; i++) //写入字段{datas[0, i] = gridview.GetVisibleColumn(i).Caption;}Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, gridview.Columns.View.VisibleColumns.Count]);range.Interior.ColorIndex = 15;//15代表灰色range.Font.Bold = true;range.Font.Size = 9;int r = 0;for (r = 0; r < table.Rows.Count; r++){for (int i = 0; i < gridview.Columns.View.VisibleColumns.Count; i++){if (gridview.GetVisibleColumn(i).ColumnType == typeof(string) || gridview.GetVisibleColumn(i).ColumnType == typeof(Decimal) || gridview.GetVisibleColumn(i).ColumnType == typeof(DateTime)){object obj = table.Rows[r][gridview.GetVisibleColumn(i).FieldName];datas[r + 1, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式}}System.Windows.Forms.Application.DoEvents();}Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[table.Rows.Count + 2, gridview.Columns.View.VisibleColumns.Count + 1]);fchR.Value2 = datas;worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[table.Rows.Count + 1, gridview.Columns.View.VisibleColumns.Count]);//15代表灰色range.Font.Size = 9;range.RowHeight = 14.25;range.Borders.LineStyle = 1;range.HorizontalAlignment = 1;}if (saveFileName != ""){try{workbook.Saved = true;workbook.SaveCopyAs(saveFileName);fileSaved = true;}catch (Exception ex){strMessage = "导出文件时出错,文件可能正被打开";fileSaved = false;MessageBox.Show("导出文件时出错,文件可能正被打开!"n" + ex.Message);}}else{fileSaved = false;}xlApp.Quit();GC.Collect();//强行销毁if (fileSaved && System.IO.File.Exists(saveFileName)) System.Diagnostics.Process.Start(saveFileName); //打开EXCEL

着重看上边蓝色代码的部分,经过前后两种导出方式的对比,您会发现,导出的思想改变了:

原来的程序将数据一个表格一个表格地写入到EXCEL中;修改后的程序先将数据存入二维数组中,然后再将数组值赋予EXCEL应用程序对象的VALUE属性

正是导出思想的改变,使导出速度提高不少,请参考我的导出时间数据对照:

2万条:30分钟-->2分钟左右;3万条:大于60分钟-->3分钟;20万7000多条:导出失败--->15分钟左右

可以明显看出,效率提高了不少吧。

还有一个要提醒大家,EXCEL中SHEET最多存储65535条数据,如果数据过多就需要增加sheet继续存储数据,关于如何使用,上边我修改过的代码中已经有详细的使用,请大家自己去看,这里不再重复。

转载于:https://www.cnblogs.com/51net/archive/2013/02/27/2934943.html

C#如何快速高效地导出大量数据?相关推荐

  1. oracle快速导出1t数据,使用sqluldr2快速高效大批量导出Oracle数据

    sqluldr2是一个基于OCI的文本导出工具,小巧方便,使用方法类似于Oracle自带的exp,支持自定义SQL.本地和客户端的导出,速度快,效率高. 完成下载,将sqluldr264放入oracl ...

  2. FoxOne---一个快速高效的BS框架--(4)

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  3. 记账后,快速导出账目数据到表格保存

    可能每个人记账的原因都不同,了解记账的重要性,更了解收支情况.那么如何在记账后,快速将所记账的账目导出表格保存呢?下面教大家一起来试试吧. 在电脑上打开<晨曦记账本>进入到主界面上,功能简 ...

  4. 基于PyQt5的快速开发模板系统-Excle数据批量导入及导出表格数据为Excle

    基于Python和PyQt5的快速开发模板系统-Excle数据批量导入显示及表格数据导出 基于PyQt5按钮控制实现excle数据批量导入及当前表格存在数据的批量导出,可在此基础上进行功能扩展. 1. ...

  5. java shell spool_批量快速的导入导出Oracle的数据(spool缓冲池、java实现)

    1. Java代码实现思路 BufferedWriter writefile = new BufferedWriter(new FileWriter(file)); writefile.write(& ...

  6. toad mysql导入excel_Oracle 使用TOAD实现导入导出Excel数据

    在Oracle应用程序的开发过程中,访问数据库对象和编写SQL程序是一件乏味且耗费时间的工作,对数据库进行日常管理也是需要很多SQL脚本才能完成的.Quest Software为此提供了高效的Orac ...

  7. 用toad实现oracle数据迁移,Oracle 使用TOAD实现导入导出Excel数据

    在Oracle应用程序的开发过程中,访问数据库对象和编写SQL程序是一件乏味且耗费时间的工作,对数据库进行日常管理也是需要很多SQL脚本才能完成的.Quest Software为此提供了高效的Orac ...

  8. 导Excel数据到Oracle的脚本,Oracle使用TOAD实现导入导出Excel数据

    在Oracle应用程序的开发过程中,访问数据库对象和编写SQL程序是一件乏味且耗费时间的工作,对数据库进行日常管理也是需要很多SQL脚本才能完成的.Quest Software为此提供了高效的Orac ...

  9. 如何快速高效出高质量效果图

    如何快速高效出高质量效果图 建模+渲染+后期是出效果图的三个必须步骤.国内高质量效果图一般使用3dmax.SketchUP建模+VRay渲染+Photoshop修图的方法完成.而VRay渲染器上手有一 ...

最新文章

  1. python编的俄罗斯方块游戏下载_python写的俄罗斯方块游戏
  2. Rabbitmq-理论基础
  3. 命令行里对SAP Spartacus执行命令ng test core
  4. [html] 怎样避免让用户看到长时间的白屏?
  5. 天池 在线编程 有序队列
  6. (文中有惊喜)走进云时代的数据库
  7. 新手学习算法----二叉树(将一个二叉查找树按照中序遍历转换成双向链表)
  8. 在IntelliJ IDEA中clone项目代码
  9. 200多个引流推广渠道及技巧,全网引流布局
  10. 令人惊叹的模糊图像复原软件_如何写一封令人惊叹的求职信,以吸引您(包括模板)...
  11. MD4 算法代码实现
  12. PS学习总结三:修图必备的高阶操作
  13. 我的Android进阶之旅------报 error: Apostrophe not preceded by \ 的错误解决办法
  14. 刷题总结——宠物收养所(bzoj1208)
  15. softmax函数名字的由来(代数几何原理)——softmax前世今生系列(2)
  16. MySQL数据库11——子查询语句
  17. 笔的图片 html,笔的素描画图片
  18. 第三回 无处不在的计算
  19. 第十五周翻译-《Pro SQL Server Internals, 2nd edition》
  20. 《游戏学习》 java经典纸牌类小游戏《斗地主》源码

热门文章

  1. 常用连续型分布介绍及R语言实现
  2. 理清网站数据分析思路导图
  3. mySQL无锁队列_使用 MySQL 实现无锁任务队列(using MySQL as a job queue)
  4. 单按钮启停电路实物图_手绘220V清洗机电路原理图和接线方法,单相电机常见故障排查...
  5. linux里centos7开放端口,linux centos7 防火墙及端口开放相关命令
  6. java避免活锁.死锁的解决,java并发编程(九): 避免活跃性危险
  7. 高中信息技术——进制与编码刷题点整理
  8. 索引组织表:万物皆索引
  9. Apache yarn入门介绍
  10. 非表单元素如何使用焦点事件