zoukankan      html  css  js  c++  java
  • c# excel 示例2

    DataTable中的数据导出Excel文件
    /**//// <summary>
      /// 将DataTable中的数据导出到指定的Excel文件中
      /// </summary>
      /// <param name="page">Web页面对象</param>
      /// <param name="tab">包含被导出数据的DataTable对象</param>
      /// <param name="FileName">Excel文件的名称</param>
      public static void Export(System.Web.UI.Page page,System.Data.DataTable tab,string FileName)
      ...{
       System.Web.HttpResponse httpResponse = page.Response;
       System.Web.UI.WebControls.DataGrid dataGrid=new System.Web.UI.WebControls.DataGrid();
       dataGrid.DataSource=tab.DefaultView;
       dataGrid.AllowPaging = false;
       dataGrid.HeaderStyle.BackColor = System.Drawing.Color.Green;
       dataGrid.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
       dataGrid.HeaderStyle.Font.Bold = true;
       dataGrid.DataBind();
       httpResponse.AppendHeader("Content-Disposition","attachment;filename="+HttpUtility.UrlEncode(FileName,System.Text.Encoding.UTF8)); //filename="*.xls";
       httpResponse.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");
       httpResponse.ContentType ="application/ms-excel";
       System.IO.StringWriter  tw = new System.IO.StringWriter() ;
       System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter (tw);
       dataGrid.RenderControl(hw);
      
       string filePath = page.Server.MapPath("..")+"\Files\" +FileName;
       System.IO.StreamWriter sw = System.IO.File.CreateText(filePath);
       sw.Write(tw.ToString());
       sw.Close();
       DownFile(httpResponse,FileName,filePath);
     
       httpResponse.End();
      }
    private static bool DownFile(System.Web.HttpResponse Response,string fileName,string fullPath)
      ...{
       try
       ...{
        Response.ContentType = "application/octet-stream";
       
        Response.AppendHeader("Content-Disposition","attachment;filename=" +
         HttpUtility.UrlEncode(fileName,System.Text.Encoding.UTF8) + ";charset=GB2312");
        System.IO.FileStream fs= System.IO.File.OpenRead(fullPath);
        long fLen=fs.Length;
        int size=102400;//每100K同时下载数据
        byte[] readData = new byte[size];//指定缓冲区的大小
        if(size>fLen)size=Convert.ToInt32(fLen);
        long fPos=0;
        bool isEnd=false;
        while (!isEnd)
        ...{
         if((fPos+size)>fLen)
         ...{
          size=Convert.ToInt32(fLen-fPos);
          readData = new byte[size];
          isEnd=true;
         }
         fs.Read(readData, 0, size);//读入一个压缩块
         Response.BinaryWrite(readData);
         fPos+=size;
        }
        fs.Close();
        System.IO.File.Delete(fullPath);
        return true;
       }
       catch
       ...{
        return false;
       }
      }
    将指定Excel文件中的数据转换成DataTable
    /**//// <summary>
      /// 将指定Excel文件中的数据转换成DataTable对象,供应用程序进一步处理
      /// </summary>
      /// <param name="filePath"></param>
      /// <returns></returns>
      public static System.Data.DataTable Import(string filePath)
      ...{
       System.Data.DataTable rs = new System.Data.DataTable();
       bool canOpen=false;
      
       OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"+
        "Data Source=" + filePath + ";" +
        "Extended Properties="Excel 8.0;"");
       
       try//尝试数据连接是否可用
       ...{
        conn.Open();
        conn.Close();
        canOpen=true;
       }
       catch...{}

       if(canOpen)
       ...{
        try//如果数据连接可以打开则尝试读入数据
        ...{
         OleDbCommand myOleDbCommand = new OleDbCommand("SELECT * FROM [Sheet1$]",conn);
         OleDbDataAdapter myData = new OleDbDataAdapter(myOleDbCommand);
         myData.Fill(rs);
         conn.Close();
        }
        catch//如果数据连接可以打开但是读入数据失败,则从文件中提取出工作表的名称,再读入数据
        ...{
         string sheetName=GetSheetName(filePath);
         if(sheetName.Length>0)
         ...{
          OleDbCommand myOleDbCommand = new OleDbCommand("SELECT * FROM ["+sheetName+"$]",conn);
          OleDbDataAdapter myData = new OleDbDataAdapter(myOleDbCommand);
          myData.Fill(rs);
          conn.Close();
         }
        }
       }
       else
       ...{
        System.IO.StreamReader tmpStream=File.OpenText(filePath);
        string tmpStr=tmpStream.ReadToEnd();
        tmpStream.Close();
        rs=GetDataTableFromString(tmpStr);
        tmpStr="";
       }
       return rs;
      }
    /**//// <summary>
      /// 将指定Html字符串的数据转换成DataTable对象 --根据“<tr><td>”等特殊字符进行处理
      /// </summary>
      /// <param name="tmpHtml">Html字符串</param>
      /// <returns></returns>
      private static DataTable GetDataTableFromString(string tmpHtml)
      ...{
       string tmpStr=tmpHtml;
       DataTable TB=new DataTable();
       //先处理一下这个字符串,删除第一个<tr>之前合最后一个</tr>之后的部分
       int index=tmpStr.IndexOf("<tr");
       if(index>-1)
        tmpStr=tmpStr.Substring(index);
       else
        return TB;

       index=tmpStr.LastIndexOf("</tr>");
       if(index>-1)
        tmpStr=tmpStr.Substring(0,index+5);
       else
        return TB;

       bool existsSparator=false;
       char Separator=Convert.ToChar("^");

       //如果原字符串中包含分隔符“^”则先把它替换掉
       if(tmpStr.IndexOf(Separator.ToString())>-1)
       ...{
        existsSparator=true;
        tmpStr=tmpStr.Replace("^","^$&^");
       }

       //先根据“</tr>”分拆
       string[] tmpRow=tmpStr.Replace("</tr>","^").Split(Separator);

       for(int i=0;i<tmpRow.Length-1;i++)
       ...{
        DataRow newRow=TB.NewRow();

        string tmpStrI=tmpRow[i];
        if(tmpStrI.IndexOf("<tr")>-1)
        ...{
         tmpStrI=tmpStrI.Substring(tmpStrI.IndexOf("<tr"));
         if(tmpStrI.IndexOf("display:none")<0||tmpStrI.IndexOf("display:none")>tmpStrI.IndexOf(">"))
         ...{
          tmpStrI=tmpStrI.Replace("</td>","^");
          string[] tmpField=tmpStrI.Split(Separator);
       
          for(int j=0;j<tmpField.Length-1;j++)
          ...{
           tmpField[j]=RemoveString(tmpField[j],"<font>");
           index=tmpField[j].LastIndexOf(">")+1;
           if(index>0)
           ...{
            string field=tmpField[j].Substring(index,tmpField[j].Length-index);
            if(existsSparator) field=field.Replace("^$&^","^");
            if(i==0)
            ...{
             string tmpFieldName=field;
             int sn=1;
             while(TB.Columns.Contains(tmpFieldName))
             ...{
              tmpFieldName=field+sn.ToString();
              sn+=1;
             }
             TB.Columns.Add(tmpFieldName);
            }
            else
            ...{
             newRow[j]=field;
            }
           }//end of if(index>0)
          }

          if(i>0)
           TB.Rows.Add(newRow);
         }
        }
       }

       TB.AcceptChanges();
       return TB;
      }

      /**//// <summary>
      /// 从指定Html字符串中剔除指定的对象
      /// </summary>
      /// <param name="tmpHtml">Html字符串</param>
      /// <param name="remove">需要剔除的对象--例如输入"<font>"则剔除"<font ???????>"和"</font>>"</param>
      /// <returns></returns>
      public static string RemoveString(string tmpHtml,string remove)
      ...{
       tmpHtml=tmpHtml.Replace(remove.Replace("<","</"),"");
       tmpHtml=RemoveStringHead(tmpHtml,remove);
       return tmpHtml;
      }
      /**//// <summary>
      /// 只供方法RemoveString()使用
      /// </summary>
      /// <returns></returns>
      private static string RemoveStringHead(string tmpHtml,string remove)
      ...{
       //为了方便注释,假设输入参数remove="<font>"
       if(remove.Length<1) return tmpHtml;//参数remove为空:不处理返回
       if((remove.Substring(0,1)!="<")||(remove.Substring(remove.Length-1)!=">")) return tmpHtml;//参数remove不是<?????>:不处理返回

       int IndexS=tmpHtml.IndexOf(remove.Replace(">",""));//查找“<font”的位置
       int IndexE=-1;
       if(IndexS>-1)
       ...{
        string tmpRight=tmpHtml.Substring(IndexS,tmpHtml.Length-IndexS);
        IndexE=tmpRight.IndexOf(">");
        if(IndexE>-1)
         tmpHtml=tmpHtml.Substring(0,IndexS)+tmpHtml.Substring(IndexS+IndexE+1);
        if(tmpHtml.IndexOf(remove.Replace(">",""))>-1)
         tmpHtml=RemoveStringHead(tmpHtml,remove);
       }
       return tmpHtml;
      }

      /**//// <summary>
      /// 将指定Excel文件中读取第一张工作表的名称
      /// </summary>
      /// <param name="filePath"></param>
      /// <returns></returns>
      private static string GetSheetName(string filePath)
      ...{
       string sheetName="";

       System.IO.FileStream tmpStream=File.OpenRead(filePath);
       byte[] fileByte=new byte[tmpStream.Length];
       tmpStream.Read(fileByte,0,fileByte.Length);
       tmpStream.Close();
      
       byte[] tmpByte=new byte[]...{Convert.ToByte(11),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),
               Convert.ToByte(11),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),
               Convert.ToByte(30),Convert.ToByte(16),Convert.ToByte(0),Convert.ToByte(0)};
      
       int index=GetSheetIndex(fileByte,tmpByte);
       if(index>-1)
       ...{

        index+=16+12;
        System.Collections.ArrayList sheetNameList=new System.Collections.ArrayList();
       
        for(int i=index;i<fileByte.Length-1;i++)
        ...{
         byte temp=fileByte[i];
         if(temp!=Convert.ToByte(0))
          sheetNameList.Add(temp);
         else
          break;
        }
        byte[] sheetNameByte=new byte[sheetNameList.Count];
        for(int i=0;i<sheetNameList.Count;i++)
         sheetNameByte[i]=Convert.ToByte(sheetNameList[i]);
      
        sheetName=System.Text.Encoding.Default.GetString(sheetNameByte);
       }
       return sheetName;
      }
      /**//// <summary>
      /// 只供方法GetSheetName()使用
      /// </summary>
      /// <returns></returns>
      private static int GetSheetIndex(byte[] FindTarget,byte[] FindItem)
      ...{
       int index=-1;

       int FindItemLength=FindItem.Length;
       if(FindItemLength<1) return -1;
       int FindTargetLength=FindTarget.Length;
       if((FindTargetLength-1)<FindItemLength) return -1;

       for(int i=FindTargetLength-FindItemLength-1;i>-1;i--)
       ...{
        System.Collections.ArrayList tmpList=new System.Collections.ArrayList();
        int find=0;
        for(int j=0;j<FindItemLength;j++)
        ...{
         if(FindTarget[i+j]==FindItem[j]) find+=1;
        }
        if(find==FindItemLength)
        ...{
         index=i;
         break;
        }
       }
       return index;
      }

    public static void ExportDataSetToExcel(Page page,DataSet ds)
            ...{
                DataTable dt=ds.Tables[0];
                System.IO.StringWriter sw=new System.IO.StringWriter();          

                sw.WriteLine(dt.TableName + " " + dt.ExtendedProperties["count_message"].ToString());
                sw.WriteLine();
                string strLine=string.Empty;
                foreach(DataColumn col in dt.Columns)
                ...{
                    strLine += " " + col.ColumnName;
                }
                strLine = strLine.Substring(1);
                sw.WriteLine(strLine);
                foreach(DataRow dr in dt.Rows)
                ...{
                    strLine = string.Empty;
                    foreach(object x in dr.ItemArray)
                    ...{
                        strLine += " " + x.ToString();
                    }
                    strLine = strLine.Substring(1);
                    sw.WriteLine(strLine);

                }
                sw.Close();
                page.Response.AddHeader("Content-Disposition", "attachment; filename=" + DateTime.Now.ToString("ddhhmmss") + ".xls");
                page.Response.ContentType = "application/ms-excel";
                page.Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");
                page.Response.Write(sw);
                page.Response.End();
         }


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wjb0016/archive/2006/10/30/1356817.aspx

    作者:wpf之家
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    SecureCRT的设置和美化
    strtod-strtod, 字符串 转 数字 函数
    Debug : array type has incomplete element type
    Linux上Core Dump文件的形成和分析
    centos7,进程最大打开文件数 too many open files错误
    不使用临时变量交换两个值
    C语言的设计理念
    K&R C vs ANSI C(数据类型提升)
    再也不怕C语言的声明了
    K&R C vs ANSI C(数据类型转换)
  • 原文地址:https://www.cnblogs.com/wpf123/p/2347396.html
Copyright © 2011-2022 走看看