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. curl 查看一个web站点的响应时间(rt)

    1. curl 查看web站点rt curl -o /dev/null -s -w %{time_namelookup}::%{time_connect}::%{time_starttransfer} ...

  2. [Android Tips] 1. Getting StatusBar Height

    public int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier(&quo ...

  3. 微信的redirect_uri参数错误原因分析

    我们可以根据微信的开发者文档  http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html 网页授权获取用户验证这一章来 ...

  4. Leetcode: Arithmetic Slices II - Subsequence

    A sequence of numbers is called arithmetic if it consists of at least three elements and if the diff ...

  5. 解决 No resource found that matches the given name (at 'icon' with value '@drawable/icon') 问题

    对新解决方案Xamarin的Android项目在项目属性 换图标后 会出现 No resource found that matches the given name (at 'icon' with ...

  6. Scala入门学习笔记四--List使用

    前言 本篇将介绍一个和Array很相似的集合List,更多内容请参考:Scala教程 本篇知识点概括 List的构造 List与Array的区别 List的常用方法 List伴生对象的方法 ::和:: ...

  7. iocp-socket 服务(借鉴别人的,根据自己的需要改的)未完待续

    #pragma once #include <WinSock2.h> #include <MSWSock.h> #include <Windows.h> #prag ...

  8. CSS3 笔记一(Rounded Corners/Border Images/Backgrounds)

    CSS3 Rounded Corners The border-radius property is a shorthand property for setting the four border- ...

  9. [已解决] 点击 【Show in system explorer】Eclipse卡死,未响应

    新版的Eclipse自带了 [Show in system explorer] 功能很方便,有一天突然不好用了,点它Eclipse就卡死, 可能由以下原因导致的: (可能性最大)windows本身有问 ...

  10. java中对插入排序的理解以及实例

    一.基本思想 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入. 插入排序非常类似于整扑克牌. 在开始摸牌时,左手是空的,牌面朝下放在桌上.接着,一次从桌上摸起一张牌 ...