当前位置: 首页 > 编程日记 > 正文

WinForm导出文件,你懂的……

好久没有写文章了,下面把自己最近程序中用到的一个小小的导出文件的方法给在家分享一下,欢迎大家来排砖,谢谢~不说废话了,直接上代码:

  1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using System.Threading;
7 using Microsoft.Office.Interop.Word;
8 using System.IO;
9 using Microsoft.Office.Interop.Excel;
10 using Sun.Winform.Util;
11
12 namespace Sun.Winform.Files
13 {
14 /// <summary>
15 /// 将内容导出为文件类。
16 /// </summary>
17 /// <remarks>
18 /// 作者:SunYujing
19 /// 日期:2011-12-18
20 /// </remarks>
21 public class ExportFile
22 {
23 /// <summary>
24 /// 将字符串存储为word文档格式的文件的方法(多线程)。
25 /// </summary>
26 /// <param name="strText">要保存的字符串内容。</param>
27 public static void SaveAsWord(string p_str)
28 {
29 Thread thread = new Thread(SaveAsWordFile);
30 thread.SetApartmentState(ApartmentState.STA);
31 thread.Start(p_str);
32 }
33 /// <summary>
34 /// 将字符串存储为txt格式的文件的方法(多线程)。
35 /// </summary>
36 /// <param name="p_str"></param>
37 public static void SaveAsTxt(string p_str)
38 {
39 Thread thread = new Thread(SaveAsTxtFile);
40 thread.SetApartmentState(ApartmentState.STA);
41 thread.Start(p_str);
42 }
43 /// <summary>
44 /// 导出数据表数据到Excel(多线程)。
45 /// </summary>
46 public static void SaveAsExcel(System.Data.DataTable dataTable)
47 {
48 if (dataTable == null)
49 {
50 MessageUtil.ShowError("请先指定要导出的数据表");
51 return;
52 }
53 Thread thread = new Thread(SaveAsExcelTableFile);
54 thread.SetApartmentState(ApartmentState.STA);
55 thread.Start(dataTable);
56 }
57 /// <summary>
58 /// 导出数据集数据到Excel(多线程)。
59 /// </summary>
60 public static void SaveAsExcel(System.Data.DataSet dataSet)
61 {
62 if (dataSet == null)
63 {
64 MessageUtil.ShowError("请先指定要导出的数据集");
65 return;
66 }
67 Thread thread = new Thread(SaveAsExcelSetFile);
68 thread.SetApartmentState(ApartmentState.STA);
69 thread.Start(dataSet);
70 }
71 /// <summary>
72 /// 将字符串存储为word文档格式的文件。
73 /// </summary>
74 /// <param name="strtext">要保存的字符串内容。</param>
75 private static void SaveAsWordFile(object strtext)
76 {
77 SaveFileDialog sfd = new SaveFileDialog();
78 sfd.Title = "请选择文件存放路径";
79 sfd.FileName = "导出数据";
80 sfd.Filter = "Word文档(*.doc)|*.doc";
81 if (sfd.ShowDialog() != DialogResult.OK)
82 {
83 return;
84 }
85 string FileName = sfd.FileName.ToLower();
86 if (!FileName.Contains(".doc"))
87 {
88 FileName += ".doc";
89 }
90 if (FileName.Substring(FileName.LastIndexOf(Path.DirectorySeparatorChar)).Length <= 5)
91 {
92 MessageUtil.ShowThreadMessage("文件保存失败,文件名不能为空!");
93 return;
94 }
95 try
96 {
97 DateTime start = DateTime.Now;
98 MessageUtil.ShowThreadMessage("正在保存文件,请稍候...");
99 Microsoft.Office.Interop.Word.ApplicationClass word = new Microsoft.Office.Interop.Word.ApplicationClass();
100 Microsoft.Office.Interop.Word._Document doc;
101 object nothing = System.Reflection.Missing.Value;
102 doc = word.Documents.Add(ref nothing, ref nothing, ref nothing, ref nothing);
103 doc.Paragraphs.Last.Range.Text = strtext.ToString();
104 object myfileName = FileName;
105 //将WordDoc文档对象的内容保存为doc文档
106 doc.SaveAs(ref myfileName, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing);
107 //关闭WordDoc文档对象
108 doc.Close(ref nothing, ref nothing, ref nothing);
109 //关闭WordApp组件对象
110 word.Quit(ref nothing, ref nothing, ref nothing);
111 GC.Collect();
112 DateTime end = DateTime.Now;
113 TimeSpan ts = end - start;
114 MessageUtil.ShowMessage("文件保存成功,用时" + ts.ToString());
115 }
116 catch (System.Exception ex)
117 {
118 MessageUtil.ShowError(ex.Message);
119 }
120 }
121 /// <summary>
122 /// 将字符串存储为txt文档格式的文件。
123 /// </summary>
124 /// <param name="strtext">要保存的字符串内容。</param>
125 private static void SaveAsTxtFile(object strtext)
126 {
127 SaveFileDialog sfd = new SaveFileDialog();
128 sfd.Title = "请选择文件存放路径";
129 sfd.FileName = "导出数据";
130 sfd.Filter = "文本文档(*.txt)|*.txt";
131 if (sfd.ShowDialog() != DialogResult.OK)
132 {
133 return;
134 }
135 string FileName = sfd.FileName.ToLower();
136 if (!FileName.Contains(".txt"))
137 {
138 FileName += ".txt";
139 }
140 if (FileName.Substring(FileName.LastIndexOf(Path.DirectorySeparatorChar)).Length <= 5)
141 {
142 MessageUtil.ShowThreadMessage("文件保存失败,文件名不能为空!");
143 return;
144 }
145 try
146 {
147 DateTime start = DateTime.Now;
148 StreamWriter sw = new StreamWriter(FileName, false);
149 sw.Write(strtext.ToString());
150 sw.Flush();
151 sw.Close();
152 DateTime end = DateTime.Now;
153 TimeSpan ts = end - start;
154 MessageUtil.ShowMessage("文件保存成功,用时" + ts.ToString());
155 }
156 catch (Exception ex)
157 {
158 MessageUtil.ShowError(ex.Message);
159 }
160 }
161 /// <summary>
162 /// 将数据存储为Excel文件。
163 /// </summary>
164 /// <param name="p_dt">要保存的数据表。</param>
165 private static void SaveAsExcelTableFile(object p_dt)
166 {
167 System.Data.DataTable dt = (System.Data.DataTable)p_dt;
168 if (dt.Rows.Count == 0)
169 {
170 MessageUtil.ShowError("没有可保存的数据");
171 return;
172 }
173 SaveFileDialog sfd = new SaveFileDialog();
174 sfd.Title = "请选择文件存放路径";
175 sfd.FileName = "导出数据";
176 sfd.Filter = "Excel文档(*.xls)|*.xls";
177 if (sfd.ShowDialog() != DialogResult.OK)
178 {
179 return;
180 }
181 string FileName = sfd.FileName.ToLower();
182 if (!FileName.Contains(".xls"))
183 {
184 FileName += ".xls";
185 }
186 if (FileName.Substring(FileName.LastIndexOf(Path.DirectorySeparatorChar)).Length <= 5)
187 {
188 MessageUtil.ShowThreadMessage("文件保存失败,文件名不能为空!");
189 return;
190 }
191 if (sfd.FileName != "")
192 {
193 Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
194 if (excelApp == null)
195 {
196 MessageBox.Show("无法创建Excel对象,可能您的机器未安装Excel");
197 return;
198 }
199 else
200 {
201 MessageUtil.ShowThreadMessage("正在导出数据,请稍候...");
202 DateTime start = DateTime.Now;
203 Microsoft.Office.Interop.Excel.Workbooks workbooks = excelApp.Workbooks;
204 Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
205 Microsoft.Office.Interop.Excel.Worksheet worksheet = (Worksheet)workbook.Worksheets[1];
206
207 for (int col = 1; col <= dt.Columns.Count; col++)
208 {
209 worksheet.Cells[1, col] = dt.Columns[col - 1].Caption.ToString();
210 }
211 for (int i = 0; i < dt.Rows.Count; i++)
212 {
213 for (int j = 0; j < dt.Columns.Count; j++)
214 {
215 worksheet.Cells[i + 2, j + 1] = dt.Rows[i][j].ToString();
216 }
217 }
218 workbook.Saved = true;
219 workbook.SaveCopyAs(sfd.FileName);
220 //释放资源
221 System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
222 worksheet = null;
223 System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
224 workbook = null;
225 workbooks.Close();
226 System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
227 workbooks = null;
228 excelApp.Quit();
229 System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
230 excelApp = null;
231 //使用垃圾回收可以关闭EXCEL.EXE进程
232 GC.Collect();
233 DateTime end = DateTime.Now;
234 int iTimeSpan = (end.Minute - start.Minute) * 60 + (end.Second - start.Second);
235 MessageUtil.ShowMessage("数据导出完毕,用时" + iTimeSpan.ToString() + "");
236 }
237 }
238 }
239 /// <summary>
240 /// 将数据集存储为Excel文件。
241 /// </summary>
242 /// <param name="p_ds">要导出的数据集。</param>
243 private static void SaveAsExcelSetFile(object p_ds)
244 {
245 System.Data.DataSet ds = (System.Data.DataSet)p_ds;
246 if (ds == null || ds.Tables.Count == 0)
247 {
248 MessageUtil.ShowError("没有可保存的数据");
249 return;
250 }
251 SaveFileDialog sfd = new SaveFileDialog();
252 sfd.Title = "请选择文件存放路径";
253 sfd.FileName = "导出数据";
254 sfd.Filter = "Excel文档(*.xls)|*.xls";
255 if (sfd.ShowDialog() != DialogResult.OK)
256 {
257 return;
258 }
259 string FileName = sfd.FileName.ToLower();
260 if (!FileName.Contains(".xls"))
261 {
262 FileName += ".xls";
263 }
264 if (FileName.Substring(FileName.LastIndexOf(Path.DirectorySeparatorChar)).Length <= 5)
265 {
266 MessageUtil.ShowThreadMessage("文件保存失败,文件名不能为空!");
267 return;
268 }
269 if (sfd.FileName != "")
270 {
271 Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
272 if (excelApp == null)
273 {
274 MessageBox.Show("无法创建Excel对象,可能您的机器未安装Excel");
275 return;
276 }
277 else
278 {
279 MessageUtil.ShowThreadMessage("正在导出数据,请稍候...");
280 DateTime start = DateTime.Now;
281 Microsoft.Office.Interop.Excel.Workbooks workbooks = excelApp.Workbooks;
282 Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
283 Microsoft.Office.Interop.Excel.Worksheet worksheet = null;
284 object objMissing = System.Reflection.Missing.Value;
285 for (int m = 0; m < ds.Tables.Count; m++)
286 {
287 System.Data.DataTable dt = ds.Tables[m];
288 worksheet = (Worksheet)workbook.ActiveSheet;
289 worksheet.Name = dt.TableName;
290 for (int col = 1; col <= dt.Columns.Count; col++)
291 {
292 worksheet.Cells[1, col] = dt.Columns[col - 1].Caption.ToString();
293 }
294 for (int i = 1; i <= dt.Rows.Count; i++)
295 {
296 for (int j = 1; j <= dt.Columns.Count; j++)
297 {
298 worksheet.Cells[i + 1, j] = dt.Rows[i - 1][j - 1].ToString();
299 }
300 }
301 if (m < ds.Tables.Count - 1)
302 {
303 workbook.Sheets.Add(objMissing, objMissing, 1, XlSheetType.xlWorksheet);
304 }
305 }
306 workbook.Saved = true;
307 workbook.SaveCopyAs(sfd.FileName);
308 //释放资源
309 System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
310 worksheet = null;
311 System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
312 workbook = null;
313 workbooks.Close();
314 System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
315 workbooks = null;
316 excelApp.Quit();
317 System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
318 excelApp = null;
319 GC.Collect();
320 DateTime end = DateTime.Now;
321 int iTimeSapn = (end.Minute - start.Minute) * 60 + (end.Second - start.Second);
322 MessageUtil.ShowMessage("数据导出完毕,用时" + (iTimeSapn / 60).ToString() + "" + (iTimeSapn % 60).ToString() + "");
323 }
324 }
325 }
326 }
327 }

