DataTable中的数据导出Excel文件
/**////<summary>
///将DataTable中的数据导出到指定的Excel文件中
///</summary>
///<paramname="page">Web页面对象</param>
///<paramname="tab">包含被导出数据的DataTable对象</param>
///<paramname="FileName">Excel文件的名称</param>
publicstaticvoidExport(System.Web.UI.Pagepage,System.Data.DataTabletab,stringFileName)
{
System.Web.HttpResponsehttpResponse=page.Response;
System.Web.UI.WebControls.DataGriddataGrid=newSystem.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.StringWritertw=newSystem.IO.StringWriter();
System.Web.UI.HtmlTextWriterhw=newSystem.Web.UI.HtmlTextWriter(tw);
dataGrid.RenderControl(hw);
stringfilePath=page.Server.MapPath("..")+"\\Files\\"+FileName;
System.IO.StreamWritersw=System.IO.File.CreateText(filePath);
sw.Write(tw.ToString());
sw.Close();
DownFile(httpResponse,FileName,filePath);
httpResponse.End();
}
privatestaticboolDownFile(System.Web.HttpResponseResponse,stringfileName,stringfullPath)
{
try
{
Response.ContentType="application/octet-stream";
Response.AppendHeader("Content-Disposition","attachment;filename="+
HttpUtility.UrlEncode(fileName,System.Text.Encoding.UTF8)+";charset=GB2312");
System.IO.FileStreamfs=System.IO.File.OpenRead(fullPath);
longfLen=fs.Length;
intsize=102400;//每100K同时下载数据
byte[]readData=newbyte[size];//指定缓冲区的大小
if(size>fLen)size=Convert.ToInt32(fLen);
longfPos=0;
boolisEnd=false;
while(!isEnd)
{
if((fPos+size)>fLen)
{
size=Convert.ToInt32(fLen-fPos);
readData=newbyte[size];
isEnd=true;
}
fs.Read(readData,0,size);//读入一个压缩块
Response.BinaryWrite(readData);
fPos+=size;
}
fs.Close();
System.IO.File.Delete(fullPath);
returntrue;
}
catch
{
returnfalse;
}
}
将指定Excel文件中的数据转换成DataTable
/**////<summary>
///将指定Excel文件中的数据转换成DataTable对象,供应用程序进一步处理
///</summary>
///<paramname="filePath"></param>
///<returns></returns>
publicstaticSystem.Data.DataTableImport(stringfilePath)
{
System.Data.DataTablers=newSystem.Data.DataTable();
boolcanOpen=false;
OleDbConnectionconn=newOleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"+
"DataSource="+filePath+";"+
"ExtendedProperties=\"Excel8.0;\"");
try//尝试数据连接是否可用
{
conn.Open();
conn.Close();
canOpen=true;
}
catch{}
if(canOpen)
{
try//如果数据连接可以打开则尝试读入数据
{
OleDbCommandmyOleDbCommand=newOleDbCommand("SELECT*FROM[Sheet1$]",conn);
OleDbDataAdaptermyData=newOleDbDataAdapter(myOleDbCommand);
myData.Fill(rs);
conn.Close();
}
catch//如果数据连接可以打开但是读入数据失败,则从文件中提取出工作表的名称,再读入数据
{
stringsheetName=GetSheetName(filePath);
if(sheetName.Length>0)
{
OleDbCommandmyOleDbCommand=newOleDbCommand("SELECT*FROM["+sheetName+"$]",conn);
OleDbDataAdaptermyData=newOleDbDataAdapter(myOleDbCommand);
myData.Fill(rs);
conn.Close();
}
}
}
else
{
System.IO.StreamReadertmpStream=File.OpenText(filePath);
stringtmpStr=tmpStream.ReadToEnd();
tmpStream.Close();
rs=GetDataTableFromString(tmpStr);
tmpStr="";
}
returnrs;
}
/**////<summary>
///将指定Html字符串的数据转换成DataTable对象--根据“<tr><td>”等特殊字符进行处理
///</summary>
///<paramname="tmpHtml">Html字符串</param>
///<returns></returns>
privatestaticDataTableGetDataTableFromString(stringtmpHtml)
{
stringtmpStr=tmpHtml;
DataTableTB=newDataTable();
//先处理一下这个字符串,删除第一个<tr>之前合最后一个</tr>之后的部分
intindex=tmpStr.IndexOf("<tr");
if(index>-1)
tmpStr=tmpStr.Substring(index);
else
returnTB;
index=tmpStr.LastIndexOf("</tr>");
if(index>-1)
tmpStr=tmpStr.Substring(0,index+5);
else
returnTB;
boolexistsSparator=false;
charSeparator=Convert.ToChar("^");
//如果原字符串中包含分隔符“^”则先把它替换掉
if(tmpStr.IndexOf(Separator.ToString())>-1)
{
existsSparator=true;
tmpStr=tmpStr.Replace("^","^$&^");
}
//先根据“</tr>”分拆
string[]tmpRow=tmpStr.Replace("</tr>","^").Split(Separator);
for(inti=0;i<tmpRow.Length-1;i++)
{
DataRownewRow=TB.NewRow();
stringtmpStrI=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(intj=0;j<tmpField.Length-1;j++)
{
tmpField[j]=RemoveString(tmpField[j],"<font>");
index=tmpField[j].LastIndexOf(">")+1;
if(index>0)
{
stringfield=tmpField[j].Substring(index,tmpField[j].Length-index);
if(existsSparator)field=field.Replace("^$&^","^");
if(i==0)
{
stringtmpFieldName=field;
intsn=1;
while(TB.Columns.Contains(tmpFieldName))
{
tmpFieldName=field+sn.ToString();
sn+=1;
}
TB.Columns.Add(tmpFieldName);
}
else
{
newRow[j]=field;
}
}//endofif(index>0)
}
if(i>0)
TB.Rows.Add(newRow);
}
}
}
TB.AcceptChanges();
returnTB;
}
/**////<summary>
///从指定Html字符串中剔除指定的对象
///</summary>
///<paramname="tmpHtml">Html字符串</param>
///<paramname="remove">需要剔除的对象--例如输入"<font>"则剔除"<font???????>"和"</font>>"</param>
///<returns></returns>
publicstaticstringRemoveString(stringtmpHtml,stringremove)
{
tmpHtml=tmpHtml.Replace(remove.Replace("<","</"),"");
tmpHtml=RemoveStringHead(tmpHtml,remove);
returntmpHtml;
}
/**////<summary>
///只供方法RemoveString()使用
///</summary>
///<returns></returns>
privatestaticstringRemoveStringHead(stringtmpHtml,stringremove)
{
//为了方便注释,假设输入参数remove="<font>"
if(remove.Length<1)returntmpHtml;//参数remove为空:不处理返回
if((remove.Substring(0,1)!="<")||(remove.Substring(remove.Length-1)!=">"))returntmpHtml;//参数remove不是<?????>:不处理返回
intIndexS=tmpHtml.IndexOf(remove.Replace(">",""));//查找“<font”的位置
intIndexE=-1;
if(IndexS>-1)
{
stringtmpRight=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);
}
returntmpHtml;
}
/**////<summary>
///将指定Excel文件中读取第一张工作表的名称
///</summary>
///<paramname="filePath"></param>
///<returns></returns>
privatestaticstringGetSheetName(stringfilePath)
{
stringsheetName="";
System.IO.FileStreamtmpStream=File.OpenRead(filePath);
byte[]fileByte=newbyte[tmpStream.Length];
tmpStream.Read(fileByte,0,fileByte.Length);
tmpStream.Close();
byte[]tmpByte=newbyte[]{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)};
intindex=GetSheetIndex(fileByte,tmpByte);
if(index>-1)
{
index+=16+12;
System.Collections.ArrayListsheetNameList=newSystem.Collections.ArrayList();
for(inti=index;i<fileByte.Length-1;i++)
{
bytetemp=fileByte[i];
if(temp!=Convert.ToByte(0))
sheetNameList.Add(temp);
else
break;
}
byte[]sheetNameByte=newbyte[sheetNameList.Count];
for(inti=0;i<sheetNameList.Count;i++)
sheetNameByte[i]=Convert.ToByte(sheetNameList[i]);
sheetName=System.Text.Encoding.Default.GetString(sheetNameByte);
}
returnsheetName;
}
/**////<summary>
///只供方法GetSheetName()使用
///</summary>
///<returns></returns>
privatestaticintGetSheetIndex(byte[]FindTarget,byte[]FindItem)
{
intindex=-1;
intFindItemLength=FindItem.Length;
if(FindItemLength<1)return-1;
intFindTargetLength=FindTarget.Length;
if((FindTargetLength-1)<FindItemLength)return-1;
for(inti=FindTargetLength-FindItemLength-1;i>-1;i--)
{
System.Collections.ArrayListtmpList=newSystem.Collections.ArrayList();
intfind=0;
for(intj=0;j<FindItemLength;j++)
{
if(FindTarget[i+j]==FindItem[j])find+=1;
}
if(find==FindItemLength)
{
index=i;
break;
}
}
returnindex;
}