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

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

    public void DataToExcelFast(DataGridView dgv, string fName)
{
try
{
Excel.Application excel = new Excel.Application();
Excel.Workbook wb = excel.Workbooks.Add(true);
Excel.Worksheet ws = (Excel.Worksheet)wb.ActiveSheet;
ws.Name = fName;
string sFile = string.Empty;
SaveFileDialog dialog = new SaveFileDialog();
dialog.Title = "Save export file";
dialog.Filter = "EXECL File(*.xlsx) |.xlsx";
dialog.FileName = fName;
dialog.FilterIndex = ;
if (dialog.ShowDialog() == DialogResult.OK)
{
string FileName = dialog.FileName;
if (File.Exists(FileName))
File.Delete(FileName);
sFile = FileName;
excel.Visible = false;
excel.DisplayAlerts = false;
excel.Calculation = Excel.XlCalculation.xlCalculationManual;
ArrayList cols = new ArrayList();
#region 列标题,并根据列的数据类型设置Excel列的格式
int visibleColumnCount = ;
foreach (DataGridViewColumn col in dgv.Columns)
{
if (col.Visible)
{
visibleColumnCount++;
ws.Cells[, visibleColumnCount].Value2 = col.HeaderText.ToString();
ws.Cells[, visibleColumnCount].Font.Bold = true;
cols.Add(col.Name);
if (col.ValueType != null)
{
if (col.ValueType.Name.Equals("DateTime"))
{
ws.Columns[visibleColumnCount].NumberFormatLocal = @"yyyy-mm-dd HH:mm";
ws.Columns[visibleColumnCount].Font.Color
= System.Drawing.ColorTranslator.ToOle(Color.Blue);
}
else if (col.ValueType.Name.Equals("Decimal")
|| col.ValueType.Name.Equals("Double"))
{
ws.Columns[visibleColumnCount].NumberFormat = "0.00";
}
else if (col.ValueType.Name.Equals("Int32"))
{
ws.Columns[visibleColumnCount].NumberFormat = "";
}
else
{
ws.Columns[visibleColumnCount].NumberFormatLocal = @"@";
}
}
else
ws.Columns[visibleColumnCount].NumberFormatLocal = @"@";
}
}
#endregion
#region 写入行
// Copy each DataTable
// Copy the DataTable to an object array
object[,] rawData = new object[dgv.Rows.Count, cols.Count];
// Copy the column names to the first row of the object array
for (int col = ; col < cols.Count; col++)
{
rawData[, col] = cols[col];
}
// Copy the values to the object array
for (int col = ; col < cols.Count; col++)
{
for (int row = ; row < dgv.Rows.Count; row++)
{
rawData[row, col] = dgv.Rows[row].Cells[cols[col].ToString()].Value;
}
}
// Calculate the final column letter
string finalColLetter = string.Empty;
string colCharset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int colCharsetLen = colCharset.Length;
if (cols.Count > colCharsetLen)
{
finalColLetter = colCharset.Substring(
(cols.Count - ) / colCharsetLen - , );
}
finalColLetter += colCharset.Substring(
(cols.Count - ) % colCharsetLen, );
// Fast data export to Excel
string excelRange = string.Format("A2:{0}{1}",
finalColLetter, dgv.Rows.Count + );
ws.get_Range(excelRange, Type.Missing).Value2 = rawData;
#endregion
excel.Calculation = Excel.XlCalculation.xlCalculationAutomatic;
// 51表示2007-2010格式的xlsx
ws.SaveAs(FileName, , Type.Missing, Type.Missing,
Type.Missing, Type.Missing,
Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
Type.Missing, Type.Missing, Type.Missing);
wb.Close(true, Type.Missing, Type.Missing);
excel.Quit();
// 安全回收进程
System.GC.GetGeneration(excel);
if (MessageBox.Show("已经导出Excel,您是否要打开?", "提示",
MessageBoxButtons.YesNo) == DialogResult.Yes)
System.Diagnostics.Process.Start(FileName);
}
}
catch (Exception ex)
{
MessageBox.Show("导出Excel时遇到错误\r\n" + ex.Message,
"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}

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 序 虽然自己也曾想过,但如果不是向农要求,把曾经写过的文 ...