从数据库导出数据到word、excel、.txt

简介:
using System;
using System.Data;
using System.Drawing;
using System.Data.SqlClient;
using Excel;
using Word;
using System.IO; 
namespace Common
{
 /// <summary>
 /// 把数据导入到.doc、.txt、.xls文件中
 /// </summary>
 public class Export
 {
  private const string DATAWORDPATH = @"C:\folder\doc\datadoc\";
  private const string IMAGEWORDPATH = @"C:\folder\doc\imagedoc\";
  private const string IMAGEPATH = @"C:\folder\image\";
  private const string EXCELPATH = @"C:\folder\excel\";
  private const string TXTPATH = @"C:\folder\txt\";
  private const string IMAGEPOSTFIX = ".bmp";
  private const string WORDPOSTFIX = ".doc";
  private const string EXCELPOSTFIX = ".xls";
  private const string TXTPOSTFIX = ".txt";
  private const int DATADISTANCE = 5;
  private const int TABDISTANCE = 8;
  
  public Export()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  /// <summary>
  /// 获得数据集Dataset--------------------------------用于调试
  /// </summary>
  /// <returns>Dataset</returns>
  public DataSet GetData()
  {
   try
   {
    string sConnectionString;
    sConnectionString = "workstation id=GUOFU;packet size=4096;user id=sa;data source=GUOFU;persist security info=True;initial catalog=YC;password=sc";
    SqlConnection objConn = new SqlConnection(sConnectionString);
    objConn.Open();                                            
    SqlDataAdapter daPoint = new SqlDataAdapter("Select * From Point", objConn);
    DataSet dsYC = new DataSet("YC");
    daPoint.FillSchema(dsYC,SchemaType.Mapped, "Point");
    daPoint.Fill(dsYC,"Point");
    daPoint = new SqlDataAdapter("Select * From Employee", objConn);
    daPoint.FillSchema(dsYC,SchemaType.Mapped, "Employee");
    daPoint.Fill(dsYC,"Employee");
    return dsYC;
   }
   catch(Exception ex)
   { 
    throw new Exception(ex.Message);
   }
  }
  /// <summary>
  /// 把数据文件导入到.xls文件
  /// </summary>
  /// <param name="ds"></param>
  public void ExportToExcel(DataSet ds)
  {
   if(ds.Tables.Count!=0)
   {
    //生成.xls文件完整路径名
    string tempFileName = GetTempFileName();
    object filename = EXCELPATH+tempFileName+EXCELPOSTFIX;
    object Nothing = System.Reflection.Missing.Value;
    
    //创建excel文件,文件名用系统时间生成精确到毫秒
    Excel.Application myExcel = new Excel.ApplicationClass();
    myExcel.Application.Workbooks.Add(Nothing);
    try
    {
     //把Dataset中的数据插入excel文件中
     int totalCount = 0;
     for(int k =0;k<ds.Tables.Count;k++)
     {
      int row = ds.Tables[k].Rows.Count;
      int column = ds.Tables[k].Columns.Count;
    
      for(int i = 0;i<column;i++)
      {
       myExcel.Cells[totalCount+2,1+i] = ds.Tables[k].Columns[i].ColumnName;
      }
      for(int i = 0;i<row;i++)
      {
       for(int j =0;j<column;j++)
       {
        myExcel.Cells[totalCount+3+i,1+j] = "'" + ds.Tables[k].Rows[i][j].ToString();
       }
      }
      totalCount = totalCount + row +4;
     }
     try
     {
      //保存excel文件到指定的目录下,文件名用系统时间生成精确到毫秒
      myExcel.ActiveWorkbook._SaveAs(filename,Nothing,Nothing,Nothing,Nothing,Nothing,XlSaveAsAccessMode.xlExclusive,Nothing,Nothing,Nothing,Nothing);
     }
     catch
     {
      System.Windows.Forms.MessageBox.Show("系统找不到指定目录下的文件:  "+EXCELPATH+tempFileName+EXCELPOSTFIX);
      return;
     }
     //让生成的excel文件可见
     myExcel.Visible = true;
    }
    catch(Exception e)
    {
     System.Windows.Forms.MessageBox.Show("向excel文件中写入数据出错:  " + e.Message);
    }
   }
   else
   {
    System.Windows.Forms.MessageBox.Show("No Data");
   }
  }

