WinForm导出文件为Word、Excel、文本文件的方法

   2015-07-25 0
核心提示:这篇文章主要介绍了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() + "秒");
        }
      }
    }
  }
}

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • C#连接本地Access数据库及简单操作的winform小程序
    C#连接本地Access数据库及简单操作的winform小
    连接本地Access数据库及简单操作的winform小程序一、准备工作用Access创建一个数据库并创建一个表格。(对于非远程数据库,Access十分简单。表格可参考三、界面设计)。二、代码using System;using System.Collections.Generic;using System.ComponentModel;u
    02-09
  • 在Winform中播放视频等【DotNet,C#】
    在项目中遇到过这样的问题,就是如何在Winform中播放视频。当时考察了几种方式,第一种是直接使用Windows Media Player组件,这种最简单;第二种是利用DirectX直接在窗体或者控件上绘图,这种比较复杂。于是采用的是第一种方法。      先从VS的工具箱里
    02-09
  • NX二次开发-基于Winform界面对话框与NXOPEN C#交互的开发(对话框嵌套)
    NX二次开发-基于Winform界面对话框与NXOPEN C#
    一.用类库方式创建1.新建类库进来后编译代码,成功 添加NXOPEN的库到项目中   不同NX版本,可能dll所在位置不一样,NX11以上版本在NXBIN这里,NX11以下版本大概在UGII。 添加头文件using NXOpen;using NXOpen.Utilities;using NXOpen.UF; 2.添加winform
    02-09
  • c# WinForm开发 DataGridView控件的各种操作
    一、单元格内容的操作 *****// 取得当前单元格内容         Console.WriteLine(DataGridView1.CurrentCell.Value); // 取得当前单元格的列 Index       Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex); // 取得当前单元格的行 Index
    02-09
  • C#:winform项目在win7,xp32位和64位都能执行
    vs中项目配置管理器活动解决方式平台选择X86平台。
    02-09
  • C# Winform消息通知系统托盘气泡提示框ToolTip控件
    C# Winform消息通知系统托盘气泡提示框ToolTip
    目录气球状提示框的介绍和系统通知变化消息通知的提示ShowBalloonTip()方法及指定消息类型NotifyIcon属性设置消息BalloonTipIcon不同的消息类型ToolTipText属性ToolTip提示控件显式或主动的提示消息一个ToolTip同时为多个控件设置提示显式设置ToolTip气球状提
  • 详解C# WinForm如何实现自动更新程序
    详解C# WinForm如何实现自动更新程序
    目录前言开发环境开发工具实现代码实现效果前言在C/S这种模式中,自动更新程序就显得尤为重要,它不像B/S模式,直接发布到服务器上,浏览器点个刷新就可以了。由于涉及到客户端文件,所以必然需要把相应的文件下载下来。这个其实比较常见,我们常用的微信、QQ
  • C# WinForm实现自动更新程序之客户端的示例代码
    C# WinForm实现自动更新程序之客户端的示例代
    目录前言开发环境开发工具实现代码实现效果前言第二步理论上我们该写客户端了,但是,在此之前,需要先介绍下一些必要的方法以及操作。写代码还是要尽量的保证通用性,以便以后需要的时候可以拿来稍微改改甚至直接使用。所以在这里我们将自动更新的程序抽象出
  • 分享一个基于winForm后台单线程推送多线程并行处理业务的小程序框架
    分享一个基于winForm后台单线程推送多线程并行
      在前面的文章中我曾分享了一个小程序框架,后来在这个框架基础上我把它改成了基于多线程并行处理的方式。这个小框架主要用于的场景是这样的:有时我们需要处理大量数据如来自数据库表的数据,有时还不能重复处理,如果我们用同步的方式逐条处理的话那么效
    02-09
  • C# winform Panel 添加 滚动条 cba赛程
    Detailed discussion here. Try this instead for 'only' scrolling vertical.(auto scroll needs to be false before it will accept changes)mypanel.AutoScroll = false;mypanel.HorizontalScroll.Enabled = false;mypanel.HorizontalScroll.Visible = f
    02-08
点击排行