Asp.Net下匯出/匯入規則的Excel(.xls)檔案

來源:互聯網
上載者:User
http://delia.org.ru/ArticleView/2005-9-6/Article_View_153237.Htm

/// <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;
   }
  }


/// <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;
  }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.