转载于:https://www.cnblogs.com/sunyujing/archive/2011/12/18/2292018.html

相关文章:

PL/SQL第五章 Order by排序

1 -- 排序2 -- 1、列明排序3 -- 2、别名排序4 -- 3、列位置排序&#xff08;当使用union,union all,intersect,minus集合操作&#xff0c;列明不同&#xff0c;但希望排序&#xff09;5 SELECT deptno,dname FROM dept UNION6 SELECT empno,ename FROM emp7 ORDER BY 1 DESC;8 …

想转行学python过来人提醒大家几点

因为目前python非常火&#xff0c;应用也非常广泛&#xff0c;是目前最火的行业之一&#xff0c;竞争很大&#xff0c;工资很高&#xff0c;未来发展也极好。 首先告诉你&#xff0c;零基础学习python难度还是有的&#xff0c;python的专业程度本身就不简单&#xff0c;学习这事…

mysql答题表设计_PHP+MYSQL问答系统中的提问和回答的表怎么设计

展开全部PHPMYSQL 的问答系32313133353236313431303231363533e78988e69d8331333337396236统的设计与实现&#xff0c;问答系统简而言之 就是一个网上交流系统&#xff0c;针对学校这个特定环境&#xff0c;以学生和老师为主体&#xff0c;以实验室信息交流为话题而建立起的一个…

