愤怒的大鸟 发表于 2015-1-16 22:19:41

ASP.NET网页设计ASP.NET操纵EXCEL的总结篇

我见过java运行在手机上,包括很廉价的山寨手机,但是却暂时没发现.net在手机上有什么作为。wp7可能是个转机,但是按照《Java的跨平台就是一句谎言。那.net的跨平台也当之无愧是一句谎言。公元19XX年前,关于EXCEL的操纵就如滚滚江水,绵延不停,真正操纵EXCEL我也是从客岁下半年入手下手的,有些对照庞大的年度报表之类的,做起来也有点吃力,不外仍是都能画出来了,关于EXCEL的报表导出,思索到导出耗时的成绩我次要接纳AJAX来做的,分离捕获几个起止形态,给客户端提醒3个形态:正在检索数据。。。---》筹办导出数据。。。(只是从数据库乐成掏出,还没有读写excel文件)--》正在读写文件--》导出数据乐成,固然假如哪一历程堕落,都有对应的提醒,只以是想到写这篇文章,次要是由于往年有个体系的部分EXCEL的操纵也让我做,特地分离之前操纵EXCEL的履历作一下总结,大概也算不上甚么,关于尽年夜多半来讲也没甚么手艺含量,网上一搜一年夜把,但我想仍是有需要总结一下,最少能给园子里的老手些许匡助,OK,Let"sGo...

一.程序操纵EXCEL的使用次要仍是在统计报表方面,您大概会思索读EXCEL模板,也大概会思索没需要读模板,实在读不读模板都能到达一样的效果,看实践情形而用了。
1.读模板的话,起首模板寄存在某个路径下,依据模板把从数据库里掏出的数据写回EXCEL然后天生一个新的EXCEL寄存都另外一个路径以供下载,模板稳定。
我这里的EXCEL操纵次要是在VS2005里的,VS2003也能够的,不外没怎样研讨03里的操纵(文章最初我会把05的示例下载地点贴上谁人demo里之前打包忘了放了一个天生数据的文件,刚放出来了,不加也是能够运转的,另有模板文件的数据略微过滤了下从头放了部分对比看下)vs05中操纵EXCEL间接援用.NET自带的COM组件,增加后项目标bin目次下会主动呈现

Interop.Excel.dll这个DLL(需安装office2003excel,上面的申明及示例都是基于office2003的,版本分歧挪用大概会纷歧样)
页面的定名空间援用usingExcel;
上面是挪用模板的一段代码
复制代码代码以下:
#region利用模板导出Excel表
case"ReportByTemp":
{

DataViewdv=Cache["ReportByTemp"]asDataView;
//创建一个Excel.Application的新历程
Excel.Applicationapp=newExcel.Application();
if(app==null)
{
return;
}
app.Visible=false;
app.UserControl=true;
Workbooksworkbooks=app.Workbooks;
_Workbookworkbook=workbooks.Add(template_path+"EXCEL测试模板.xls");//这里的Add办法里的参数就是模板的路径
Sheetssheets=workbook.Worksheets;
_Worksheetworksheet=(_Worksheet)sheets.get_Item(1);//模板只要一个sheet表
if(worksheet==null)
{
return;
}

introwNum=0;
for(inti=0;i<dv.Count;i++)
{
rowNum=i+1;
worksheet.Cells=rowNum;
worksheet.Cells=dv.Row.ToString();
worksheet.Cells=dv.Row.ToString();

excelOperate.SetBold(worksheet,worksheet.Cells,worksheet.Cells);//黑体
excelOperate.SetHAlignCenter(worksheet,worksheet.Cells,worksheet.Cells);//居中
worksheet.get_Range(worksheet.Cells,worksheet.Cells).Borders.Color=System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);

}

tick=DateTime.Now.Ticks.ToString();
save_path=temp_path+""+tick+".xls";
workbook.SaveAs(save_path,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Excel.XlSaveAsAccessMode.xlNoChange,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
excelOperate.Dispose(worksheet,workbook,app);//封闭Excel历程

}
break;
#endregion

效果以下:


