zoukankan      html  css  js  c++  java
  • 从数据库导出数据到word、excel、.txt

    原创说明内容如下:
    在VS环境下选择Office组件时要在引用的Com元件中选择,不能选择.Net元件中的Office组件。
    以上说明为重点,VS2008在.Net元件组中也有Office组件部分的内容,那样的话就只能在开发环境下使用了。

    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的使用方法


    文章出处:http://www.diybl.com/course/4_webprogram/asp.net/netjs/2008223/100593_2.html

  • 相关阅读:
    如何构建积木式Web应用
    ASP.NET 2.0 异步页面原理浅析 [1] [原]
    HybridDictionary 类
    datagrid自定义
    认识.NET的集合
    织梦 10060
    java.io.FileNotFoundException: E:\temp (拒绝访问。)
    引用与对象实例化
    C#中为DataGrid添加下拉列表框
    C#中使用指针
  • 原文地址:https://www.cnblogs.com/jacker1979/p/1526865.html
Copyright © 2011-2022 走看看