  /// <summary>
  /// 把数据导入到.doc文件
  /// </summary>
  /// <param name="ds"></param>
  public void ExportToWord(DataSet ds)
  {
   if(ds.Tables.Count!=0)
   {   
    string tempFileName = null;
    object filename = null;
    
    object tableBehavior = Word.WdDefaultTableBehavior.wdWord9TableBehavior;
    object autoFitBehavior = Word.WdAutoFitBehavior.wdAutoFitFixed;
    object unit = Word.WdUnits.wdStory;
    object extend = System.Reflection.Missing.Value;
    object breakType = (int)Word.WdBreakType.wdSectionBreakNextPage;
    object count = 1;
    object character = Word.WdUnits.wdCharacter;
    object Nothing =  System.Reflection.Missing.Value;
    
    try
    {
     tempFileName = GetTempFileName();
     //生成.doc文件完整路径名
     filename = DATAWORDPATH+tempFileName+WORDPOSTFIX;
     
     //创建一个word文件,文件名用系统时间生成精确到毫秒
     Word.Application myWord= new Word.ApplicationClass();
     Word._Document myDoc = new Word.DocumentClass();
     myDoc = myWord.Documents.Add(ref Nothing,ref Nothing,ref Nothing,ref Nothing); 
     myDoc.Activate();
     //向把dataset中的表插入到word的文件中
    
     for(int totalTable = 0;totalTable<ds.Tables.Count;totalTable++)
     {
      myWord.Application.Selection.TypeText(ds.Tables[totalTable].TableName+"表的数据如下");
      myWord.Application.Selection.TypeParagraph();     
      myWord.Application.Selection.TypeParagraph();
      Word.Range para = myWord.Application.Selection.Range;
      myDoc.Tables.Add(para,ds.Tables[totalTable].Rows.Count+1,ds.Tables[totalTable].Columns.Count,ref tableBehavior,ref autoFitBehavior);
      for(int column = 0; column<ds.Tables[totalTable].Columns.Count;column++)
      {
       myDoc.Tables.Item(totalTable+1).Cell(1,column+1).Range.InsertBefore(ds.Tables[0].Columns[column].ColumnName.Trim());
      }    
      for(int row = 0;row<ds.Tables[totalTable].Rows.Count;row++)
      {
       for(int column = 0;column<ds.Tables[totalTable].Columns.Count;column++)
       {
        myDoc.Tables.Item(totalTable+1).Cell(row+2,column+1).Range.InsertBefore(ds.Tables[totalTable].Rows[row][column].ToString().Trim());
       }
      }
      myWord.Application.Selection.EndKey(ref unit,ref extend);
      myWord.Application.Selection.TypeParagraph();
      myWord.Application.Selection.TypeParagraph();
      myWord.Application.Selection.InsertBreak(ref breakType);    
     }
     myWord.Application.Selection.TypeBackspace();
     myWord.Application.Selection.Delete(ref character,ref count);
     myWord.Application.Selection.HomeKey(ref unit,ref extend);
    
     //保存word文件到指定的目录下
     try
     {
      myDoc.SaveAs(ref filename,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing);
      myWord.Visible = true;
     }
     catch
     {
      System.Windows.Forms.MessageBox.Show("系统找不到指定目录下的文件:  "+DATAWORDPATH+tempFileName+WORDPOSTFIX);
      return;
     }
     //让生成的excel文件可见
     myWord.Visible = true;
    }
    catch(Exception ex)
    {
     System.Windows.Forms.MessageBox.Show("向word文件中写入数据出错:  " + ex.Message);
    }
   }
   else
   {
    System.Windows.Forms.MessageBox.Show("No Data");
   }
  }
  /// <summary>
  /// 把图片文件导入到.doc文件
  /// </summary>
  /// <param name="bp"></param>
  public void ExportToWord(Bitmap bp)
  {
   string tempFileName = null;
   string bmpPath = null;
   object filename = null;
   object Nothing = null;
   tempFileName = GetTempFileName();
 
   //生成.bmp文件完整路径名
   bmpPath = IMAGEPATH+tempFileName+IMAGEPOSTFIX;
   //生成.doc文件完整路径名
   filename = IMAGEWORDPATH+tempFileName+WORDPOSTFIX;
   Nothing = System.Reflection.Missing.Value;
 
   //创建一个word文件,文件名用系统时间生成精确到毫秒
   Word.Application myWord= new Word.ApplicationClass();
   Word._Document myDoc = new Word.DocumentClass();
   myDoc = myWord.Documents.Add(ref Nothing,ref Nothing,ref Nothing,ref Nothing); 
   try
   {
    //把bitmap对象保存到系统所生成文件完整路径中
    bp.Save(bmpPath);
   }
   catch
   {
    System.Windows.Forms.MessageBox.Show("系统找不到指定目录下的文件:  "+bmpPath);
    return;
   }
  
   try
   {
    //往word文件中插入图片
    myDoc.InlineShapes.AddPicture(bmpPath,ref Nothing,ref Nothing,ref Nothing);
   }
   catch
   {
    System.Windows.Forms.MessageBox.Show("系统找不到指定目录下的文件:  "+bmpPath);
    return;
   }
  
   try
   {
    //保存word文件到指定的目录下
    myDoc.SaveAs(ref filename,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing);
   }
   catch
   {
    System.Windows.Forms.MessageBox.Show("系统找不到指定目录下的文件:  "+IMAGEWORDPATH+tempFileName+WORDPOSTFIX);
    return;
   }
   //让生成的word文件可见
   myWord.Visible = true;
  }

