WEB开发网
开发学院WEB开发ASP.NET 从数据库导出数据到word、excel、.txt 阅读

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

 2007-03-07 17:22:31 来源:WEB开发网   
核心提示:转自http://martinyang2010.bokee.com/2598999.htmlusing System;using System.Data;using System.Drawing;using System.Data.SqlClient;using Excel;using Word;using Syste

转自http://martinyang2010.bokee.com/2598999.html
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的使用方法。

Tags:数据库 导出 数据

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接