Android实时获取音量(单位:分贝)

基础知识 度量声音强度&#xff0c;大家最熟悉的单位就是分贝&#xff08;decibel&#xff0c;缩写为dB&#xff09;。这是一个无纲量的相对单位&#xff0c;计算公式如下&#xff1a; 分子是测量值的声压&#xff0c;分母是参考值的声压&#xff08;20微帕&#xff0c;人类所能…

排序算法 - 堆排序

堆排序是指利用堆这种数据结构所设计的一种排序算法。 类型&#xff1a;选择排序时间复杂度&#xff08;最坏&#xff09;&#xff1a;O(nlogn)时间复杂度&#xff08;最好&#xff09;&#xff1a;O(nlogn)时间复杂度&#xff08;平均&#xff09;&#xff1a;O(nlogn)空间复杂…

textContent与innerText的不同(转发)

textContent与innerText的不同 IE下有个innerText属性&#xff0c;FF下有个textContent属性。很多以前给IE写脚本的&#xff0c;在FF下找不到innerText属性&#xff0c;于是网上搜到的建议是用textContent来替代。反之给FF写脚本的也一样。 但是实际上&#xff0c;这里有个误解…

mysql插入性能_mysql 数据量大时插入和查询性能

现在mysql中有数据33.8w的数据&#xff0c;然后做查询和更新或插入操作&#xff0c;速度很慢&#xff0c;基本100条数据就要1.68s。好慢啊&#xff0c;我要测试一下&#xff0c;到底慢在哪&#xff1f;能不能提高点速度&#xff1f;参考一篇博文&#xff1a;http://blog.csdn.n…

