环境
OS:Windows Server 2003
OFFICE2003
.NET 3.5
在server上有做如下的配置
1.配置DCOM中的Microsoft Excel应用程序启动激活,访问,配置权限给NETWORK,NETWORK SERVICE
2.对用的目录有写的权限
过程是先写Excel文件,再导出到客户端,出现解决访问。
查看服务器进程,发现Excel没有关闭,猜测原因可能是第一个Excel进程没有关闭,导致第二个下载的进程无法访问,出现拒绝访问的提示。
关闭Excel进程的代码如下,采用kill的方式:
private static void KillExcelProcess()
{
System.Diagnostics.Process[] myProcesses;
DateTime startTime;
myProcesses = System.Diagnostics.Process.GetProcessesByName("Excel");
//µÃ²»µ½Excel½ø³ÌID£¬ÔÝʱֻÄÜÅжϽø³ÌÆô¶¯Ê±¼ä
foreach (System.Diagnostics.Process myProcess in myProcesses)
{
startTime = myProcess.StartTime;
if (startTime > beforeTime && startTime < afterTime)
{
myProcess.Kill();
myProcess.Dispose();
}
}
}
最后发现还是无法关闭,请教园子里的高人有没有碰到过这种情况,和有没有更好的方式来关闭Excel进程?
感谢园子里这么多朋友的回复,这是个老问题了,通过分析还是建议避开需对Excel的操作,使用第三方的控件,现在问题已经得到圆满解决,再次感谢!
为何不用NPOI?不存在关闭进程的问题
NPOI确实比较好用,效率也很快,并且开源的。
写Excel最好不要用这种调用Excel软件的方式。拒绝访问就是没有权限嘛。所以你这种方式哪里打开,哪里关闭啦。
权限肯定是有的,问题是关闭不了excel进程。
@我爱菊花: 你真的理解进程的安全机制吗?
@ChatinCode: 似乎是客户Server有问题,客户说重装系统之后就OK了。
在asp.net上导出excel,建议你使用模板替换或三方的类库;这样简单好用;
aspose.cells是个不错的组件,虽然是收费的,但是你懂的。dcom存在很多问题,而且服务器上装office不太好。
asp.net 导出excel最好是用html的table来做,那样做很简单的,附上代码
public void OutPutExcel()
{
//定义文档类型、字符编码
Response.Clear();
Response.Buffer= true;
Response.Charset="GB2312";
//下面这行很重要, attachment 参数表示作为附件下载,您可以改成 online在线打开
//filename=FileFlow.xls 指定输出文件的名称,注意其扩展名和指定文件类型相符,可以为:.doc .xls .txt .htm
Response.AppendHeader("Content-Disposition","attachment;filename=FileFlow.xls");
Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");
//Response.ContentType指定文件类型 可以为application/ms-excel、application/ms-word、application/ms-txt、application/ms-html 或其他浏览器可直接支持文档
Response.ContentType = "application/ms-excel";
this.EnableViewState = false;
// 定义一个输入流
System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
this.RenderControl(oHtmlTextWriter);
//this 表示输出本页,你也可以绑定datagrid,或其他支持obj.RenderControl()属性的控件
Response.Write(oStringWriter.ToString());
Response.End();
}
感谢分享!
web的形式很有可能是正在使用的excel进程。你应该是关闭不了的吧!
Kill掉Excel进程就可以,客户的Server似乎有问题,Kill也杀不掉Excel的进程,客户的Server似乎有问题,重装系统却可以了,这样存在误杀的可能性。
System.Runtime.InteropServices.Marshal.ReleaseComObject 也没有作用么?
是的,Release不了,必须Kill掉Excel的进程才可以。