导出excel我用的是nuget 的NPOI,直接在项目中添加的,引用到项目中,下面是截图:

下面我把ExcelHelper贴出来

  1. public static class ExcelHelper
  2. {
  3. public static void ExportToExcel(DataTable dt)
  4. {
  5. ExportToExcelData(dt);
  6. }
        
  7. public static DataTable ToDataTable(this DataGridView myDGV)
  8. {
  9. DataTable dt = new DataTable();
  10. for (int i = ; i < myDGV.ColumnCount; i++)
  11. {
  12. dt.Columns.Add(myDGV.Columns[i].HeaderText);
  13. }
  14. //写入数值
  15. for (int r = ; r < myDGV.Rows.Count; r++)
  16. {
  17. List<object> values = new List<object>();
  18. for (int i = ; i < myDGV.ColumnCount; i++)
  19. {
  20. values.Add(myDGV.Rows[r].Cells[i].Value);
  21. }
  22. dt.Rows.Add(values .ToArray());
  23. }
  24. return dt;
  25. }
  26. #region 导出
  27. /// <summary>
  28. /// 数据导出
  29. /// </summary>
  30. /// <param name="data"></param>
  31. /// <param name="sheetName"></param>
  32. public static void ExportToExcelData(this DataTable data)
  33. {
  34. ExportToExcel(data, "Sheet1");
  35. }
  36. /// <summary>
  37. /// 数据导出
  38. /// </summary>
  39. /// <param name="data"></param>
  40. /// <param name="sheetName"></param>
  41. public static void ExportToExcel(this DataTable data, string sheetName)
  42. {
  43. SaveFileDialog fileDialog = new SaveFileDialog();
  44. //fileDialog.Filter = "Excel(97-2003)|*.xls|Excel(2007-2013)|*.xlsx";
  45. fileDialog.Filter = "Excel|*.xls|Excel|*.xlsx";
  46. if (fileDialog.ShowDialog() == System.Windows.Forms.DialogResult.Cancel)
  47. {
  48. return;
  49. }
  50. IWorkbook workbook = new XSSFWorkbook();
  51. ISheet sheet = workbook.CreateSheet(sheetName);
  52. IRow rowHead = sheet.CreateRow();
  53.  
  54. //填写表头
  55. for (int i = ; i < data.Columns.Count; i++)
  56. {
  57. rowHead.CreateCell(i, CellType.String).SetCellValue(data.Columns[i].ColumnName.ToString());
  58. }
  59. //填写内容
  60. for (int i = ; i < data.Rows.Count; i++)
  61. {
  62. IRow row = sheet.CreateRow(i + );
  63. for (int j = ; j < data.Columns.Count; j++)
  64. {
  65. row.CreateCell(j, CellType.String).SetCellValue(data.Rows[i][j].ToString());
  66. }
  67. }
  68.  
  69. for (int i = ; i < data.Columns.Count; i++)
  70. {
  71. sheet.AutoSizeColumn(i);
  72. }
  73.  
  74. using (FileStream stream = File.OpenWrite(fileDialog.FileName))
  75. {
  76. workbook.Write(stream);
  77. stream.Close();
  78. }
  79. MessageBox.Show("导出数据成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  80. GC.Collect();
  81. }
  82. #endregion
  83.  
  84. #region 导入
  85. /// <summary>
  86. /// 导入的文件名
  87. /// </summary>
  88. /// <param name="fileName"></param>
  89. /// <returns></returns>
  90. public static DataSet ExcelToDataSet(string fileName)
  91. {
  92. return ExcelToDataSet(fileName, true);
  93. }
  94. /// <summary>
  95. /// 返回dataset
  96. /// </summary>
  97. /// <param name="fileName"></param>
  98. /// <param name="firstRowAsHeader"></param>
  99. /// <returns></returns>
  100. public static DataSet ExcelToDataSet(string fileName, bool firstRowAsHeader)
  101. {
  102. int sheetCount = ;
  103. return ExcelToDataSet(fileName, firstRowAsHeader, out sheetCount);
  104. }
  105. /// <summary>
  106. /// 返回dataset
  107. /// </summary>
  108. /// <param name="fileName">文件名</param>
  109. /// <param name="firstRowAsHeader">文件头</param>
  110. /// <param name="sheetCount">内容</param>
  111. /// <returns></returns>
  112. public static DataSet ExcelToDataSet(string fileName, bool firstRowAsHeader, out int sheetCount)
  113. {
  114. using (DataSet ds = new DataSet())
  115. {
  116. using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
  117. {
  118. IWorkbook workbook = WorkbookFactory.Create(fileStream);
  119. IFormulaEvaluator evaluator = WorkbookFactory.CreateFormulaEvaluator(workbook);
  120.  
  121. sheetCount = workbook.NumberOfSheets;
  122.  
  123. for (int i = ; i < sheetCount; ++i)
  124. {
  125. ISheet sheet = workbook.GetSheetAt(i);
  126. DataTable dt = ExcelToDataTable(sheet, evaluator, firstRowAsHeader);
  127. ds.Tables.Add(dt);
  128. }
  129. return ds;
  130. }
  131. }
  132. }
  133. /// <summary>
  134. /// 返回DataTable
  135. /// </summary>
  136. /// <param name="sheet"></param>
  137. /// <param name="evaluator"></param>
  138. /// <param name="firstRowAsHeader"></param>
  139. /// <returns></returns>
  140. private static DataTable ExcelToDataTable(ISheet sheet, IFormulaEvaluator evaluator, bool firstRowAsHeader)
  141. {
  142. if (firstRowAsHeader)
  143. {
  144. return ExcelToDataTableFirstRowAsHeader(sheet, evaluator);
  145. }
  146. else
  147. {
  148. return ExcelToDataTable(sheet, evaluator);
  149. }
  150. }
  151. private static DataTable ExcelToDataTableFirstRowAsHeader(ISheet sheet, IFormulaEvaluator evaluator)
  152. {
  153. try
  154. {
  155. using (DataTable dt = new DataTable())
  156. {
  157. IRow firstRow = sheet.GetRow();
  158. int cellCount = GetCellCount(sheet);
  159.  
  160. for (int i = ; i < cellCount; i++)
  161. {
  162. if (firstRow.GetCell(i) != null)
  163. {
  164. dt.Columns.Add(firstRow.GetCell(i).StringCellValue ?? string.Format("F{0}", i + ), typeof(string));
  165. }
  166. else
  167. {
  168. dt.Columns.Add(string.Format("F{0}", i + ), typeof(string));
  169. }
  170. }
  171.  
  172. for (int i = ; i <= sheet.LastRowNum; i++)
  173. {
  174. IRow row = sheet.GetRow(i);
  175. DataRow dr = dt.NewRow();
  176. FillDataRowByRow(row, evaluator, ref dr);
  177. dt.Rows.Add(dr);
  178. }
  179.  
  180. dt.TableName = sheet.SheetName;
  181. return dt;
  182. }
  183. }
  184. catch (Exception ex)
  185. {
  186. MessageBox.Show(ex.Message);
  187. return null;
  188. }
  189. }
  190. private static DataTable ExcelToDataTable(ISheet sheet, IFormulaEvaluator evaluator)
  191. {
  192. using (DataTable dt = new DataTable())
  193. {
  194. if (sheet.LastRowNum != )
  195. {
  196. int cellCount = GetCellCount(sheet);
  197.  
  198. for (int i = ; i < cellCount; i++)
  199. {
  200. dt.Columns.Add(string.Format("F{0}", i), typeof(string));
  201. }
  202.  
  203. for (int i = ; i < sheet.FirstRowNum; ++i)
  204. {
  205. DataRow dr = dt.NewRow();
  206. dt.Rows.Add(dr);
  207. }
  208.  
  209. for (int i = sheet.FirstRowNum; i <= sheet.LastRowNum; i++)
  210. {
  211. IRow row = sheet.GetRow(i);
  212. DataRow dr = dt.NewRow();
  213. FillDataRowByRow(row, evaluator, ref dr);
  214. dt.Rows.Add(dr);
  215. }
  216. }
  217.  
  218. dt.TableName = sheet.SheetName;
  219. return dt;
  220. }
  221. }
  222. /// <summary>
  223. /// 填充数据
  224. /// </summary>
  225. /// <param name="row"></param>
  226. /// <param name="evaluator"></param>
  227. /// <param name="dr"></param>
  228. private static void FillDataRowByRow(IRow row, IFormulaEvaluator evaluator, ref DataRow dr)
  229. {
  230. if (row != null)
  231. {
  232. for (int j = ; j < dr.Table.Columns.Count; j++)
  233. {
  234. ICell cell = row.GetCell(j);
  235.  
  236. if (cell != null)
  237. {
  238. switch (cell.CellType)
  239. {
  240. case CellType.Blank:
  241. {
  242. dr[j] = DBNull.Value;
  243. break;
  244. }
  245. case CellType.Boolean:
  246. {
  247. dr[j] = cell.BooleanCellValue;
  248. break;
  249. }
  250. case CellType.Numeric:
  251. {
  252. if (DateUtil.IsCellDateFormatted(cell))
  253. {
  254. dr[j] = cell.DateCellValue;
  255. }
  256. else
  257. {
  258. dr[j] = cell.NumericCellValue;
  259. }
  260. break;
  261. }
  262. case CellType.String:
  263. {
  264. dr[j] = cell.StringCellValue;
  265. break;
  266. }
  267. case CellType.Error:
  268. {
  269. dr[j] = cell.ErrorCellValue;
  270. break;
  271. }
  272. case CellType.Formula:
  273. {
  274. cell = evaluator.EvaluateInCell(cell) as HSSFCell;
  275. dr[j] = cell.ToString();
  276. break;
  277. }
  278. default:
  279. throw new NotSupportedException(string.Format("Unsupported format type:{0}", cell.CellType));
  280. }
  281. }
  282. }
  283. }
  284. }
  285.  
  286. /// <summary>
  287. /// 获取单元格
  288. /// </summary>
  289. /// <param name="sheet"></param>
  290. /// <returns></returns>
  291. private static int GetCellCount(ISheet sheet)
  292. {
  293. int firstRowNum = sheet.FirstRowNum;
  294.  
  295. int cellCount = ;
  296.  
  297. for (int i = sheet.FirstRowNum; i <= sheet.LastRowNum; ++i)
  298. {
  299. IRow row = sheet.GetRow(i);
  300.  
  301. if (row != null && row.LastCellNum > cellCount)
  302. {
  303. cellCount = row.LastCellNum;
  304. }
  305. }
  306. return cellCount;
  307. }
  308.  
  309. #endregion
  310.  
  311. }

如果DataGridview的数据源有多余的列,我们可以用扩展方法,把dataGridView转成DataTable,ExcelHelper中有,但是我拿出来,需要自己注意下。

  1. /// <summary>
  2. /// DataGridView转DataTable的扩展方法
  3. /// </summary>
  4. /// <param name="myDGV"></param>
  5. /// <returns></returns>
  6. public static DataTable ToDataTable(this DataGridView myDGV)
  7. {
  8. DataTable dt = new DataTable();
  9. for (int i = ; i < myDGV.ColumnCount; i++)
  10. {
  11. dt.Columns.Add(myDGV.Columns[i].HeaderText);
  12. }
  13. //写入数值
  14. for (int r = ; r < myDGV.Rows.Count; r++)
  15. {
  16. List<object> values = new List<object>();
  17. for (int i = ; i < myDGV.ColumnCount; i++)
  18. {
  19. values.Add(myDGV.Rows[r].Cells[i].Value);
  20. }
  21. dt.Rows.Add(values .ToArray());
  22. }
  23. return dt;
  24. }
  25. #endregion

导出按钮事件,可以直接写:

  1. if (dgBoxInData.Rows.Count > )
  2. {
  3. ExcelHelper.ExportToExcel(dgBoxInData.ToDataTable());//Run
  4. }

C# DataGridview用NPOI导出Excel文件的更多相关文章

  1. 使用NPOI导出Excel文件

    使用NPOI导出Excel文件,本实例使用了ASP.NET MVC. 1.使用NPOI导出Excel文件 实例:导出商品列表. 要求:1.通过NPOI导出导出商品列表信息: 2.使用Excel函数计算 ...

  2. 关于NPOI导出excel文件(xls和xlsx两种格式)提示格式不符的问题

    这两天在做导出excel文件的时候遇到这个问题 本来我导出的格式是xlsx格式的,但是下载得到的文件格式变成了xls, 一开始以为是返回的contenttype设置错了 return File(ms, ...

  3. 基于Vue + axios + WebApi + NPOI导出Excel文件

    一.前言 项目中前端采用的Element UI 框架, 远程数据请求,使用的是axios,后端接口框架采用的asp.net webapi,数据导出成Excel采用NPOI组件.其业务场景,主要是列表页 ...

  4. C# 未安装Office环境下使用NPOI导出Excel文件

    1.NuGet直接安装NPOI程序包: 2. using NPOI.XSSF.UserModel; 3.导出Excel代码: private void TsbExport2ExcelClick(obj ...

  5. asp.net Mvc 使用NPOI导出Excel文件

    1.新建MVC项目,新建控制器.视图 添加控制器: 添加视图(将使用布局页前面的复选框里的勾勾去掉) 2.在Models里新建一个类 public class Shop { /// <summa ...

  6. 使用 NPOI 导出 Excel 文件

    [NPOI简介] NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就可以在没有安装 Office 或者 ...

  7. NPOI导出Excel文件,对单元格的一些设置

    HSSFWorkbook book = new HSSFWorkbook(); MemoryStream ms = new MemoryStream(); ISheet sheet = book.Cr ...

  8. DataGridView如何快速导出Excel

    从DataGridView或DataTable导出Excel文件,为了按照数据类型设置单元格格式,导出Excel时速度都比较慢,一直找不到好的办法. 最后从外文网站上找到解决办法,使用ws.get_R ...

  9. c# datagridview导出Excel文件 问题

    今天vs2010c#开发做datagridview导出Excel文件时,发现一个问题,和大家探讨一下: 第一种方式:写流的方式 private void button_Excel_Click(obje ...

随机推荐

  1. javascript技巧总结

    1.删除前后空格 String.prototype.trim = function () { return this.replace(/(^[ | ])|([ | ]$)/g, "" ...

  2. php的数组变量

    数组就是存储同一类型的多个变量的 一种特殊的类型 php的数组有两种形态 1.普通类型 eg:$cars = array("Volvo","BMW"," ...

  3. OOAD之面向对象设计原则

    学习这个设计模式 真的觉得很抽象,只有自己多多的领会! 在很多时候,很多的知识都会觉得讲起来是很矛盾的. 本章目标 1 掌握内聚度和耦合度的概念 2 掌握面向对象设计原则  (一)如何衡量软件设计的质 ...

  4. sql典例分析

    1. 条件过滤 & Having 表结构 #tab_a #tab_b 表关系 tab_a.id = tab_b.relation_id 表数据 需求 查新把tab_a的ID对应的表tab_b的 ...

  5. [转]VS 2010 : 如何开发和部署Outlook 2010插件(Add-in)

    本文转自:https://www.cnblogs.com/chenxizhang/archive/2010/05/08/1730766.html 概述: 这篇文章,我将通过一个简单的例子,给大家分享一 ...

  6. [转]Enabling CRUD Operations in ASP.NET Web API 1

    本文转自:https://docs.microsoft.com/en-us/aspnet/web-api/overview/older-versions/creating-a-web-api-that ...

  7. C# BBcode 转 Markdown

    本文告诉大家一个简单的方法从 BBcode 转为 Markdown 本文的方法都是使用正则转换,现在支持的代码只有很少的常用标签,如果大家发现有转换失败的,请帮我修改代码,估计代码我不会进行修改. 最 ...

  8. layout_weight使用

    layout_weight的真正含义是等比例分割剩余空间, 在线性布局(linearlayout)中对宽度和高度进行比例分割, 三个子linearlayout分割父linearlayout高度,代码如 ...

  9. [WPF]记一个Win8"缩放级别"设置导致的问题

    这是我电脑的分辨率设置: 关键在于设置了缩放级别"较大",即150%的缩放. 接下来在WinForm中用各种方法取得的屏幕分辨率都是缩放之后的,但是这个时候的鼠标事件中鼠标位置也是 ...

  10. oracle数据同步

    随着各行业信息化水平的不断提升,各种各样的信息管理系统都被广泛使用,各系统间数据完全独立,形成了大量的信息孤岛.出于管理及决策方面的需求,实现各平台的数据同步是一个很迫切的需求,TreeSoft数据库 ...