2.不读模板的话,挪用的时分实在会承继一个空缺模板,然后写进数据,程序画表头,终极到达一样的效果,程序以下:
复制代码代码以下:
#region不利用模板天生Excel表
case"ReportByNone":
{

DataViewdv=Cache["ReportByNone"]asDataView;
//创建一个Excel.Application的新历程
Excel.Applicationapp=newExcel.Application();
if(app==null)
{
return;
}
app.Visible=false;
app.UserControl=true;
Workbooksworkbooks=app.Workbooks;
_Workbookworkbook=workbooks.Add(XlWBATemplate.xlWBATWorksheet);//这里的Add办法里的参数就相称于承继了一个空模板(暂如许了解吧)
Sheetssheets=workbook.Worksheets;
_Worksheetworksheet=(_Worksheet)sheets.get_Item(1);
if(worksheet==null)
{
return;
}

worksheet.get_Range(worksheet.Cells,worksheet.Cells).Merge(Missing.Value);//横向兼并
worksheet.get_Range(worksheet.Cells,worksheet.Cells).Value2="导出EXCEL测试一";
excelOperate.SetBold(worksheet,worksheet.Cells,worksheet.Cells);//黑体
excelOperate.SetHAlignCenter(worksheet,worksheet.Cells,worksheet.Cells);//居中
excelOperate.SetBgColor(worksheet,worksheet.Cells,worksheet.Cells,System.Drawing.Color.Red);//背景致
excelOperate.SetFontSize(worksheet,worksheet.Cells,worksheet.Cells,16);//字体巨细
excelOperate.SetRowHeight(worksheet,worksheet.Cells,worksheet.Cells,32.25);//行高
worksheet.get_Range(worksheet.Cells,worksheet.Cells).Borders.Color=System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//玄色一连边框

worksheet.Cells="序号";
worksheet.Cells="公司";
worksheet.Cells="部门";
excelOperate.SetBold(worksheet,worksheet.Cells,worksheet.Cells);//黑体
worksheet.get_Range(worksheet.Cells,worksheet.Cells).Borders.Color=System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);
excelOperate.SetHAlignRight(worksheet,worksheet.Cells,worksheet.Cells);
excelOperate.SetBgColor(worksheet,worksheet.Cells,worksheet.Cells,System.Drawing.Color.Silver);//背景致
introwNum=0;
for(inti=0;i<dv.Count;i++)
{
rowNum=i+1;
worksheet.Cells=rowNum;
worksheet.Cells=dv.Row.ToString();
worksheet.Cells=dv.Row.ToString();

excelOperate.SetBold(worksheet,worksheet.Cells,worksheet.Cells);//黑体
excelOperate.SetHAlignCenter(worksheet,worksheet.Cells,worksheet.Cells);//居中
worksheet.get_Range(worksheet.Cells,worksheet.Cells).Borders.Color=System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);//设置边框色彩,否则打印预览,会十分不雅

}
excelOperate.SetColumnWidth(worksheet,"A",10);
excelOperate.SetColumnWidth(worksheet,"B",20);
excelOperate.SetColumnWidth(worksheet,"C",20);
worksheet.Name="导出EXCEL测试一";

tick=DateTime.Now.Ticks.ToString();
save_path=temp_path+""+tick+".xls";
workbook.SaveAs(save_path,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Excel.XlSaveAsAccessMode.xlNoChange,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
excelOperate.Dispose(worksheet,workbook,app);//封闭Excel历程

}
break;

#endregion

效果以下:


以上我给了两个最复杂的操纵申明,上面具体说一下关于一些略微庞大的报表的天生处置

二.关于庞大的EXCEL报表的天生处置,不过是纵向兼并不异的数据行及嵌套纵向兼并等一些操纵,上面就几个具有针对性的报表作下申明.
1.要天生绝对庞大的EXCEL表,在从数据库取数据时,要注重先依照公道的请求排好序,偶然候大概orderby前面要跟好几个字段,并且这几个字段谁先谁后也要注重,由于这些会间接影响报表出现的效果,好比你的EXCEL表要按月份统计国际外的项目,显现出来的时分要多个项目不异的人一连,那末排序便可能要如许orderby月份,项目种别,用户ID,项目ID(这是写好的视图,基于视图来检索的),这个排序的字段按次就不克不及变了,变了的话就不太好天生想要的情势了,以下图:

