首页  :: 新随笔  :: 订阅 订阅  :: 管理

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

Posted on 2007-06-08 14:29  礼拜一  阅读(562)  评论(1编辑  收藏  举报
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的使用方法。