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