这个也是静态画的,用了个复杂的模板,模板就一个表头,没多粗心义,除非表头很庞大并且在列表中不必要重画,思索模板就对照好,向下面谁人一月份国际的和别的月份的都是必要重画表头的。至于兼并,假如不是嵌套的兼并,我们能够在向模板轮回写数据的时分间接把持,好比上面一个复杂的写法:
复制代码代码以下:
for(i=0;i<table.Rows.Count;i++)
{
bidName=table.Rows["BIDNAME"].ToString();
if(table.Rows["BIDNAME"].ToString()==bidName)
{
projNum++;
worksheet.Cells=table.Rows["PROJNO"];
worksheet.Cells=table.Rows["PROJNAME"];
worksheet.Cells=table.Rows["STAT_DATE"];
worksheet.Cells=table.Rows["PROJTYPE"];
worksheet.Cells=table.Rows["CONTENT"];
worksheet.Cells=table.Rows["OPENDT"];
worksheet.Cells=table.Rows["OPENADDRESS"];
worksheet.Cells=table.Rows["REV_DATE"];
worksheet.Cells=table.Rows["BID_UNIT"];
worksheet.Cells=table.Rows["AGT_AMOUNT"];
worksheet.Cells=table.Rows["CURRENCY"]+":"+table.Rows["BIDSER_AMOUNT"];
worksheet.Cells=table.Rows["SENDDATE"];
worksheet.Cells=table.Rows["CURRENCY"]+":"+table.Rows["BIDPRICE"];
worksheet.Cells=table.Rows["BOOKAMOUNT"];
worksheet.Cells=table.Rows["CURRENCY"]+":"+table.Rows["BAIL_AMOUNT"];
worksheet.Cells=table.Rows["USERNAME"];
worksheet.Cells=table.Rows["SECOND_USER"];
worksheet.Cells="";
worksheet.get_Range(worksheet.Cells,worksheet.Cells).Borders.Color=System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);
continue;
}

worksheet.get_Range(worksheet.Cells,worksheet.Cells).Merge(Missing.Value);//将第一列按招标单元兼并
worksheet.get_Range(worksheet.Cells,worksheet.Cells).Value2=bidName+"("+projNum.ToString()+"个项目)";//兼并后的单位格内容

兼并单位格的时分也要注重一个成绩,就是兼并的单位格必需是为空的,否则在实行兼并时,会提醒“兼并后的单位格的值将丧失”,详细不如许提醒的,大抵是这个意义,一样平常我们兼并都单位格不异的内容,在兼并前我们先保留谁人值,再清空后兼并,下面的代码中把worksheet.Cell这里系列的单位格的值空出来了,没写数据,并且最初兼并了再写值,制止了往轮回清空。
2.嵌套的兼并向下面那样做大概把持对照贫苦,并且思绪大概很凌乱,我们能够思索先轮回添补一切的数据,在轮回出来要兼并的列,好比像上面的这张表

先轮回添补数据,以下:
复制代码代码以下:
intindex=0,rownum=0;
stringProjNo="";
for(i=0;i<table.Rows.Count;i++)
{
ProjNo=table.Rows["PROJNO"].ToString();
if(table.Rows["PROJNO"].ToString()==ProjNo)
{
wksheet.Cells=rownum+1;
wksheet.Cells="""+table.Rows["PROJNO"];//加上单引号包管以0开首的字符原样输入
wksheet.Cells="""+table.Rows["PROJNAME"];
wksheet.Cells="""+table.Rows["PA_NAME"];
wksheet.Cells="""+table.Rows["BIDER_NAME"];
wksheet.Cells=table.Rows["BAIL_AMOUNT"];
wksheet.Cells=table.Rows["NOT_BACK"];
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Borders.Color=System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);
continue;
}
index=i;
rownum++;
i--;
}

