WinForm导出文件为Word、Excel、文本文件的方法
作者:junjie 发布时间:2022-07-08 20:07:16
标签:WinForm,导出文件,Word,Excel,文本文件
好久没有写文章了,下面把自己最近程序中用到的一个小小的导出文件的方法给在家分享一下,欢迎大家来排砖,谢谢~不说废话了,直接上代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using Microsoft.Office.Interop.Word;
using System.IO;
using Microsoft.Office.Interop.Excel;
using Sun.Winform.Util;
namespace Sun.Winform.Files
{
/// <summary>
/// 将内容导出为文件类。
/// </summary>
/// <remarks>
/// 作者:SunYujing
/// 日期:2011-12-18
/// </remarks>
public class ExportFile
{
/// <summary>
/// 将字符串存储为word文档格式的文件的方法(多线程)。
/// </summary>
/// <param name="strText">要保存的字符串内容。</param>
public static void SaveAsWord(string p_str)
{
Thread thread = new Thread(SaveAsWordFile);
thread.SetApartmentState(ApartmentState.STA);
thread.Start(p_str);
}
/// <summary>
/// 将字符串存储为txt格式的文件的方法(多线程)。
/// </summary>
/// <param name="p_str"></param>
public static void SaveAsTxt(string p_str)
{
Thread thread = new Thread(SaveAsTxtFile);
thread.SetApartmentState(ApartmentState.STA);
thread.Start(p_str);
}
/// <summary>
/// 导出数据表数据到Excel(多线程)。
/// </summary>
public static void SaveAsExcel(System.Data.DataTable dataTable)
{
if (dataTable == null)
{
MessageUtil.ShowError("请先指定要导出的数据表");
return;
}
Thread thread = new Thread(SaveAsExcelTableFile);
thread.SetApartmentState(ApartmentState.STA);
thread.Start(dataTable);
}
/// <summary>
/// 导出数据集数据到Excel(多线程)。
/// </summary>
public static void SaveAsExcel(System.Data.DataSet dataSet)
{
if (dataSet == null)
{
MessageUtil.ShowError("请先指定要导出的数据集");
return;
}
Thread thread = new Thread(SaveAsExcelSetFile);
thread.SetApartmentState(ApartmentState.STA);
thread.Start(dataSet);
}
/// <summary>
/// 将字符串存储为word文档格式的文件。
/// </summary>
/// <param name="strtext">要保存的字符串内容。</param>
private static void SaveAsWordFile(object strtext)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Title = "请选择文件存放路径";
sfd.FileName = "导出数据";
sfd.Filter = "Word文档(*.doc)|*.doc";
if (sfd.ShowDialog() != DialogResult.OK)
{
return;
}
string FileName = sfd.FileName.ToLower();
if (!FileName.Contains(".doc"))
{
FileName += ".doc";
}
if (FileName.Substring(FileName.LastIndexOf(Path.DirectorySeparatorChar)).Length <= 5)
{
MessageUtil.ShowThreadMessage("文件保存失败,文件名不能为空!");
return;
}
try
{
DateTime start = DateTime.Now;
MessageUtil.ShowThreadMessage("正在保存文件,请稍候...");
Microsoft.Office.Interop.Word.ApplicationClass word = new Microsoft.Office.Interop.Word.ApplicationClass();
Microsoft.Office.Interop.Word._Document doc;
object nothing = System.Reflection.Missing.Value;
doc = word.Documents.Add(ref nothing, ref nothing, ref nothing, ref nothing);
doc.Paragraphs.Last.Range.Text = strtext.ToString();
object myfileName = FileName;
//将WordDoc文档对象的内容保存为doc文档
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);
//关闭WordDoc文档对象
doc.Close(ref nothing, ref nothing, ref nothing);
//关闭WordApp组件对象
word.Quit(ref nothing, ref nothing, ref nothing);
GC.Collect();
DateTime end = DateTime.Now;
TimeSpan ts = end - start;
MessageUtil.ShowMessage("文件保存成功,用时" + ts.ToString());
}
catch (System.Exception ex)
{
MessageUtil.ShowError(ex.Message);
}
}
/// <summary>
/// 将字符串存储为txt文档格式的文件。
/// </summary>
/// <param name="strtext">要保存的字符串内容。</param>
private static void SaveAsTxtFile(object strtext)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Title = "请选择文件存放路径";
sfd.FileName = "导出数据";
sfd.Filter = "文本文档(*.txt)|*.txt";
if (sfd.ShowDialog() != DialogResult.OK)
{
return;
}
string FileName = sfd.FileName.ToLower();
if (!FileName.Contains(".txt"))
{
FileName += ".txt";
}
if (FileName.Substring(FileName.LastIndexOf(Path.DirectorySeparatorChar)).Length <= 5)
{
MessageUtil.ShowThreadMessage("文件保存失败,文件名不能为空!");
return;
}
try
{
DateTime start = DateTime.Now;
StreamWriter sw = new StreamWriter(FileName, false);
sw.Write(strtext.ToString());
sw.Flush();
sw.Close();
DateTime end = DateTime.Now;
TimeSpan ts = end - start;
MessageUtil.ShowMessage("文件保存成功,用时" + ts.ToString());
}
catch (Exception ex)
{
MessageUtil.ShowError(ex.Message);
}
}
/// <summary>
/// 将数据存储为Excel文件。
/// </summary>
/// <param name="p_dt">要保存的数据表。</param>
private static void SaveAsExcelTableFile(object p_dt)
{
System.Data.DataTable dt = (System.Data.DataTable)p_dt;
if (dt.Rows.Count == 0)
{
MessageUtil.ShowError("没有可保存的数据");
return;
}
SaveFileDialog sfd = new SaveFileDialog();
sfd.Title = "请选择文件存放路径";
sfd.FileName = "导出数据";
sfd.Filter = "Excel文档(*.xls)|*.xls";
if (sfd.ShowDialog() != DialogResult.OK)
{
return;
}
string FileName = sfd.FileName.ToLower();
if (!FileName.Contains(".xls"))
{
FileName += ".xls";
}
if (FileName.Substring(FileName.LastIndexOf(Path.DirectorySeparatorChar)).Length <= 5)
{
MessageUtil.ShowThreadMessage("文件保存失败,文件名不能为空!");
return;
}
if (sfd.FileName != "")
{
Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
if (excelApp == null)
{
MessageBox.Show("无法创建Excel对象,可能您的机器未安装Excel");
return;
}
else
{
MessageUtil.ShowThreadMessage("正在导出数据,请稍候...");
DateTime start = DateTime.Now;
Microsoft.Office.Interop.Excel.Workbooks workbooks = excelApp.Workbooks;
Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Worksheet)workbook.Worksheets[1];
for (int col = 1; col <= dt.Columns.Count; col++)
{
worksheet.Cells[1, col] = dt.Columns[col - 1].Caption.ToString();
}
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < dt.Columns.Count; j++)
{
worksheet.Cells[i + 2, j + 1] = dt.Rows[i][j].ToString();
}
}
workbook.Saved = true;
workbook.SaveCopyAs(sfd.FileName);
//释放资源
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
worksheet = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
workbook = null;
workbooks.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
workbooks = null;
excelApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
excelApp = null;
//使用垃圾回收可以关闭EXCEL.EXE进程
GC.Collect();
DateTime end = DateTime.Now;
int iTimeSpan = (end.Minute - start.Minute) * 60 + (end.Second - start.Second);
MessageUtil.ShowMessage("数据导出完毕,用时" + iTimeSpan.ToString() + "秒");
}
}
}
/// <summary>
/// 将数据集存储为Excel文件。
/// </summary>
/// <param name="p_ds">要导出的数据集。</param>
private static void SaveAsExcelSetFile(object p_ds)
{
System.Data.DataSet ds = (System.Data.DataSet)p_ds;
if (ds == null || ds.Tables.Count == 0)
{
MessageUtil.ShowError("没有可保存的数据");
return;
}
SaveFileDialog sfd = new SaveFileDialog();
sfd.Title = "请选择文件存放路径";
sfd.FileName = "导出数据";
sfd.Filter = "Excel文档(*.xls)|*.xls";
if (sfd.ShowDialog() != DialogResult.OK)
{
return;
}
string FileName = sfd.FileName.ToLower();
if (!FileName.Contains(".xls"))
{
FileName += ".xls";
}
if (FileName.Substring(FileName.LastIndexOf(Path.DirectorySeparatorChar)).Length <= 5)
{
MessageUtil.ShowThreadMessage("文件保存失败,文件名不能为空!");
return;
}
if (sfd.FileName != "")
{
Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
if (excelApp == null)
{
MessageBox.Show("无法创建Excel对象,可能您的机器未安装Excel");
return;
}
else
{
MessageUtil.ShowThreadMessage("正在导出数据,请稍候...");
DateTime start = DateTime.Now;
Microsoft.Office.Interop.Excel.Workbooks workbooks = excelApp.Workbooks;
Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Microsoft.Office.Interop.Excel.Worksheet worksheet = null;
object objMissing = System.Reflection.Missing.Value;
for (int m = 0; m < ds.Tables.Count; m++)
{
System.Data.DataTable dt = ds.Tables[m];
worksheet = (Worksheet)workbook.ActiveSheet;
worksheet.Name = dt.TableName;
for (int col = 1; col <= dt.Columns.Count; col++)
{
worksheet.Cells[1, col] = dt.Columns[col - 1].Caption.ToString();
}
for (int i = 1; i <= dt.Rows.Count; i++)
{
for (int j = 1; j <= dt.Columns.Count; j++)
{
worksheet.Cells[i + 1, j] = dt.Rows[i - 1][j - 1].ToString();
}
}
if (m < ds.Tables.Count - 1)
{
workbook.Sheets.Add(objMissing, objMissing, 1, XlSheetType.xlWorksheet);
}
}
workbook.Saved = true;
workbook.SaveCopyAs(sfd.FileName);
//释放资源
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
worksheet = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
workbook = null;
workbooks.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
workbooks = null;
excelApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
excelApp = null;
GC.Collect();
DateTime end = DateTime.Now;
int iTimeSapn = (end.Minute - start.Minute) * 60 + (end.Second - start.Second);
MessageUtil.ShowMessage("数据导出完毕,用时" + (iTimeSapn / 60).ToString() + "分" + (iTimeSapn % 60).ToString() + "秒");
}
}
}
}
}