  /// <summary>
  /// 把数据文件导入到.txt文件
  /// </summary>
  /// <param name="ds"></param>
  public void ExportToTxt(DataSet ds)
  {
   if(ds.Tables.Count!=0)
   {
    string tempFileName = null;
    tempFileName = GetTempFileName();
  
    //创建一个.txt文件,文件名用系统时间生成精确到毫秒
    FileInfo file = new FileInfo(TXTPATH+tempFileName+TXTPOSTFIX);
    StreamWriter textFile = null;
    try
    {
     textFile = file.CreateText();
    }
    catch
    {
     System.Windows.Forms.MessageBox.Show("系统找不到指定目录下的文件:  "+TXTPATH+tempFileName+TXTPOSTFIX);
     return;
    }
    //把Dataset中的数据写入.txt文件中
    for(int totaltable = 0;totaltable<ds.Tables.Count;totaltable++)
    {
     //统计dataset中当前表的行数
     int row = ds.Tables[totaltable].Rows.Count;
     //统计dataset中当前表的列数
     int column = ds.Tables[totaltable].Columns.Count;
     //用于统计当前表中每列记录中字符数最长的字符串的长度之和
     int totalLength = 0;
     //用于统计标题的长度(dataset中的表名的length+"表的数据如下"的length)
     int titleLength = 0;
     //统计每列记录中字符数最长的字符串的长度
     int[] columnLength = new int[column];
     for(int i = 0;i<column;i++)
     {
      columnLength[i] = ds.Tables[totaltable].Columns[i].ColumnName.ToString().Length;
     }
     for(int i = 0;i<row;i++)
     {
      for(int j = 0;j<column;j++)
      {
       if(ds.Tables[totaltable].Rows[i][j].ToString().Length>columnLength[j])
       {
        columnLength[j]=ds.Tables[totaltable].Rows[i][j].ToString().Length;
       }
      }
     }

     //统计当前表中每列记录中字符数最长的字符串的长度之和
     for(int i = 0;i<column;i++)
     {
      totalLength = totalLength+columnLength[i]+DATADISTANCE;
     }
     totalLength = totalLength+2*TABDISTANCE-DATADISTANCE;
     //统计标题的长度(dataset中的当前表名的length+"表的数据如下"的length)
     titleLength = ds.Tables[totaltable].TableName.ToString().Length+"表的数据如下".Length*2;
     //把标题写入.txt文件中
     for(int i = 0;i<(int)((totalLength-titleLength)/2);i++)
     {
      textFile.Write(' ');
     }
     textFile.Write(ds.Tables[totaltable].TableName+"表的数据如下");
     textFile.WriteLine();
     for(int i = 0;i<totalLength;i++)
     {
      textFile.Write('*');
     }
     textFile.WriteLine();
     textFile.Write("\t");
     //把dataset中当前表的字段名写入.txt文件中
     for(int i = 0;i<column;i++)
     {
      textFile.Write(ds.Tables[totaltable].Columns[i].ColumnName.ToString());
      for(int k = 0;k<columnLength[i]-ds.Tables[totaltable].Columns[i].ColumnName.ToString().Length+DATADISTANCE;k++)
      {
       textFile.Write(' ');
      }
     }
     textFile.WriteLine();
     for(int i = 0;i<totalLength;i++)
     {
      textFile.Write('-');
     }
     textFile.WriteLine();
     textFile.Write("\t");
     //把dataset中当前表的数据写入.txt文件中
     for(int i = 0;i<row;i++)
     {
      for(int j = 0;j<column;j++)
      {
       textFile.Write(ds.Tables[totaltable].Rows[i][j].ToString());
       for(int k = 0;k<columnLength[j]-ds.Tables[totaltable].Rows[i][j].ToString().Length+DATADISTANCE;k++)
       {
        textFile.Write(' ');
       }
      }
      textFile.WriteLine();
      textFile.Write("\t");
     }
     textFile.WriteLine();
     for(int i = 0;i<totalLength;i++)
     {
      textFile.Write('-');
     }
     textFile.WriteLine();
     textFile.WriteLine();
     textFile.WriteLine();
    }
    //关闭当前的StreamWriter流
    textFile.Close();
    System.Windows.Forms.MessageBox.Show("数据文件已保存到"+"   "+file.FullName);                 
   }
   else
   {
    System.Windows.Forms.MessageBox.Show("No Data");
   }
  }
  public string GetTempFileName()
  {
   return DateTime.Now.ToString("yyyyMMddhhmmssfff");
  }
 }
}
补充:使用以上方法必须对dcom进行配置,给用户使用office的权限。 
具体配置方法如下: 
1:在服务器上安装office的Excel软件. 
2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务" 
3:依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置" 
4:在"DCOM配置"中找到"Microsoft Excel 应用程序",在它上面点击右键,然后点击"属性",弹出"Microsoft Excel 应用程序属性"对话框 
5:点击"标识"标签,选择"交互式用户" 
6:点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加一个"NETWORK SERVICE"用户(注意要选择本计算机名),并给它赋予"本地启动"和"本地激活"权限. 
7:依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出的"安全性"对话框中也填加一个"NETWORK SERVICE"用户,然后赋予"本地访问"权限. 
这样,我们便配置好了相应的Excel的DCOM权限. 
注意:我是在WIN2003上配置的,在2000上,是配置ASPNET用户
若不进行配置会出现错误 
检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。 
原因是用户没有使用Excel的权限。 
导出到word同样要配置使用word的权限。  
继续补充: 导出到txt我用了上面的方法有问题, 
try 

