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 ...
随机推荐
- js switch case注意事项
今天写switch的时候发现没有达到预期效果,参照w3school的写法发现语法一致 想了一下,js是弱类型语言,是不是不支持number?试了一下将数字改为字符串,果然可以了 或者可以这样写:swi ...
- 关于weblogic报UnsatisfiedLinkError Native Library xxx.so already loaded
一.场景 最近写的一个系统,在Tomcat测试完后说要改使用weblogic,于是在服务器上安装了weblogic,捣鼓了半天,一个个问题冒了出来,其中就有个比较麻烦的报错:UnsatisfiedLi ...
- php使用数组语法访问对象
有一个对象,不过希望能用数组的语法来读写数据,可以使用 实现SPL的ArrayAccess接口来解决. 使用场景:加载配置文件类.larvel框架加载配置文件就这利用数组来操作对象. 数组式访问Obj ...
- php下的原生ajax请求
浏览器中为我们提供了一个JS对象XMLHttpRequet,它可以帮助我们发送HTTP请求,并接受服务端的响应. 意味着我们的浏览器不提交,通过JS就可以请求服务器. ajax(Asynchron ...
- 【SQL模板】一.修改/新增存储过程TSQL
---Name: 创建存储过程模板.sql ---Purpose: 用于创建 数据库中 新的存储过程 ---Author: xx ---Time: 2015-12-18 10:26:06 ---Rem ...
- vue-awesome-swiper插件
http://www.cnblogs.com/songrimin/p/6905136.html 这个地址不错 在上一些我的demo代码 第一步安装 npm install vue-awesome-sw ...
- JavaScript开发者的工具箱
自从HTML5变得流行以来,整个Web平台取得了长足的进步,人们也开始将JavaScript视为一门能够创建复杂应用的语言.许多新的API纷纷浮现,而关于浏览器如何应用这些技术的文章也大量涌现. 作为 ...
- 测试用例excel模板
Index Precondition Action Test Data Expect Result Excute Date Pass/Fail
- 20155317 王新玮 2016-2017-2 《Java程序设计》第9周学习总结
20155317 王新玮 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以 ...
- java常用设计模式一:单例模式
1.饿汉式 package singleton.demo; /** * @author Administrator * @date 2019/01/07 */ public class Single ...