DataGridView数据导出为Excel

 

怎样把WinForm下的“DGV”里的绑定数据库后的数据导出到Excel中。

比如:在窗体里有个一“DGV”,DataGridView1,绑定了数据源,怎样把它里面的数据导出到Excel中?

用流保存成xls文件. 这种方法比较好,不用引用Excel组件.   下面是具体例子,可以参考
using System.IO; /// <summary>
/// 另存新档按钮
/// </summary>
private void SaveAs() //另存新档按钮 导出成Excel
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Execl files (*.xls)|*.xls";
saveFileDialog.FilterIndex = 0;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.CreatePrompt = true;
saveFileDialog.Title = "Export Excel File To";
saveFileDialog.ShowDialog();
Stream myStream;
myStream = saveFileDialog.OpenFile();
//StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding("gb2312"));
StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));
string str = "";
try
{
//写标题
for (int i = 0; i < dgvAgeWeekSex.ColumnCount; i++)
{
if (i > 0)
{
str += "\t";
}
str += dgvAgeWeekSex.Columns[i].HeaderText;
}
sw.WriteLine(str);
//写内容
for (int j = 0; j < dgvAgeWeekSex.Rows.Count; j++)
{
string tempStr = "";
for (int k = 0; k < dgvAgeWeekSex.Columns.Count; k++)
{
if (k > 0)
{
tempStr += "\t";
}
tempStr += dgvAgeWeekSex.Rows[j].Cells[k].Value.ToString();
} sw.WriteLine(tempStr);
}
sw.Close();
myStream.Close();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
finally
{
sw.Close();
myStream.Close();
}
}
  1. #region DataGridView数据显示到Excel
  2. /// <summary>
  3. /// 打开Excel并将DataGridView控件中数据导出到Excel
  4. /// </summary>
  5. /// <param name="dgv">DataGridView对象 </param>
  6. /// <param name="isShowExcle">是否显示Excel界面 </param>
  7. /// <remarks>
  8. /// add com "Microsoft Excel 11.0 Object Library"
  9. /// using Excel=Microsoft.Office.Interop.Excel;
  10. /// </remarks>
  11. /// <returns> </returns>
  12. public bool DataGridviewShowToExcel(DataGridView dgv, bool isShowExcle)
  13. {
  14. if (dgv.Rows.Count == 0)
  15. return false;
  16. //建立Excel对象
  17. Excel.Application excel = new Excel.Application();
  18. excel.Application.Workbooks.Add(true);
  19. excel.Visible = isShowExcle;
  20. //生成字段名称
  21. for (int i = 0; i < dgv.ColumnCount; i++)
  22. {
  23. excel.Cells[1, i + 1] = dgv.Columns[i].HeaderText;
  24. }
  25. //填充数据
  26. for (int i = 0; i < dgv.RowCount - 1; i++)
  27. {
  28. for (int j = 0; j < dgv.ColumnCount; j++)
  29. {
  30. if (dgv[j, i].ValueType == typeof(string))
  31. {
  32. excel.Cells[i + 2, j + 1] = "'" + dgv[j, i].Value.ToString();
  33. }
  34. else
  35. {
  36. excel.Cells[i + 2, j + 1] = dgv[j, i].Value.ToString();
  37. }
  38. }
  39. }
  40. return true;
  41. }
  42. #endregion
  43. #region DateGridView导出到csv格式的Excel
  44. /// <summary>
  45. /// 常用方法,列之间加\t,一行一行输出,此文件其实是csv文件,不过默认可以当成Excel打开。
  46. /// </summary>
  47. /// <remarks>
  48. /// using System.IO;
  49. /// </remarks>
  50. /// <param name="dgv"></param>
  51. private void DataGridViewToExcel(DataGridView dgv)
  52. {
  53. SaveFileDialog dlg = new SaveFileDialog();
  54. dlg.Filter = "Execl files (*.xls)|*.xls";
  55. dlg.FilterIndex = 0;
  56. dlg.RestoreDirectory = true;
  57. dlg.CreatePrompt = true;
  58. dlg.Title = "保存为Excel文件";
  59. if (dlg.ShowDialog() == DialogResult.OK)
  60. {
  61. Stream myStream;
  62. myStream = dlg.OpenFile();
  63. StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));
  64. string columnTitle = "";
  65. try
  66. {
  67. //写入列标题
  68. for (int i = 0; i < dgv.ColumnCount; i++)
  69. {
  70. if (i > 0)
  71. {
  72. columnTitle += "\t";
  73. }
  74. columnTitle += dgv.Columns[i].HeaderText;
  75. }
  76. sw.WriteLine(columnTitle);
  77. //写入列内容
  78. for (int j = 0; j < dgv.Rows.Count; j++)
  79. {
  80. string columnValue = "";
  81. for (int k = 0; k < dgv.Columns.Count; k++)
  82. {
  83. if (k > 0)
  84. {
  85. columnValue += "\t";
  86. }
  87. if (dgv.Rows[j].Cells[k].Value == null)
  88. columnValue += "";
  89. else
  90. columnValue += dgv.Rows[j].Cells[k].Value.ToString().Trim();
  91. }
  92. sw.WriteLine(columnValue);
  93. }
  94. sw.Close();
  95. myStream.Close();
  96. }
  97. catch (Exception e)
  98. {
  99. MessageBox.Show(e.ToString());
  100. }
  101. finally
  102. {
  103. sw.Close();
  104. myStream.Close();
  105. }
  106. }
  107. }
  108. #endregion
  109. #region DataGridView导出到Excel,有一定的判断性
  110. /// <summary>
  111. ///方法,导出DataGridView中的数据到Excel文件
  112. /// </summary>
  113. /// <remarks>
  114. /// add com "Microsoft Excel 11.0 Object Library"
  115. /// using Excel=Microsoft.Office.Interop.Excel;
  116. /// using System.Reflection;
  117. /// </remarks>
  118. /// <param name= "dgv"> DataGridView </param>
  119. public static void DataGridViewToExcel(DataGridView dgv)
  120. {
  121. #region   验证可操作性
  122. //申明保存对话框
  123. SaveFileDialog dlg = new SaveFileDialog();
  124. //默然文件后缀
  125. dlg.DefaultExt = "xls ";
  126. //文件后缀列表
  127. dlg.Filter = "EXCEL文件(*.XLS)|*.xls ";
  128. //默然路径是系统当前路径
  129. dlg.InitialDirectory = Directory.GetCurrentDirectory();
  130. //打开保存对话框
  131. if (dlg.ShowDialog() == DialogResult.Cancel) return;
  132. //返回文件路径
  133. string fileNameString = dlg.FileName;
  134. //验证strFileName是否为空或值无效
  135. if (fileNameString.Trim() == " ")
  136. { return; }
  137. //定义表格内数据的行数和列数
  138. int rowscount = dgv.Rows.Count;
  139. int colscount = dgv.Columns.Count;
  140. //行数必须大于0
  141. if (rowscount <= 0)
  142. {
  143. MessageBox.Show("没有数据可供保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
  144. return;
  145. }
  146. //列数必须大于0
  147. if (colscount <= 0)
  148. {
  149. MessageBox.Show("没有数据可供保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
  150. return;
  151. }
  152. //行数不可以大于65536
  153. if (rowscount > 65536)
  154. {
  155. MessageBox.Show("数据记录数太多(最多不能超过65536条),不能保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
  156. return;
  157. }
  158. //列数不可以大于255
  159. if (colscount > 255)
  160. {
  161. MessageBox.Show("数据记录行数太多,不能保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
  162. return;
  163. }
  164. //验证以fileNameString命名的文件是否存在,如果存在删除它
  165. FileInfo file = new FileInfo(fileNameString);
  166. if (file.Exists)
  167. {
  168. try
  169. {
  170. file.Delete();
  171. }
  172. catch (Exception error)
  173. {
  174. MessageBox.Show(error.Message, "删除失败 ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  175. return;
  176. }
  177. }
  178. #endregion
  179. Excel.Application objExcel = null;
  180. Excel.Workbook objWorkbook = null;
  181. Excel.Worksheet objsheet = null;
  182. try
  183. {
  184. //申明对象
  185. objExcel = new Microsoft.Office.Interop.Excel.Application();
  186. objWorkbook = objExcel.Workbooks.Add(Missing.Value);
  187. objsheet = (Excel.Worksheet)objWorkbook.ActiveSheet;
  188. //设置EXCEL不可见
  189. objExcel.Visible = false;
  190. //向Excel中写入表格的表头
  191. int displayColumnsCount = 1;
  192. for (int i = 0; i <= dgv.ColumnCount - 1; i++)
  193. {
  194. if (dgv.Columns[i].Visible == true)
  195. {
  196. objExcel.Cells[1, displayColumnsCount] = dgv.Columns[i].HeaderText.Trim();
  197. displayColumnsCount++;
  198. }
  199. }
  200. //设置进度条
  201. //tempProgressBar.Refresh();
  202. //tempProgressBar.Visible   =   true;
  203. //tempProgressBar.Minimum=1;
  204. //tempProgressBar.Maximum=dgv.RowCount;
  205. //tempProgressBar.Step=1;
  206. //向Excel中逐行逐列写入表格中的数据
  207. for (int row = 0; row <= dgv.RowCount - 1; row++)
  208. {
  209. //tempProgressBar.PerformStep();
  210. displayColumnsCount = 1;
  211. for (int col = 0; col < colscount; col++)
  212. {
  213. if (dgv.Columns[col].Visible == true)
  214. {
  215. try
  216. {
  217. objExcel.Cells[row + 2, displayColumnsCount] = dgv.Rows[row].Cells[col].Value.ToString().Trim();
  218. displayColumnsCount++;
  219. }
  220. catch (Exception)
  221. {
  222. }
  223. }
  224. }
  225. }
  226. //隐藏进度条
  227. //tempProgressBar.Visible   =   false;
  228. //保存文件
  229. objWorkbook.SaveAs(fileNameString, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
  230. Missing.Value, Excel.XlSaveAsAccessMode.xlShared, Missing.Value, Missing.Value, Missing.Value,
  231. Missing.Value, Missing.Value);
  232. }
  233. catch (Exception error)
  234. {
  235. MessageBox.Show(error.Message, "警告 ", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  236. return;
  237. }
  238. finally
  239. {
  240. //关闭Excel应用
  241. if (objWorkbook != null) objWorkbook.Close(Missing.Value, Missing.Value, Missing.Value);
  242. if (objExcel.Workbooks != null) objExcel.Workbooks.Close();
  243. if (objExcel != null) objExcel.Quit();
  244. objsheet = null;
  245. objWorkbook = null;
  246. objExcel = null;
  247. }
  248. MessageBox.Show(fileNameString + "\n\n导出完毕! ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
  249. }
  250. #endregion

学习笔记 DataGridView数据导出为Excel的更多相关文章

  1. vb.net-三种将datagridview数据导出为excel文件的函数

    第一种方法较慢,但是数据格式都比较好,需要引用excel的 Microsoft.Office.Interop.Excel.dll  office.dll #Region "导出excel函数 ...

  2. Asp.net网页中DataGridView数据导出到Excel

    经过上网找资料,终于找到一种可以直接将GridView中数据导出到Excel文件的方法,归纳方法如下: 1. 注:其中的字符集格式若改为“GB2312”,导出的部分数据可能为乱码: 导出之前需要关闭分 ...

  3. datagridview数据导出到excel

    /// <summary> /// 导出Excel /// </summary> /// <param name="mydgv">控件 Data ...

  4. 如何使用 Excel 对象将 DataGridView 数据导出到 Excel

    转载出处:https://code.msdn.microsoft.com/How-to-insert-image-into-93964561 本项目阐述如何使用 Open XML SDK 将图像插入到 ...

  5. 吴裕雄--天生自然ORACLE数据库学习笔记:数据导出与导入

    create directory dump_dir as 'd:\dump'; grant read,write on directory dump_dir to scott; --在cmd下 exp ...

  6. 将Datagridview中的数据导出至Excel中

        首先添加一个模块ImportToExcel,并添加引用         然后导入命名空间: Imports Microsoft.Office.Interop Imports System.Da ...

  7. VSTO学习笔记(十四)Excel数据透视表与PowerPivot

    原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...

  8. 机房收费系统——在VB中将MSHFlexGrid控件中的数据导出到Excel

    机房收费系统中,好多查询的窗体都包含同一个功能:将数据库中查询到的数据显示在MSHFlexGrid控件中,然后再把MSHFlexGrid控件中的数据导出到Excel表格中. 虽然之前做过学生信息管理系 ...

  9. VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式

    原文:VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式 Excel包含很多公式,如数学.日期.文本.逻辑等公式,非常方便,可以灵活快捷的对数据进行处理,达到我们想要的效果.Exce ...

随机推荐

  1. SQL数据库操作命令大全

    一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...

  2. RabbitMq 应用

    RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.它可以用于大型软件系统各个模块之间的高效通信,支持高并发,支持可扩展. 前提是你的RabbitMq服务已搭建好,制作一个winfor ...

  3. SQL语法粗整理

    1.在同一张表中,对前一条数据进行更新性插入操作,即:

  4. JQ的基本架构

    Jquery的基本架构   引入  以前学习原生JS然后切换到用JQ的时候总觉得很不习惯,甚至有点排斥用JQ.后来自己写项目一直到公司实习用JQ的这段时间,才深深感受到JQ的强大~JQ不仅做到兼容很多 ...

  5. PAT乙级 1033. 旧键盘打字(20)

    1033. 旧键盘打字(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 旧键盘上坏了几个键,于是在敲一段文 ...

  6. 解决qt程序的链接阶段出现 undefined reference 错误

    错误的原因是我使用到了 QT Widgets 模块中的东西,但是makefile的链接的参数中没有 widgets.其实官网上提到了这个: http://doc.qt.io/qt-5/qtwidget ...

  7. Orchard使用中的坎坎坷坷

    千万不要删除 内容类型为 Page 的 Welcome to Orchard!,删除之后的问题就大发了,首页就打不开. 如果没发布也会出现首页打不开的现象!!!

  8. python开发进阶之路(一)

    哎!好久没有写博客了,怪想念的,今天听了偶像的讲解,好多以前感觉很模糊的概念今天一下子就明朗了.下面就来整理一下今天的收获 一.如何成为一名优秀的开发人员 1.1  得先对自己使用的开发语言了如指掌, ...

  9. Spring中@Controller和@RestController之间的区别

    1. Controller, RestController的共同点 都是用来表示Spring某个类的是否可以接收HTTP请求 2.  Controller, RestController的不同点 @C ...

  10. KTV项目总结

    KTV项目总结 大约一个星期前吧,老湿说我们要开始做KTV项目了,说是KTV项目是贯穿整个学的内容的,会所的,要我们认真去对待,一开始,第一天搭前台界面,总是有不会的,要去问问,这个要用什么控件啊,用 ...