从DataGridView或DataTable导出Excel文件,为了按照数据类型设置单元格格式,导出Excel时速度都比较慢,一直找不到好的办法。

最后从外文网站上找到解决办法,使用ws.get_Range(excelRange, Type.Missing).Value2方法批量设置单元格的值。详细代码如下:

  1. public void DataToExcelFast(DataGridView dgv, string fName)
  2. {
  3. try
  4. {
  5. Excel.Application excel = new Excel.Application();
  6. Excel.Workbook wb = excel.Workbooks.Add(true);
  7. Excel.Worksheet ws = (Excel.Worksheet)wb.ActiveSheet;
  8. ws.Name = fName;
  9. string sFile = string.Empty;
  10. SaveFileDialog dialog = new SaveFileDialog();
  11. dialog.Title = "Save export file";
  12. dialog.Filter = "EXECL File(*.xlsx) |.xlsx";
  13. dialog.FileName = fName;
  14. dialog.FilterIndex = ;
  15. if (dialog.ShowDialog() == DialogResult.OK)
  16. {
  17. string FileName = dialog.FileName;
  18. if (File.Exists(FileName))
  19. File.Delete(FileName);
  20. sFile = FileName;
  21. excel.Visible = false;
  22. excel.DisplayAlerts = false;
  23. excel.Calculation = Excel.XlCalculation.xlCalculationManual;
  24. ArrayList cols = new ArrayList();
  25. #region 列标题,并根据列的数据类型设置Excel列的格式
  26. int visibleColumnCount = ;
  27. foreach (DataGridViewColumn col in dgv.Columns)
  28. {
  29. if (col.Visible)
  30. {
  31. visibleColumnCount++;
  32. ws.Cells[, visibleColumnCount].Value2 = col.HeaderText.ToString();
  33. ws.Cells[, visibleColumnCount].Font.Bold = true;
  34. cols.Add(col.Name);
  35. if (col.ValueType != null)
  36. {
  37. if (col.ValueType.Name.Equals("DateTime"))
  38. {
  39. ws.Columns[visibleColumnCount].NumberFormatLocal = @"yyyy-mm-dd HH:mm";
  40. ws.Columns[visibleColumnCount].Font.Color
  41. = System.Drawing.ColorTranslator.ToOle(Color.Blue);
  42. }
  43. else if (col.ValueType.Name.Equals("Decimal")
  44. || col.ValueType.Name.Equals("Double"))
  45. {
  46. ws.Columns[visibleColumnCount].NumberFormat = "0.00";
  47. }
  48. else if (col.ValueType.Name.Equals("Int32"))
  49. {
  50. ws.Columns[visibleColumnCount].NumberFormat = "";
  51. }
  52. else
  53. {
  54. ws.Columns[visibleColumnCount].NumberFormatLocal = @"@";
  55. }
  56. }
  57. else
  58. ws.Columns[visibleColumnCount].NumberFormatLocal = @"@";
  59. }
  60. }
  61. #endregion
  62. #region 写入行
  63. // Copy each DataTable
  64. // Copy the DataTable to an object array
  65. object[,] rawData = new object[dgv.Rows.Count, cols.Count];
  66. // Copy the column names to the first row of the object array
  67. for (int col = ; col < cols.Count; col++)
  68. {
  69. rawData[, col] = cols[col];
  70. }
  71. // Copy the values to the object array
  72. for (int col = ; col < cols.Count; col++)
  73. {
  74. for (int row = ; row < dgv.Rows.Count; row++)
  75. {
  76. rawData[row, col] = dgv.Rows[row].Cells[cols[col].ToString()].Value;
  77. }
  78. }
  79. // Calculate the final column letter
  80. string finalColLetter = string.Empty;
  81. string colCharset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  82. int colCharsetLen = colCharset.Length;
  83. if (cols.Count > colCharsetLen)
  84. {
  85. finalColLetter = colCharset.Substring(
  86. (cols.Count - ) / colCharsetLen - , );
  87. }
  88. finalColLetter += colCharset.Substring(
  89. (cols.Count - ) % colCharsetLen, );
  90. // Fast data export to Excel
  91. string excelRange = string.Format("A2:{0}{1}",
  92. finalColLetter, dgv.Rows.Count + );
  93. ws.get_Range(excelRange, Type.Missing).Value2 = rawData;
  94. #endregion
  95. excel.Calculation = Excel.XlCalculation.xlCalculationAutomatic;
  96. // 51表示2007-2010格式的xlsx
  97. ws.SaveAs(FileName, , Type.Missing, Type.Missing,
  98. Type.Missing, Type.Missing,
  99. Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
  100. Type.Missing, Type.Missing, Type.Missing);
  101. wb.Close(true, Type.Missing, Type.Missing);
  102. excel.Quit();
  103. // 安全回收进程
  104. System.GC.GetGeneration(excel);
  105. if (MessageBox.Show("已经导出Excel,您是否要打开?", "提示",
  106. MessageBoxButtons.YesNo) == DialogResult.Yes)
  107. System.Diagnostics.Process.Start(FileName);
  108. }
  109. }
  110. catch (Exception ex)
  111. {
  112. MessageBox.Show("导出Excel时遇到错误\r\n" + ex.Message,
  113. "Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
  114. }
  115. }

DataGridView如何快速导出Excel的更多相关文章

  1. datagridview控件--导出Excel

    dataGridView控件可以说很方便的显示了数据,而且对于修改和删除数据也很方便,我在前面的一篇博客中写到了如何去绑定数据到该控件上dataGridView控件--绑定数据方法,今天我将如何将数据 ...

  2. C# DataGridview用NPOI导出Excel文件

    导出excel我用的是nuget 的NPOI,直接在项目中添加的,引用到项目中,下面是截图: 下面我把ExcelHelper贴出来 public static class ExcelHelper { ...

  3. asp.net mvc4使用NPOI 数据处理之快速导出Excel文档

    一.背景 在之前做的小项目里有一需求是:要求将一活动录入的数据进行统计,并以excel表格形式导出来,并且对表格格式要求并不高. 二.问题分析 鉴于用户只要求最终将数据库中的数据导出excel,对于格 ...

  4. 使用Magicodes.IE快速导出Excel

    前言 总是有很多朋友咨询Magicodes.IE如何基于ASP.NET Core导出Excel,出于从框架的体验和易用性的角度,决定对Excel的导出进行独立封装,以便于大家更易于使用,开箱即用. 注 ...

  5. 实现标记datagridview标题并导出Excel的功能

    最近在学习winform,国庆前被布置了一个小任务,好不容易大致做出来了,决定记录下来,以此加深印象. 先说下需求:这是一个导入话单标记后并导出的功能 1. 选择excel文件 2. 定义字段   日 ...

  6. AX 利用windows粘贴板功能实现批量数据快速导出EXCEL

    static void test(Args _args) { int lineNum; int titleLines; SysExcelApplication excel; SysExcelWorkb ...

  7. PHP快速导出Excel文件 (采用xlsx Writer)

    <?php include_once("xlsxwriter.class.php"); ini_set('display_errors', 0); ini_set('log_ ...

  8. 利用PHPExcel快速导出excel

    <?php $objPHPExcel = new PHPExcel(); $objSheet = $objPHPExcel->getActiveSheet(); $array = arra ...

  9. 使用NPOI快速导出导入Excel

    这两天做项目需要导入导出EXCEL,是基于NPOI的封装,设计思路是使用DataTable,然后导出一个和DataTable一模一样的Excel表出来 github地址:https://github. ...

随机推荐

  1. [C语言(VC)] 打造自己的键盘记录器 (zaroty)

    说起键盘记录,想必很多朋友都用过网上流传的一些键盘记录软件吧,但是有没有想过自己写一个呢?也许你会想:会不会很复杂啊?我可以很负责的告诉你,写键盘记录是很简单的.你所需要的仅仅是懂得一些C语言的DLL ...

  2. bzoj 1800: [Ahoi2009]fly 飞行棋 暴力

    1800: [Ahoi2009]fly 飞行棋 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...

  3. [置顶] 用Wireshark保存RTP的负载码流

    这段时间工作太忙,有些日子没写文章了,今天准备了一篇Wireshark工具的一个小功能,在验证码流的时候非常好用,闲话不说,直接说步骤: 1.打开Wireshark抓取流媒体码流,然后用RTP过滤: ...

  4. [React Fundamentals] State Basics

    State is used for properties on a component that will change, versus static properties that are pass ...

  5. RHEL6中ulimit的nproc限制

    http://blog.csdn.net/kumu_linux/article/details/8301760 当前shell下更改用户可打开进程数 修改limits.conf配置文件生效 [root ...

  6. careercup-中等难度 17.4

    17.4 编写一个方法,找出两个数字中最大的那一个.不得使用if-else或其他比较运算符. 解法: 我们可以通过一步步的分析来将需要用到的if-else和比较操作符去掉: If a > b, ...

  7. QUiLoader 动态加载.ui文件

    动态加载UI文件是指,用 Qt Designer 通过拖拽的方式生产.ui 文件.不用 uic工具把.ui 文件变成等价的 c++代码,而是在程序运行过程中需要用到UI文件时,用 QUiLoader ...

  8. 关于Comparator和Comparable

    1.Comparable 2.Comparator  >>>>>> Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只 ...

  9. B/S的验证控件

    验证控件 首先设置一下框架,设置为.net framework 4.0,在4.5下貌似会报错,设置方法为项目上右键/属性页/找到左侧菜单栏里的生成/将框架版本改为4.0. 一.非空验证:Require ...

  10. xilinx 网站资源导读

    [经验整理.01]Xilinx网站资源导读 ISE11版 标签:  ISE  Xilinx  入门  资源  2009-09-01 20:41 序 虽然自己也曾想过,但如果不是向农要求,把曾经写过的文 ...