DataGridView如何快速导出Excel
从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的更多相关文章
- datagridview控件--导出Excel
dataGridView控件可以说很方便的显示了数据,而且对于修改和删除数据也很方便,我在前面的一篇博客中写到了如何去绑定数据到该控件上dataGridView控件--绑定数据方法,今天我将如何将数据 ...
- C# DataGridview用NPOI导出Excel文件
导出excel我用的是nuget 的NPOI,直接在项目中添加的,引用到项目中,下面是截图: 下面我把ExcelHelper贴出来 public static class ExcelHelper { ...
- asp.net mvc4使用NPOI 数据处理之快速导出Excel文档
一.背景 在之前做的小项目里有一需求是:要求将一活动录入的数据进行统计,并以excel表格形式导出来,并且对表格格式要求并不高. 二.问题分析 鉴于用户只要求最终将数据库中的数据导出excel,对于格 ...
- 使用Magicodes.IE快速导出Excel
前言 总是有很多朋友咨询Magicodes.IE如何基于ASP.NET Core导出Excel,出于从框架的体验和易用性的角度,决定对Excel的导出进行独立封装,以便于大家更易于使用,开箱即用. 注 ...
- 实现标记datagridview标题并导出Excel的功能
最近在学习winform,国庆前被布置了一个小任务,好不容易大致做出来了,决定记录下来,以此加深印象. 先说下需求:这是一个导入话单标记后并导出的功能 1. 选择excel文件 2. 定义字段 日 ...
- AX 利用windows粘贴板功能实现批量数据快速导出EXCEL
static void test(Args _args) { int lineNum; int titleLines; SysExcelApplication excel; SysExcelWorkb ...
- PHP快速导出Excel文件 (采用xlsx Writer)
<?php include_once("xlsxwriter.class.php"); ini_set('display_errors', 0); ini_set('log_ ...
- 利用PHPExcel快速导出excel
<?php $objPHPExcel = new PHPExcel(); $objSheet = $objPHPExcel->getActiveSheet(); $array = arra ...
- 使用NPOI快速导出导入Excel
这两天做项目需要导入导出EXCEL,是基于NPOI的封装,设计思路是使用DataTable,然后导出一个和DataTable一模一样的Excel表出来 github地址:https://github. ...
随机推荐
- IOS7 隐藏状态栏
- (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } // - (BOOL)pref ...
- C#/Access-数据库获取自动编号的最大值
//conStrSQL你改成你的access,我这里用的SQL2005string conStrSQL = "Data Source=xx.xx.xx.xx;Initial Catalog= ...
- Android开发实例之多点触控程序
智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣.实际上多点触控程序的实现并不是那么遥不可及,而是比较容易.本文就主要通过一个实例具体讲 ...
- [Server Running] [Node.js, PM2] Using PM2 To Keep Your Node Apps Alive
PM2 is a production process manager for Node.js applications with a built-in load balancer. It allow ...
- 文件夹同步/备份软件推荐 (SyncToy/FreeFileSync/Compare Advance/GoodSync/Allway Sync/Compare Advance)
关于文件同步的文章,已经很多次出现在异次元上了,因为它们很多都能实实在在提高工作便利性.比方说有我们熟悉的云端同步软件 Dropbox.金山快盘,以及曾经还介绍过可本地使用的 Allway Sync ...
- php开发环境以及插件的配置安装
目前网上提供的常用的PHP集成环境主要有AppServ.phpStudy.WAMP和XAMPP等软件
- OC中-方法到底是如何使用的?
方法:方法是Objective-C独有的一种结构,只能在Objective-C中声明.定义和使用,C语言不能声明.定义和使用. 1.类方法以+号开头,对象方法以-号开头+ (void) init; ...
- JAVA_Gson_example
package cn.kjxy.GSON; import java.util.List; import cn.kjxy.JSON.HttpHelpers; import com.google.gson ...
- HP服务器RAID配置
公司服务器硬盘空间不够了(HP的服务器),购买了10块硬盘,由于之前没有做过RAID,感觉很高大上的样子,就请教了HP的技术人员,技术人员发了两份文档,分别是DL380G7(DL580G7)和DL38 ...
- bootstrap兼容IE
这种响应式的布局正是通过CSS3的媒体查询(Media Query)功能实现的,根据不同的分辨率来匹配不同的样式.IE8浏览器并不支持这一优秀的Css3特性,Bootstrap在开发文档中写了如何使用 ...