上面兼并前三列不异内容的单位:
复制代码代码以下:
//兼并前三列操纵
intm=1,rowid=3,k;
stringprojName="";
for(k=3;k<=i+2;k++)
{
if(Convert.ToInt32(wksheet.get_Range(wksheet.Cells,wksheet.Cells).Value2)==m)
{
ProjNo=wksheet.get_Range(wksheet.Cells,wksheet.Cells).Value2.ToString();
projName=wksheet.get_Range(wksheet.Cells,wksheet.Cells).Value2.ToString();
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Value2="";
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Value2="";
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Value2="";
continue;
}
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Merge(Missing.Value);
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Value2=m;
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Merge(Missing.Value);
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Value2="""+ProjNo;
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Merge(Missing.Value);
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Value2="""+projName;
m++;
rowid=k;
k--;
}
//跳出轮回后兼并最初一个投标项目
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Merge(Missing.Value);
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Value2=m;
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Merge(Missing.Value);
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Value2="""+ProjNo;
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Merge(Missing.Value);
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Value2="""+projName;

上面兼并标段列
复制代码代码以下:
//兼并标段列
index=0;rowid=3;//重置变量
stringpa_name=string.Empty;//标段称号
for(k=3;k<=i+2;k++)
{
pa_name=table.Rows["PA_NAME"].ToString();
if(wksheet.get_Range(wksheet.Cells,wksheet.Cells).Value2.ToString()==pa_name)
{
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Value2="";
continue;
}
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Merge(Missing.Value);
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Value2="""+pa_name;
index=k-3;
rowid=k;
k--;
}
//加入轮回时兼并最初一个项目标标段
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Merge(Missing.Value);
wksheet.get_Range(wksheet.Cells,wksheet.Cells).Value2="""+pa_name;
tick=DateTime.Now.ToString("yyyyMMddhhmmss");
save_path=temp_path+""+tick+"包管金收退情形表.xls";
Session["BailBackID"]=tick+"包管金收退情形表.xls";
Session["_BailBack"]="true";
workbook.SaveAs(save_path,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Excel.XlSaveAsAccessMode.xlNoChange,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
excelOperate.Dispose(worksheet,workbook,app);//封闭Excel历程
//DownLoad(save_path);
//Page_Close();

固然,下面的操纵中会举行好几回轮回,在功能方面不太可取,园子里的兄弟大概会有更好的办法,小弟不惜见教了
上面我们看下几个最终效果:





(注重:这里提醒的导出数据是指从数据库乐成掏出数据,还没有操纵EXCEL工具,刚入手下手已说过了,固然这个提醒笔墨换成别的的也能够)




全部历程接纳AJAX提醒的,一来不革新,二来导出工夫对照长的话,能够给客户一个优秀的体验效果,否可,用户一点导出按钮,半天没反响也没提醒,客户就以为怎样这么慢的,是否是你们程序有成绩,求全谴责一年夜堆,有了这么些交互提醒信息,让客户多等几分钟也能接受。

3.天生的表格包括多个sheet的操纵,好比上面一种情形


绘制这张表的请求是依据选择某年的几月到几月,天生这个几个月的一个综合情形的sheet,然后分离天生这几个月的独自的sheet表,天生下面表的模板,包括两个sheet,一个综合月份的sheet和一个独自月份的sheet,由于独自月份的sheet体现情势都是一样的,我们能够依据选择的月份个数Copy几个sheet就能够了
复制代码代码以下:
Workbooksworkbooks=app.Workbooks;
_Workbookworkbook=workbooks.Add(template_path+"投标单元年度投标情形逐月统计表.xls");
Sheetssheets=workbook.Worksheets;
_WorksheetYearsheet=(_Worksheet)sheets.get_Item(1);
_Worksheetworksheet=(_Worksheet)sheets.get_Item(2);
if(worksheet==null)
{
return;
}
for(inti=1;i<monthCount;i++)
worksheet.Copy(Missing.Value,workbook.Worksheets);//月统计事情薄

Yearsheet的操纵就不说了,和后面几个一样操纵,关头是月份的sheet的天生,实在就是轮回操纵get_Item(i),代码以下
复制代码代码以下:
//////////////////////////////////////每个月具体统计////////////////////////////////////
intitem_id=2;
rowNum=0;book_Amount=0;index=0;
bid_Amount="";bidser_Amount="";agent_Amount=0;//清空变量
_Worksheetws=null;
for(inti=0;i<tableMM.Rows.Count;i++)
{
rowNum++;
Month=tableMM.Rows["DATE_MONTH"].ToString();
if(tableMM.Rows["DATE_MONTH"].ToString()==Month)
{
ws=(_Worksheet)sheets.get_Item(item_id);
ws.Cells=rowNum;
ws.Cells=tableMM.Rows["PROJNO"];
ws.Cells=tableMM.Rows["PROJNAME"];
ws.Cells=tableMM.Rows["BID_TYPE"];
ws.Cells=tableMM.Rows["BID_MODE"];
ws.Cells=tableMM.Rows["OPENDT"];
ws.Cells=tableMM.Rows["OPENADDRESS"];
ws.Cells=tableMM.Rows["BID_UNIT"];
ws.Cells=tableMM.Rows["NOTICE_NO"].ToString().Replace("神华国贸","");
ws.Cells=tableMM.Rows["BOOKAMOUNT"];
ws.Cells=tableMM.Rows["BIDPRICE"]+"(万"+tableMM.Rows["CURRENCY"]+")";
ws.Cells=tableMM.Rows["BIDSER_AMOUNT"]+"(万"+tableMM.Rows["CURRENCY"]+")";
ws.Cells=tableMM.Rows["AGT_AMOUNT"];
ws.Cells="";
ws.get_Range(ws.Cells,ws.Cells).Borders.Color=System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);
continue;
}
ws.Cells=year+"年"+bidName+GetMonth(Month)+"月份投标项目情形一览表";
//每个月算计
sql="SELECTCURRENCY,NVL(SUM(BIDPRICE),0)ASBIDPRICE,NVL(SUM(BOOKAMOUNT),0)ASBOOKAMOUNT,NVL(SUM(BIDSER_AMOUNT),0)ASBIDSER_AMOUNT,NVL(SUM(AGT_AMOUNT),0)ASAGT_AMOUNTFROMIBS_V_BID_MONTHLY_STAT"+SqlFilter+
"ANDDATE_YEAR=""+year+""ANDCOMPANY_ID="+biderID+"ANDDATE_MONTH=""+Month+"""+
"GROUPBYCURRENCY";
System.Data.DataTabledt1=OracleHelper.RetDataTable(sql);
for(intm=0;m<dt1.Rows.Count;m++)
{
bid_Amount+=dt1.Rows["BIDPRICE"]+"(万"+dt1.Rows["CURRENCY"]+")        ";
book_Amount+=float.Parse(dt1.Rows["BOOKAMOUNT"].ToString());
bidser_Amount+=dt1.Rows["BIDSER_AMOUNT"]+"(万"+dt1.Rows["CURRENCY"]+")        ";
agent_Amount+=float.Parse(dt1.Rows["AGT_AMOUNT"].ToString());
}
ws.Cells="合计";
ws.Cells=book_Amount;
ws.Cells=bid_Amount;
ws.Cells=bidser_Amount;
ws.Cells=agent_Amount;
ws.get_Range(ws.Cells,ws.Cells).Borders.Color=System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);
ws.Name=GetMM(Month);
item_id++;
index=i;//汇总下一个月份的投标项目
i--;
rowNum=0;book_Amount=0;
bid_Amount="";bidser_Amount="";agent_Amount=0;//清空变量
}
//跳出轮回时举行最初一个月份的项目汇总

