c#快速导出到Excel
导出到Excel,基本是很多单据的标配功能了。笔者之前将Datagridview的数据导出到Excel时,将数据一个单元格一个单元格的写入,效率奇慢,
1030条数据花费了将近70s的时间。后来借鉴了前辈们的其它写法,将数据先生成到string变量,再写入,效率提升了150多倍。分享如下:
1、改善后结果:

2、导出到Excel使用的方法:
简要说明:
TableName:数据源数据表
FileName:要保存的Excel文件名
lblStatus:ToolStripStatusLable
barStatus:ToolStripProgressBar
引用及代码:
using System.IO;
using System.Data.SqlClient;
using System.Threading;
using System.Diagnostics;
public void ExportDataToExcel(DataTable TableName, string FileName)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
//设置文件标题
saveFileDialog.Title = "导出Excel文件";
//设置文件类型
saveFileDialog.Filter = "Microsoft Office Excel 工作簿(*.xls)|*.xls";
//设置默认文件类型显示顺序
saveFileDialog.FilterIndex = ;
//是否自动在文件名中添加扩展名
saveFileDialog.AddExtension = true;
//是否记忆上次打开的目录
saveFileDialog.RestoreDirectory = true;
//设置默认文件名
saveFileDialog.FileName = FileName;
//按下确定选择的按钮
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
//获得文件路径
string localFilePath = saveFileDialog.FileName.ToString(); //数据初始化
int TotalCount; //总行数
int RowRead = ; //已读行数
int Percent = ; //百分比 TotalCount = TableName.Rows.Count;
lblStatus.Text = "共有" + TotalCount + "条数据";
lblStatus.Visible = true;
barStatus.Visible = true; //数据流
Stream myStream = saveFileDialog.OpenFile();
StreamWriter sw = new StreamWriter(myStream, Encoding.GetEncoding("gb2312"));
string strHeader = ""; //秒钟
Stopwatch timer = new Stopwatch();
timer.Start(); try
{
//写入标题
for (int i = ; i < TableName.Columns.Count; i++)
{
if (i > )
{
strHeader += "\t";
}
strHeader += TableName.Columns[i].ColumnName.ToString();
}
sw.WriteLine(strHeader); //写入数据
//string strData;
for (int i = ; i < TableName.Rows.Count; i++)
{
RowRead++;
Percent = (int)( * RowRead / TotalCount);
barStatus.Maximum = TotalCount;
barStatus.Value = RowRead;
lblStatus.Text = "共有" + TotalCount + "条数据,已写入" + Percent.ToString() + "%的数据,共耗时" + timer.ElapsedMilliseconds + "毫秒。";
Application.DoEvents(); string strData = "";
for (int j = ; j < TableName.Columns.Count; j++)
{
if (j > )
{
strData += "\t";
}
strData += TableName.Rows[i][j].ToString();
}
sw.WriteLine(strData);
}
//关闭数据流
sw.Close();
myStream.Close();
//关闭秒钟
timer.Reset();
timer.Stop();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
finally
{
//关闭数据流
sw.Close();
myStream.Close();
//关闭秒钟
timer.Stop();
} //成功提示
if (MessageBox.Show("导出成功,是否立即打开?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
{
System.Diagnostics.Process.Start(localFilePath);
} //赋初始值
lblStatus.Visible = false;
barStatus.Visible = false;
}
}
后记:
美中不足的是,上述代码仅能导出到xls格式,若需导出到xlsx格式的话,仍需调整代码。
c#快速导出到Excel的更多相关文章
- c#使用NPOI快速导出到Excel
接上篇博文<C#快速导出到excel>:由于此种方法不能导出成.xlsx格式,为解决此问题,本次分享使用NPOI. 参考:https://www.cnblogs.com/lazyneal/ ...
- 使用NPOI快速导出导入Excel
这两天做项目需要导入导出EXCEL,是基于NPOI的封装,设计思路是使用DataTable,然后导出一个和DataTable一模一样的Excel表出来 github地址:https://github. ...
- 用COM方式快速导出到Excel一例,批量导出
开发中用到填充Excel时,一个一个的填充不免太慢,现有用数组方式填充一例,可以实现COM方式快速填充. C#,VBA中用法类似 适用场景:需要自动化操作Excel的方式下使用,比较除填充数据外还要自 ...
- 使用HTML,CSS快速导出数据到Excel
在应用中经常会遇到要从系统或数据库中导出数据平面文件,一般是导出到txt,csv或excel.txt和csv一般用在系统间的数据交换, 而excel一般有较好的显示效果,可以按照一定的模板导出,导出就 ...
- 大量数据快速导出的解决方案-Kettle
1.开发背景 在web项目中,经常会需要查询数据导出excel,以前比较常见的就是用poi.使用poi的时候也有两种方式,一种就是直接将集合一次性导出为excel,还有一种是分批次追加的方式适合数据量 ...
- [转].net 使用NPOI或MyXls把DataTable导出到Excel
本文转自:http://www.cnblogs.com/yongfa365/archive/2010/05/10/NPOI-MyXls-DataTable-To-Excel-From-Excel.ht ...
- 使用pentaho工具将数据库数据导入导出为Excel
写在前面:本篇博客讲述的是如何使用pentaho工具快速的将数据库数据导出为Excel文件,以及如何将Excel文件数据导入数据库. 补充:使用此工具并不需要任何一句代码并能快速便捷解决实际问题,此工 ...
- delphi 导出到excel的7种方法
本文来自 爱好者8888 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/kpc2000/article/details/17066823?utm_source=cop ...
- delphi 导出到excel的第1种方法
第一种方法delphi 快速导出excel uses ComObj,clipbrd; function ToExcel(sfilename:string; ADOQuery:TADOQuery):bo ...
随机推荐
- CSS文字大小单位px、em、pt详解
这里引用的是Jorux的“95%的中国网站需要重写CSS”的文章,题目有点吓人,但是确实是现在国内网页制作方面的一些缺陷.我一直也搞不清楚px与em之间的关系和特点,看过以后确实收获很大.平时都是用p ...
- java代码分析及分析工具
一个项目从搭建开始,开发的初期往往思路比较清晰,代码也比较清晰.随着时间的推移,业务越来越复杂.代码也就面临着耦合,冗余,甚至杂乱,到最后谁都不敢碰. 作为一个互联网电子商务网站的业务支撑系统,业务复 ...
- Python 安装路径, dist-packages 和 site-packages 区别
Stack Overflow's answer 译: dist-packages is a Debian-specific convention that is also present in its ...
- SQL存储过程将符合条件的大量记录批量删除脚本
-- ============================================= -- Author: James Fu -- Create date: 2015/10/27 -- D ...
- geoserver中除了使用kml来查询数据以外,还可以使用csql或ecsql
package com.geoserver; import java.io.IOException; import java.util.ArrayList; import java.util.Hash ...
- [BAT]远程执行或停止计划任务
执行 schtasks /run /tn "IPADForAdvisor_QA_APITest" /s SZPCWIN2K801 /u msdomain1\jzhang6 /p j ...
- servlet 中 service ,doGet , doPost 关系
web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2 ...
- MySQL 组合查询 concat
concat( pms_user.f_pu_name, '(' , pms_user.f_pu_realName,')') as userIds
- pthread_once 和 pthread_key
http://blog.csdn.net/rickyguo/article/details/6259410 一次性初始化 有时候我们需要对一些posix变量只进行一次初始化,如线程键(我下面会讲到). ...
- kafka系列 -- 基础概念
kafka是一个分布式的.分区化.可复制提交的发布订阅消息系统 传统的消息传递方法包括两种: 排队:在队列中,一组用户可以从服务器中读取消息,每条消息都发送给其中一个人. 发布-订阅:在这个模型中,消 ...