textFile = file.CreateText(); 

catch 

System.Windows.Forms.MessageBox.Show("系统找不到指定目录下的文件: "+TXTPATH+tempFileName+TXTPOSTFIX); 
return; 

总是在这里跳到catch里面。导出到word,excel都能用,继续研究txt的使用方法















本文转自terryli51CTO博客,原文链接: http://blog.51cto.com/terryli/519492,如需转载请自行联系原作者


相关文章
|
1月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
131 5
|
2月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
75 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
5月前
|
Web App开发 前端开发 安全
2024年新一代WebOffice内嵌网页组件,Web网页在线编辑Word/Excel/PPT
WebOffice控件面临兼容性、用户体验和维护难题。随着浏览器更新,依赖插件的技术不再适用,如Chrome不再支持NPAPI和PPAPI。产品普遍不支持多版本Office并存,定制能力弱,升级复杂。猿大师办公助手提供了解决方案,它兼容多种浏览器,包括最新版和国产浏览器,不依赖插件,支持文档对比,具有丰富的功能和接口,兼容多种Office版本,允许源码级定制,提供终身技术支持,并实现静默在线升级。适用于多种行业和操作系统。
324 11
|
4月前
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
301 0
|
5月前
|
关系型数据库 MySQL 数据库
navicat 查看,设计并导出数据库 ER图
navicat 查看,设计并导出数据库 ER图
902 5
|
4月前
|
SQL 关系型数据库 MySQL
如何在 MySQL 或 MariaDB 中导入和导出数据库
如何在 MySQL 或 MariaDB 中导入和导出数据库
624 0
|
4月前
|
JSON NoSQL MongoDB
在Ubuntu 14.04上如何导入和导出MongoDB数据库
在Ubuntu 14.04上如何导入和导出MongoDB数据库
29 0
|
4月前
|
安全 关系型数据库 MySQL
如何在 MySQL 中导入和导出数据库以及重置 root 密码
如何在 MySQL 中导入和导出数据库以及重置 root 密码
59 0
|
5月前
|
Cloud Native 关系型数据库 MySQL
云原生数据仓库使用问题之如何将ADB中的数据导出到自建的MySQL数据库
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
12天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
81 15
下一篇
DataWorks