最近,在做CS端数据导出到Excel中时网上找了很多代码感觉都不是自己想要的,通过自己的整理归纳得到一个比较通用的方法,就给大家分享一下;

该方法需要用到两个参数(即对象),一个  DataGridView对象 另外一个是我自己添加的一个进度条的对象,这样导出数据的时候会出现一个进度条,废话就不多说了,直接上源码,大家有什么想法可以留言一起讨论。

第一种方式:

 

   public static bool OutToExcelFromDataGridView(string title, DataGridView dgv, bool isShowExcel){int titleColumnSpan = 0;//标题的跨列数string fileName = "";//保存的excel文件名int columnIndex = 1;//列索引if (dgv.Rows.Count == 0)return false;/*保存对话框*/SaveFileDialog sfd = new SaveFileDialog();sfd.Filter = "导出Excel(*.xls)|*.xlsx";sfd.FileName = title + DateTime.Now.ToString("yyyyMMddhhmmss");if (sfd.ShowDialog() == DialogResult.OK){fileName = sfd.FileName;/*建立Excel对象*/Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();if (excel == null){MessageBox.Show("无法创建Excel对象,可能您的计算机未安装Excel!");return false;}try{excel.Application.Workbooks.Add(true);excel.Visible = isShowExcel;/*分析标题的跨列数*/foreach (DataGridViewColumn column in dgv.Columns){if (column.Visible == true)titleColumnSpan++;}/*合并标题单元格*/Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)excel.ActiveSheet;//worksheet.get_Range("A1", "C10").Merge();            worksheet.get_Range(worksheet.Cells[1, 1] as Range, worksheet.Cells[1, titleColumnSpan] as Range).Merge();/*生成标题*/excel.Cells[1, 1] = title;(excel.Cells[1, 1] as Range).HorizontalAlignment = XlHAlign.xlHAlignCenter;//标题居中//生成字段名称columnIndex = 1;for (int i = 0; i < dgv.ColumnCount; i++){if (dgv.Columns[i].Visible == true && dgv.Columns[i].HeaderText != "删除"){excel.Cells[2, columnIndex] = dgv.Columns[i].HeaderText;(excel.Cells[2, columnIndex] as Range).HorizontalAlignment = XlHAlign.xlHAlignCenter;//字段居中columnIndex++;}}//填充数据              for (int i = 0; i < dgv.RowCount; i++){columnIndex = 1;for (int j = 0; j < dgv.ColumnCount; j++){if (dgv.Columns[j].Visible == true && dgv.Columns[j].HeaderText != "删除"){if (dgv[j, i].ValueType == typeof(string)){excel.Cells[i + 3, columnIndex] = "'" + dgv[j, i].Value.ToString();}else{excel.Cells[i + 3, columnIndex] = dgv[j, i].Value.ToString();}(excel.Cells[i + 3, columnIndex] as Range).HorizontalAlignment = XlHAlign.xlHAlignLeft;//字段居中columnIndex++;}}}worksheet.SaveAs(fileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);}catch { }finally{excel.Quit();excel = null;GC.Collect();}KillProcess("Excel");return true;}else{return false;}}private static void KillProcess(string processName)//杀死与Excel相关的进程{System.Diagnostics.Process myproc = new System.Diagnostics.Process();//得到所有打开的进程try{foreach (System.Diagnostics.Process thisproc in System.Diagnostics.Process.GetProcessesByName(processName)){if (!thisproc.CloseMainWindow()){thisproc.Kill();}}}catch (Exception Exc){throw new Exception("", Exc);}}

  第二种方式

 public static void DataGridViewToExcel(DataGridView dgv,ProgressBar tempProgressBar){#region   验证可操作性     //申明保存对话框      SaveFileDialog dlg = new SaveFileDialog();//默然文件后缀      dlg.DefaultExt = "xlsx";//文件后缀列表      dlg.Filter = "EXCEL文件(*.XLS)|*.xlsx";//默然路径是系统当前路径      dlg.InitialDirectory = Directory.GetCurrentDirectory();//打开保存对话框      if (dlg.ShowDialog() == DialogResult.Cancel) return;//返回文件路径      string fileNameString = dlg.FileName;//验证strFileName是否为空或值无效      if (fileNameString.Trim() == " "){ return; }//定义表格内数据的行数和列数      int rowscount = dgv.Rows.Count;int colscount = dgv.Columns.Count;//行数必须大于0      if (rowscount <= 0){MessageBox.Show("没有数据可供保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);return;}//列数必须大于0      if (colscount <= 0){MessageBox.Show("没有数据可供保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);return;}//行数不可以大于65536      if (rowscount > 65536){MessageBox.Show("数据记录数太多(最多不能超过65536条),不能保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);return;}//列数不可以大于255      if (colscount > 255){MessageBox.Show("数据记录行数太多,不能保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);return;}//验证以fileNameString命名的文件是否存在,如果存在删除它      FileInfo file = new FileInfo(fileNameString);if (file.Exists){try{file.Delete();}catch (Exception error){MessageBox.Show(error.Message, "删除失败 ", 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;try{//申明对象      objExcel = new Microsoft.Office.Interop.Excel.Application();objWorkbook = objExcel.Workbooks.Add(Missing.Value);objsheet = (Microsoft.Office.Interop.Excel.Worksheet)objWorkbook.ActiveSheet;//设置EXCEL不可见      objExcel.Visible = false;//向Excel中写入表格的表头      int displayColumnsCount = 1;for (int i = 0; i <= dgv.ColumnCount - 1; i++){if (dgv.Columns[i].Visible == true&& dgv.Columns[i].HeaderText.Trim()!="删除" && dgv.Columns[i].HeaderText.Trim() !=""){objExcel.Cells[1, displayColumnsCount] = dgv.Columns[i].HeaderText.Trim();displayColumnsCount++;}}//设置进度条
                tempProgressBar.Refresh();tempProgressBar.Visible = true;tempProgressBar.Minimum =1;tempProgressBar.Maximum =dgv.RowCount;tempProgressBar.Step = 1;//向Excel中逐行逐列写入表格中的数据      for (int row = 0; row <= dgv.RowCount - 1; row++){tempProgressBar.PerformStep();displayColumnsCount = 1;for (int col = 0; col < colscount; col++){if (dgv.Columns[col].Visible == true&& dgv.Columns[col].HeaderText!="删除" && dgv.Columns[col].HeaderText.Trim() != ""){try{string Val = dgv.Rows[row].Cells[col].Value.ToString().Trim();if (Val.Length >8){Val = "'" + Val;//加单引号
                                }objExcel.Cells[row + 2, displayColumnsCount] = Val;displayColumnsCount++;}catch (Exception){}}}}//隐藏进度条      tempProgressBar.Visible = false;//保存文件
                objWorkbook.SaveAs(fileNameString, Missing.Value, Missing.Value, Missing.Value, Missing.Value,Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, Missing.Value, Missing.Value, Missing.Value,Missing.Value, Missing.Value);}catch (Exception error){MessageBox.Show(error.Message, "警告 ", MessageBoxButtons.OK, MessageBoxIcon.Warning);return;}finally{//关闭Excel应用      if (objWorkbook != null) objWorkbook.Close(Missing.Value, Missing.Value, Missing.Value);if (objExcel.Workbooks != null) objExcel.Workbooks.Close();if (objExcel != null) objExcel.Quit();objsheet = null;objWorkbook = null;objExcel = null;}MessageBox.Show(fileNameString + "导出完毕! ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);}

个人推荐第一种,经过测试第一种也可以,但是比较麻烦一些,第二种通俗简单,推荐使用;

根据个人喜好的选择吧,欢迎大神前来提意见;

转载于:https://www.cnblogs.com/BraveBoy/p/6558658.html

Winform 中 dataGridView 导出到Excel中的方法总结相关推荐

  1. matlab数据导出excel,matlab数据点导出excel表格-怎样将matlab中数据导出到excel中?...

    怎样将matlab中数据导出到excel中? xlswrite('E:系数.xls',B,'','A2') E:系数.xls 是路径 B是需要导入的矩阵 A2是指矩阵从表格中的A2开始输入 希望可以帮 ...

  2. c#如何实现excel导入到sqlserver,如何实现从sqlserver导出到excel中(详细)

    对于从sqlserver中导入.导出excel,虽然sqlserver已经给了较为简单的方式,通过交互式的对话框形式实现,但是有时这种方式存在的很多问题,比方说导入.导出数据不全.而且,对于一个项目而 ...

  3. datagridview序号左对齐_winform DataGridView数据导出到excel中

    winform DataGridView数据导出到excel中 实例一 private void button5_Click_1(object sender, EventArgs e) { //建立E ...

  4. WinForm下DataGridView导出Excel的实现

    WinForm下DataGridView导出Excel的实现   1.说明:导出的效率说不上很高,但至少是可以接收的.参考网上很多高效导出Excel的方法,实现到时能够实现的,导出速度也很快,不过缺陷 ...

  5. C# html的Table导出到Excel中

    C#中导出Excel分为两大类.一类是Winform的,一类是Web.今天说的这一种是Web中的一种,把页面上的Table部分导出到Excel中. Table导出Excel,简单点说,分为以下几步: ...

  6. python处理大量excel数据-使用python将大量数据导出到Excel中的小技巧分享

    (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢?如果碰到需要导出大量数据又该如何操作呢? 本文主要解决以 ...

  7. python输出数据到excel-使用python将大量数据导出到Excel中的小技巧分享

    (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢?如果碰到需要导出大量数据又该如何操作呢? 本文主要解决以 ...

  8. python输出数据到excel-如何使用python将大量数据导出到Excel中的小技巧之一

    如何使用python将大量数据导出到Excel中的小技巧 (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢 ...

  9. 从html导出带样式的excel,关于将HTML导出到Excel中时样式的问题

    最近要把HTML页面中的Table导出到Excel中去,可是Table的样式没有在Excel中显示出来,后来百度了一下,也买发现解决办法,大部分都提到了NPOI插件去解决,但是因为时间少没时间去看,后 ...

最新文章

  1. Tomcat的常用配置
  2. 如何制作linux文件系统,linux文件系统制作(一)
  3. java入门经典 贴吧_学完Java经典入门 后就想编游戏了
  4. java 获取字符串长度_ava练习实例:java字符串长度与Java String charAt() 方法 (建议收藏)...
  5. java方法生命周期_Java线程的第二种实现方式以及生命周期
  6. Sentinel+Nacos实现Sentinel的持久化规则,就很nice!
  7. finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
  8. Spring : Spring Aop之ProxyFactory
  9. QT每日一练day27:绘制不规则窗体
  10. 【C++笔记】表达式 语句
  11. Java char jdk_java学习系列之二---字符串(char.String.StringBuilder以及StringBuffer)
  12. scrapy实例三 【豆瓣电影Top250】
  13. jsoncpp添加对象、数组与json对象的解析
  14. win32-x64-64\binding.node is not a valid Win32 application
  15. [Unity] UGUI学习笔记
  16. 大话主流分布式文件系统!
  17. 阿里云ECS云服务器CPU处理器型号主频睿频实例规格表
  18. javase_test_day13
  19. 安卓 输入法出现导致布局变形问题解决
  20. Python:urllib解析查询参数parse_qsl、parse_qs

热门文章

  1. 某学校有计算机主机1300台,《计算机应用基础》1300题一级考试练习题
  2. PAT_1032验证身份(15)
  3. Educational Codeforces Round 54 (Rated for Div. 2): E. Vasya and a Tree(DFS+差分)
  4. bzoj 3781: 小B的询问(莫队)
  5. bzoj 1726: [Usaco2006 Nov]Roadblocks第二短路(A*第k短路)
  6. Selenium-IDE脚本录制,selenium-side-runner自动化测试教程
  7. 做tab切换时,点击浏览器返回拿不到实时的tab参数,请求不到实时的数据
  8. 解决Zabbix网页端Get value error: cannot connect to [[192.168.238.139]:10050]: [113] No route to host问题...
  9. Mybatis 单独项目
  10. node.js抓取数据(fake小爬虫)