Asp.Net下导出/导入规则的Excel(.xls)文件

类别:Asp 点击:0 评论:0 推荐:

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

本文地址:http://com.8s8s.com/it/it8024.htm