Ext JS 4 笔记1

ExtJS4 引入了现在灰常流行的前端MVC。这在原本的3.3.1里面是没有的。原先项目里为了实现相对的MVC&#xff0c;自己写了一个controller和model &#xff0c;收集并且保持JS端的数据。所以呢&#xff0c;这时候的文档结构就完全不一样了。原本的结构更像是传统 C# winform &…

activemq 消息阻塞优化和消息确认机制优化

一、消息阻塞优化 1.activemq消费者在从待消费队列中获取消息是会先进行预读取&#xff0c;默认是1000条&#xff08;prefetch1000&#xff09;。这样很容易造成消息积压。 2.可以通过设置prefetch的默认值来调整预读取条数&#xff0c;java代码如下 //设置预读取为1ActiveMQPr…

iOS-查询数据库--指定数据表中的当前数据行的总数量

很多时候&#xff0c;我们在查询一个表的时候&#xff0c;不想得到里面的记录内容&#xff0c;只是想简单的得到符合查询条件的记录条数。 FMDB中有一个很简单的方法就可以实现&#xff0c;见下面的代码实例&#xff1a; #import "FMdatabase.h" (int)numberOfCurre…

mysql 判断日期是否在某范围内_判断时间是否在某个区间内

private bool IsInTimeInterval(DateTime time, DateTime startTime, DateTime endTime) {//判断时间段开始时间是否小于时间段结束时间,如果不是就交换 if (startTime > endTime) {DateTime tempTime = startTime; startTime = endTime; endTime = tempTime; } //获取以公…

数据库索引-基本知识

为什么80%的码农都做不了架构师&#xff1f;>>> 数据库索引--基本知识 有许多因素会影响数据库性能。最明显的是数据量&#xff1a;您拥有的数据越多&#xff0c;数据库的速度就越慢。虽然有很多方法可以解决性能问题&#xff0c;但主要的解决方案是正确索引数据库…

Microsoft Enterprise Library 5.0 系列(八) Unity Dependency Injection and Interception

依赖注入容器Unity: Unity的构造类似于Castle中的IOC&#xff08;控制反转 或者叫依赖注入&#xff09;容器,我们使用抽象接口来隔离使用者和具体实现之间的依赖关系&#xff0c;但是不管再怎么抽象&#xff0c;最终还是要创建具体实现类的实例&#xff0c;这种创建具体实现类的…

pycharm 使用小结

1.pycharm 自动换行,显示行号,缩进向导 在代码右侧右键 2.自动注释/取消注释 ctrl /转载于:https://www.cnblogs.com/xuesu/p/4755086.html

golang socket读写同时_epoll在Golang的应用

使用Golang可以轻松地为每一个TCP连接创建一个协程去服务而不用担心性能问题&#xff0c;这是因为Go内部使用goroutine结合IO多路复用实现了一个“异步”的IO模型&#xff0c;这使得开发者不用过多的关注底层&#xff0c;而只需要按照需求编写上层业务逻辑。这种异步的IO是如何…

HTTP 2.0与OkHttp

HTTP 2.0是对1.x的扩展而非替代&#xff0c;之所以是“2.0”&#xff0c;是因为它改变了客户端与服务器之间交换数据的方式。HTTP 2.0增加了新的二进制分帧数据层&#xff0c;而这一层并不兼容之前的HTTP 1.x服务器及客户端——是谓2.0。  在正式介绍HTTP 2.0之前&#xff0c;…

根据“坐标”生成趋势图

数据库环境&#xff1a;SQL SERVER 2008R2 有一“坐标”表t&#xff0c;表结构如下&#xff1a; id int&#xff0c; num int 字段id是序号&#xff0c;递增且连续&#xff0c;字段num是数值类型。id可以看成是坐标轴的横轴&#xff0c;num则跟纵轴有关系&…

Winform程序怎么降低占用的内存?

1 Winform程序怎么降低占用的内存&#xff1f;winform程序占用的内存数一直居高不下&#xff0c;提供给用户的手册中说明内存不能大于50MB,但是每次运行的时候&#xff0c;内存都会飙高到100多MB. 2 3 后来终于发现了一个方法&#xff0c;可以解决这个问题&#xff1a; …

mysql关系表控制_mysql表关系

一、表的详细操作1.修改表名alter table 旧表名 rename 新表名;​2.修改表的引擎与字符编码alter table 表名 engine"引擎名" charset"编码名";​3.复制表 *#结构create table 新表名 like 旧表名;eg:1create table nt like tt;#将tt的表结构复制到新表nt中…

【Python3爬虫】常见反爬虫措施及解决办法(二)...

【Python3爬虫】常见反爬虫措施及解决办法&#xff08;二&#xff09; 这一篇博客&#xff0c;还是接着说那些常见的反爬虫措施以及我们的解决办法。同样的&#xff0c;如果对你有帮助的话&#xff0c;麻烦点一下推荐啦。 一、防盗链 这次我遇到的防盗链&#xff0c;除了前面说…

【原创】ListView快速滚动至新添加一行(自动滚动)

在C#开发中我们经常要开发一些日志系统&#xff0c;尤其是基于ListView的日志显示系统。但是当日志增多是你是否有一些困扰&#xff0c;就是它为什么不会自动滚动至最后一行。以下是一小段代码&#xff0c;希望可以帮助你. public void addLog(string logString) { lock (_lock…

MFC调用CFileDialog之后目录居然会改变,调试了好久终于发现是这个问题

MFC调用CFileDialog之后目录居然会改变&#xff0c;调试了好久终于发现是这个问题&#xff0c;上网搜了下&#xff0c;发现也有人和我出现相同的问题。他的博客如下&#xff1a; http://www.programlife.net/current-directory-changed-after-using-cfiledialog.html MFC调用C…

mysqlls_mysql基本命令

1、Mysql启动命令&#xff1a;命令行内容为&#xff1a;\>net start mysql运行情况如图1所示&#xff1a;图1(Mysql启动命令)2、连接Mysql服务器&#xff1a;命令行内容为&#xff1a;\>mysql -u root -h hostaddress -p password其中&#xff0c;root为Mysql的用户名&a…

2019年3月

分包加载 使用公众号登录微信提示  "公众号暂不支持此种登录方式" 使用已经注册过的手机号注册新的微信账号提示  "你申请注册的手机号已被其他微信号绑定,暂时不能使用该手机号注册" https://github.com/witcat/LayaWxCacheFromZip /******/ (functio…

8天学通MongoDB——第三天 细说高级操作

原文地址:http://www.cnblogs.com/huangxincheng/archive/2012/02/21/2361205.html 今天跟大家分享一下mongodb中比较好玩的知识&#xff0c;主要包括&#xff1a;聚合&#xff0c;游标。 一&#xff1a; 聚合 常见的聚合操作跟sql server一样&#xff0c;有&#xff1a;count&…

UVA 10954 Add All

UVA_10954 看了别人解题报告之后发现累加的过程可以这样操作&#xff0c;每次取最小的两个元素加和&#xff0c;然后把和当作一个新元素放进集合&#xff0c;直到剩下一个元素&#xff0c;然后把中间结果加起来就是要求的结果。实际上这个题目就是哈弗曼编码&#xff0c;在LRJ树…

Java将mysql输出csv,如何从Java中的Access数据库导出表并将其保存到.csv

I am trying to export a lot of large tables from a MS Access db with java using the jdbc:odbc bridge. I wanted to save these tables to a CSV file first was wondering what would the best way to do this would be? any help would be appreciated.解决方案Fetch …

windows下nodejs express安装及入门网站,视频资料,开源项目介绍

windows下nodejs express安装及入门网站,视频资料&#xff0c;开源项目介绍&#xff0c;pm2,supervisor,npm,Pomelo,Grunt安装使用注意事项等总结 第一步&#xff1a;下载安装文件下载地址&#xff1a;官网http://www.nodejs.org/download/ 第二步&#xff1a;安装nodejs下载完…

python 之 pip、pypdf2 安装与卸载

pip是个啥&#xff1f; pip 是一个现代的&#xff0c;通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。 第一步&#xff1a;pip 下载&#xff1a;https://pypi.org/project/pip/#files 第二步&#xff1a;解压&#xff0c;进入目录python pip\pi…

eclipse 3.55安装j2ee开发工具

选择help--->install new software -->work width --选择下拉框选择要安装插件转载于:https://www.cnblogs.com/yjhrem/articles/2309602.html