猜你喜欢
- 因项目集成了Redis缓存部分数据,需要在程序启动时将数据加载到Redis中,即初始化数据到Redis。在SpringBoot项目下,即在容
- 什么是递归?用Java写一个简单的递归程序递归的定义递归(recursion):以此类推是递归的基本思想,将规模大的问题转化为规模小的问题来
- 如下所示://读取json文件地址 /* String path = getClass().getClassLoader().g
- 本文实例分析了C#中委托和事件的区别,分享给大家供大家参考之用。具体如下:大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法。事件
- 支付宝上有一个咻一咻的功能,就是点击图片后四周有水波纹的这种效果,今天也写一个类似的功能。效果如下所示:思路:就是几个圆的半径不断在变大,这
- 今天在安装VS2019的时候,在安装的过程中一直无法进入安装界面,在网上找了各种方法试了将近40分钟都没有找到有效的办法,不过就快放弃的时候
- Jackson反序列化遇到的问题最近在项目中需要使用Jackson把前台转来的字符转为对象,转换过程中发生了错误,报错如下com.faste
- 题目:给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路
- spring Boot 熟悉后,集成一个外部扩展是一件很容易的事,集成Redis也很简单,看下面步骤配置:一、添加pom依赖
- 查询数据会比较耗时,所以我们想把查询数据放在一个异步任务中,查询结果获得Cursor,然后在onPostExecute (Cursor re
- PathVariable 映射 URL 绑定的占位符带占位符的 URL 是 Spring3.0 新增的功能,该功能在SpringMVC 向
- 比如有海量的文本文件,如订单,页面点击事件的记录,量特别大,很难搞定。那么我们该怎样解决海量数据的计算?1、获取总行数2、计算每个文件中存多
- 一、新建项目并设置界面新建项目:选择Windows窗体项目应用(.Net Framework):设置项目名和路径:新建项目如下:设置界面:将
- 本篇开始介绍Jetpack Compose 中的修饰符Modifier。修饰符可以用来执行以下操作:更改可组合项的大小、布局、行为和外观。添
- 堆排序基本介绍1、堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),
- 最近研究C#相关的ORC技术,图像识别一般C和C++这种底层语言做的比较多,C#主要是依托一些封装好的组件进行调用,这里介绍三种身份证识别的
- 前言我们在前面介绍AssignAnalyzer时,对AssignAnalyzer.letInit(DiagnosticPosition, V
- 扫码抢实现读取二维码信息,本地扫码枪是外接写入设备,本质是监控读写输入,下面介绍下扫码设备读取支付二维码。1.引入扫码设备辅助类public
- 在看别人的关于CopyOnWriteArrayList 这个类的时候,看到有人提出了关于:数组拷贝的方法Arrays.copyOf() 的问
- VC和BCB中做一个Server的监听程序,只需要指定端口,然后监听(Listen)就行了.在C#找不到这个函数了,慢慢看MSDN,怎么需要