分享
 
 
 

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

王朝asp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有