asp.net从数据库导出数据到word、excel、txt文本文件

来源:互联网 发布:网络连环夺宝技巧 编辑:程序博客网 时间:2024/05/16 06:50
 
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: olderdocdatadoc"
private const string IMAGEWORDPATH = @"C: olderdocimagedoc"
private const string IMAGEPATH = @"C: olderimage"
private const string EXCELPATH = @"C: olderexcel"
private const string TXTPATH = @"C: older xt"
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的使用方法。