用的是oracle数据库,以是下面谁人sql语句。。。呵呵
============================================================================================
下面大抵说得就差未几了,由于是不休轮回的甚么的,大概关于年夜的数据量读写来讲,对照好功能,假如人人有甚么更好的办法,能够指导下,为了填补守候工夫太长,以是才分离了AJAX来处置。
最初我把做的一个小demo的链接帖出来给人人,另有一些空模板和对应天生的数据表给人人对比看下,特别绝对庞大一些的表画应当是能画出来的,次要看人人接纳甚么样的办法,能少轮回一次就只管少轮回,呵呵~~~
EXCEL模板读写申明
http://www.justlike.com.cn/upfiles/template_xls.rar
http://www.justlike.com.cn/upfiles/ExcelFiles.rar
http://www.justlike.com.cn/upfiles/ExcelReportDemo.rar
(申明:最初弹出下载文件的一个页面一向想让其主动关失落,可是不可,假如不关失落,再点导出,不会弹出下载框,实践的处置中我们能够在导出中间放个下载按钮,就像下面的最终效果里那样,固然能够点导出的时分让其在网页中间接翻开,点下载的时分再弹出下载框,可是间接翻开的话,文件必要天生在假造目次下,不太平安,呵呵~~,看实践情形处置了)
==========================================================================================
明天增补申明下,关于谁人挪用ajax回调的效果,有个中央用到了所谓的“ajax嵌套挪用”,以下

