B/S程序生成Excel时经常出现“无法找到网页”错误,将服务器Win2000Server重新启动后正常
本人所开发的B/S体系程序,服务器将DataGrid数据输出到Excel,由客户端下载,现在经常出现客户端在点击“生成Excel”事件时出现“无法找到网页”的错误,将Web服务器重新启动后一切正常,客户端可以下载Web服务器生成的Excel文件,请问高手原因何在?
Web服务器:MS Windows2000 Server/SP4/IE6.0SP1/.Net Framework1.1
MS SQL Server2000开发人员版
MS Office XP
已做过已下设置:
1、Dcomcnfg配置,已将“Microsoft Excel 应用程序”中的三种权限都加上“Everyone”和“本地ASP.net用户”,并都赋予权限
2、在产生Excel文档的目录:(C:\Inetpub\wwwroot\PTACE\Web\Temp),属性-安全-添加用户-添加AspNet用户,aspnet用户的允许写钩上
3、已在“计算机管理”中将“本地ASP.Net用户”加入Administrator用户组
有哪位高手遇到过这种问题,敬请告之,谢谢!!!
问题点数:100、回复次数:8Top
1 楼yhzhang37(yhzhang)回复于 2003-11-03 15:06:49 得分 5
可能在调用Excel的过程中出现错误,Excel未正确关闭。。
你在任务管理器里,将调用的Excel进程结束,然后试试。。Top
2 楼haoliqi(学习男孩)回复于 2003-11-03 15:21:20 得分 0
可否把你点击“生成Excel”事件时的代码拿来看看!Top
3 楼newtang(newtang)回复于 2003-11-03 17:57:13 得分 0
public string BuildExcel(string paTempletID,string paBillID,string paPath,DataSet[] paDataSet,string[] paTableName)
{
string SQLText,FileName,SheetName,FieldName,TableName,SaveFileName,ReturnFile;//文件名,字段名,表名,保存的文件名
int FieldCount,PrintCount;//字段数,记录数
int VRow,HRow;//打印行,列
int DataSetCount;
int i,j,m;
DataSet TempletDS;//临时数据集
Excel.Application AppExcel;
Excel.Workbook AppBook;
Object ValMissing;
DataSetCount=paDataSet.Length;
TempletDS=new DataSet();
//获取模伴文件名
SQLText="Select TempletName,SheetName from dtSysReportTemplet where TempletID='"+paTempletID+"'";
objDbSqlRun.GetDataSet(SQLText, TempletDS);
FileName = TempletDS.Tables[0].Rows[0]["TempletName"].ToString();
SheetName= TempletDS.Tables[0].Rows[0]["SheetName"].ToString();
ReturnFile=SheetName+paBillID+".xls";
FileName=paPath+"Templet\\"+FileName;//模板文件
SaveFileName=paPath+"Temp\\"+SheetName+paBillID+".xls";//保存的临时文件:模板名+编号(确定唯一性)
try
{
File.Delete(SaveFileName);
}
catch
{
//
}
try
{
ValMissing = System.Reflection.Missing.Value;
AppExcel = new Excel.Application();
//获取模板名称及Excel文件所在路径
//打开Excel模板
AppBook = AppExcel.Workbooks.Open(FileName,ValMissing,ValMissing,ValMissing,ValMissing,ValMissing,ValMissing,ValMissing, ValMissing,ValMissing,ValMissing,ValMissing, ValMissing,ValMissing,ValMissing);
//查询
for(i=0;i<=DataSetCount-1;i++)
{
TableName=paTableName[i].ToString();
SQLText="Select a.*,b.FieldNameE from dtReportField a,dtSysReportField b where a.FieldID=b.FieldID and a.TempletID=b.TempletID and a.TempletID='"+paTempletID+"'and TableNameE='"+paTableName[i]+"' Order By a.SortNo";
objDbSqlRun.GetDataSet(SQLText, TempletDS);
FieldCount=TempletDS.Tables[0].Rows.Count;
PrintCount=paDataSet[i].Tables[0].Rows.Count;
for (j=0;j<FieldCount;j++)
{
FieldName=TempletDS.Tables[0].Rows[j]["FieldNameE"].ToString();
VRow=Convert.ToInt32(TempletDS.Tables[0].Rows[j]["VRow"].ToString());
HRow=Convert.ToInt32(TempletDS.Tables[0].Rows[j]["HRow"].ToString());
for(m=0;m<PrintCount;m++)
{
AppExcel.Cells[VRow,HRow]=paDataSet[i].Tables[0].Rows[m][FieldName].ToString();
VRow++;
}
}
}
Sheets sheets = AppBook.Worksheets;
_Worksheet worksheet = (_Worksheet) sheets.get_Item(1);
AppBook.Saved = true;
AppExcel.UserControl = false;
//保存文件
worksheet.SaveAs(SaveFileName,ValMissing,ValMissing,ValMissing,ValMissing,ValMissing,ValMissing,ValMissing, ValMissing,ValMissing);
AppExcel.Quit();
ValMissing=null;
sheets=null;
worksheet=null;
AppBook=null;
AppExcel=null;
GC.Collect();//强制释放垃圾
return ReturnFile;
}
catch
{
return ReturnFile;
}
}
Top
4 楼saucer(思归)回复于 2003-11-03 18:29:51 得分 0
catch
{
return ReturnFile;
}
what is ReturnFile? is that a file name returned or SaveFileName? that looks bad, in the case of an exception, the file doesn't exist, your users will get “无法找到网页”的错误Top
5 楼newtang(newtang)回复于 2003-11-03 19:42:53 得分 0
TO saucer(思归) :
ReturnFile为返回的在服务器上生成的Excel文件名,由客户端下载。
可是我在开发的机器上一切正常,执行N次“生成Excel”都无问题,在别的服务器上也OK,就是客户的那台服务器老出现不能生成Excel的“无法找到网页”的错误。
另外,我发现不管是哪一台机器运行系统,生成Excel后都会在Web服务器上产生一个不能自动释放的Excel进程,是不是跟这个有关?但其它机器即使这样也都正常可以不断重复生成Excel啊。
百思不得其解。。。Top
6 楼newtang(newtang)回复于 2003-11-03 20:20:45 得分 0
自己顶。。。Top
7 楼redbb(....DB & DEV....抵制日货,人人有责...)回复于 2003-11-03 21:09:50 得分 5
check your IE 's security 's setting , set it to lowTop
8 楼saucer(思归)回复于 2003-11-03 21:18:00 得分 90
see
INFO: Considerations for Server-Side Automation of Office
http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q257757
suggestion:
1. don't use Excel on the server side, just create CVS file but rename them to .xls
2. if the file is temporary, output the file directly to the user, don't create it on the server then redirect
Top




