c#&excel

 

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<1return 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<1return -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();
     }



 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值