复制代码代码以下:
functionExcelReportCallback(resp)
{
if(resp.value=="OK")
{
$("tipMsg").innerHTML="<fontcolor=#FF0000style=font-weight:bold>筹办导出数据,请稍等</font>";
setTimeout("RedirectUrl()",1000);//延时体验
}
else
if(resp.value=="NO")
{
$("tipMsg").innerHTML="<fontcolor=#FF0000style=font-weight:bold>没有找到切合该查询前提的数据</font>";
$("btnExcel").disabled=false;
}
else
{
$("tipMsg").innerHTML="<fontcolor=#FF0000style=font-weight:bold>告诫:导出数据堕落</font>";
$("btnExcel").disabled=false;
}

}

复制代码代码以下:
functionRedirectUrl()
{
$("tipMsg").innerHTML="<fontcolor=#7fffd4style=font-weight:bold>正在读写报表文件,请稍后</font>";
varajax=newajax_request("ExcelReport.aspx?flag=ReportByTemp&"+Math.random(),"","",ReportCallback);
functionReportCallback(resp)
{
if(resp.value!="Error"&&resp.value!="")
{
$("btnExcel").disabled=false;
$("tipMsg").innerHTML="<fontcolor=#FF0000style=font-weight:bold>数据导出乐成!</font>";
Open("XLS_DownLoad.aspx?path="+resp.value);//window.location.href=resp.value;//
}
else
{
$("btnExcel").disabled=false;
$("tipMsg").innerHTML="<fontcolor=#FF0000style=font-weight:bold>文件读写堕落,请反省文件模板是不是存在或对文件是不是有读写权限!</font>";
}
}
}
functionOpen(url)
{
window.open(url,"newwindow","height=1,width=1,top=1500,left=1500,toolbar=no,menubar=no,scrollbars=yes,location=no,status=no")
}

ExcelReportCallback(resp)底本是一个回调函数,可是内里挪用了一个RedirectUrl()办法,这个办法又包括了一个回调函数,如许就构成了回调的嵌套,之以是这么做,是由于,第一个回调是处置从数据库掏出数据乐成与否,假如乐成了跳转到画EXCEL的页面,如许的话会呈现一个空缺页等天生好后呈现下载框,厥后以为是不是能够嵌套一个回调来持续一次异步操纵,如许就不会呈现长工夫守候的空缺页面了,而是天生好EXCEL后前往地点,大概能够前往一个文件名到XLS_DownLoad.aspx页面间接下载,可是XLS_DownLoad.aspx也是要呈现的,我实验过让下载后这个页面主动封闭,恶棍做不到,以是把Open()办法里的数据值调得让页面不显现,可是形态栏仍是有显现的。
到这里算是写完了,决意奢靡下,放到首页下:),总以为首页的文章只要妙手才干放,并且放到首页也是一种奢靡,但愿对园子里的某些人有必定的匡助吧~~
http://xiazai.jb51.net/201102/yuanma/ExcelReport.rar2003年中微软发布最新版本的ASP.netWebMatrix,对于我们喜欢用Asp.net来编程的朋友实在是个好消息,我也实实在在的将Asp.net更深入的研究了一下,以方便我以后更好的运用它,同时我也讲讲使用它的感受。

谁可相欹 发表于 2015-1-19 08:44:00

asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦!

爱飞 发表于 2015-1-26 05:28:32

现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。

再现理想 发表于 2015-2-9 23:53:42

主流网站开发语言之JSP:JSP和Servlet要放在一起讲,是因为它们都是Sun公司的J2EE(Java2platformEnterpriseEdition)应用体系中的一部分。

小魔女 发表于 2015-2-28 09:55:15

比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。

活着的死人 发表于 2015-3-9 22:13:40

ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。

飘灵儿 发表于 2015-3-17 02:10:11

以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。

小女巫 发表于 2015-3-23 17:23:45

它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。
页: [1]
查看完整版本: ASP.NET网页设计ASP.NET操纵EXCEL的总结篇