zoukankan      html  css  js  c++  java
  • 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;
       }

  • 相关阅读:
    024.Kubernetes掌握Pod-部署MongoDB
    023.Kubernetes掌握Pod-Pod扩容和缩容
    附010.Kubernetes永久存储之GlusterFS超融合部署
    附009.Kubernetes永久存储之GlusterFS独立部署
    022.Kubernetes掌握Pod-Pod升级和回滚
    021.Kubernetes掌握Pod-Pod调度策略
    020.Kubernetes掌握Pod-Pod基础使用
    018.Kubernetes二进制集群插件metrics-dashboard
    016.Kubernetes二进制集群插件coredns
    .NET Core 3.0之深入源码理解ObjectPool(二)
  • 原文地址:https://www.cnblogs.com/jcomet/p/1242781.html
Copyright © 2011-2022 走看看