excel进程不能关闭

程序兔 2013-06-13 04:20:04
服务器读取完excel后想把excel进程关闭,试了下面的方法都不行
if (excelApp != null)
{
//Marshal.ReleaseComObject(excelApp);
excelApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
//KillExcel(excelApp);
excelApp = null;
}
ReleaseComObject不能关闭进程

private static void KillExcel(Microsoft.Office.Interop.Excel.Application theApp)
{
int id = 0;
IntPtr intptr = new IntPtr(theApp.Hwnd);
System.Diagnostics.Process p = null;
try
{
GetWindowThreadProcessId(intptr, out id);
p = System.Diagnostics.Process.GetProcessById(id);
if (p != null)
{
p.Kill();
p.WaitForExit();
p.Dispose();
}
}
catch (Exception ex)
{

}
}
p.Kill();会报拒绝访问错误
...全文
595 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
YuFS 2013-06-18
  • 打赏
  • 举报
回复
不要用MS com导出excel,这种方式就是excel进程关闭不了。本地还可以用kill杀进程,部署之后怎么也杀不了,用 NPOI导出Excel
马老虎 2013-06-18
  • 打赏
  • 举报
回复
我以前的一个帖子 你参考下 老虎传送门
insus 2013-06-18
  • 打赏
  • 举报
回复
Insus.NET的做法,是在站点建一个存放临时文件的目录如Temp 所有上传,打开,或处理文件的数据,均把文件摆放在此目录中。由于文件名是使用GUID来处理,因此你每次打开相同的文件,均会是不相同名的文件。程序处理完毕就不必管它了,无需当时就去想办法去把它们移走,删除等。 这样的的话,这个目录的文件那不是越来越多,是的,不错。可以参考下理处理方法: http://www.cnblogs.com/insus/articles/1431986.html
程序兔 2013-06-18
  • 打赏
  • 举报
回复
自己顶下吧 希望后面的高手看一下17楼的说明
joyhen 2013-06-18
  • 打赏
  • 举报
回复
你写的代码有问题,没有释放资源,被占用着能删掉才怪
  • 打赏
  • 举报
回复
asp.net? 我晕。我不认为这是asp.net程序员该考虑的事情。
  • 打赏
  • 举报
回复
有的时候,是应为excel进程具有对话框,你无法关闭。例如你可能需要首先执行 excelApp.Application.DisplayAlerts = false; 然后才能关闭。 假设你需要kill掉EXCEL进程,那么你要确保当前应用程序是使用“管理员身份”启动的。
  • 打赏
  • 举报
回复
if (excelApp != null) { excelApp.Application.Quit(); excelApp.Quit(); } .net可以非常方便地确保关闭Excel进程,而不需要调用 ReleaseComObject。
tanaichuan 2013-06-15
  • 打赏
  • 举报
回复
你这样 别个用了杀毒软件的还会爆出来 有程序试图关闭进程 已被阻止。。客户还以为他是那个你的网站中毒了也。。。。
by_封爱 2013-06-15
  • 打赏
  • 举报
回复
太多人都没解决的问题了 难道人家的myxls是白写的吗? 这么好的东西不用,一直卡在不能实现的问题上.. 我认为 浪费时间.. 另外说一句
引用 14 楼 sp1234 的回复:
...
感觉你的时间差不对呢..那么多人都说了.等你发完了才说.或者...
程序兔 2013-06-15
  • 打赏
  • 举报
回复
using (HostingEnvironment.Impersonate())                 {} 

权限是在应用程序运行账号下执行的
程序兔 2013-06-15
  • 打赏
  • 举报
回复
引用 16 楼 sp1234 的回复:
asp.net? 我晕。我不认为这是asp.net程序员该考虑的事情。
我用Com组件去往一个excel模板里写数据,这样会起动一个excel进程,如果不关闭服务器没做一次操作就会生成一个excel进程。
//System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);                                      
                    //excelApp = null;
                    //System.Diagnostics.Process myproc= new System.Diagnostics.Process();
                    //foreach (Process thisproc in Process.GetProcessesByName("EXCEL"))
                    //{
                    //    if (!thisproc.CloseMainWindow())
                    //    {
                    //        thisproc.Kill();
                    //        GC.Collect();
                    //    }
                    //}
用这个方式能关掉excel进程,但是是所有的。 为什么kill函数不可以??
程序兔 2013-06-14
  • 打赏
  • 举报
回复
System.Security.Principal.WindowsImpersonationContext impersonationContext;
                impersonationContext =
                    ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();
我把匿名访问禁用了,加了身份模拟 用windows认证 还是说没权限 无奈了
程序兔 2013-06-14
  • 打赏
  • 举报
回复
等量用户===登陆用户
程序兔 2013-06-14
  • 打赏
  • 举报
回复
引用 9 楼 dongxinxi 的回复:
晕,才看到你是在ASP.NET 你不知道w3w服务使用匿名用户验证时,是没有权限直接杀用户进程的么? 你需要临时给w3w进程提权(提升到与用户进程相当的权限令牌) API的Quit(),正常运行时也不会出问题的 保险起见,你可以在那之后,再CloseWindow();
我现在用等量用户(有管理员权限)作为web程序的运行帐户, 然后用
using (HostingEnvironment.Impersonate())
                {}
去调用kill怎么还是删不掉啊
  • 打赏
  • 举报
回复
晕,才看到你是在ASP.NET 你不知道w3w服务使用匿名用户验证时,是没有权限直接杀用户进程的么? 你需要临时给w3w进程提权(提升到与用户进程相当的权限令牌) API的Quit(),正常运行时也不会出问题的 保险起见,你可以在那之后,再CloseWindow();
  • 打赏
  • 举报
回复
如果是同一用户运行的进程,强杀应该是可以,检查一下theApp.Hwnd这个句柄或者pid有没有搞错 还有,调用了Quit()之后,ReleaseComObject和强杀都可能出问题,因为程序很可能还正在关闭中.. 强杀至少也要判断一下进程的状态再杀吧 if(p != null && !p.HasExited) { p.Kill();... } 另外,也可以发两条消息结束消息循环,基本与用户点关闭差不多

        const int WM_CLOSE = 0x0010,    //关闭窗口       
                  WM_QUIT = 0x0012;     //退出线程消息循环

       //发送消息后不等待立即返回
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool PostMessage(IntPtr hWnd, int WM_CHAR, int wParam, int lParam);

        public static void CloseWindow(IntPtr hWnd)
        {
            //注意:单独发送WM_CLOSE消息,有些程序将一直等待用记确认保存或关闭
            //再补发一条WM_QUIT消息就行了
            PostMessage(hWnd, Mapper.WM_CLOSE, 0, 0);
            PostMessage(hWnd, Mapper.WM_QUIT, 0, 0);            
        }

CloseWindow(程序主窗口句柄); //可以传process.MainWindowHandle
  • 打赏
  • 举报
回复
直接Kill 名字Excel的进程
程序兔 2013-06-13
  • 打赏
  • 举报
回复
引用 5 楼 qy1116 的回复:
[quote=引用 4 楼 netsliverlight 的回复:] [quote=引用 3 楼 qy1116 的回复:] [quote=引用 2 楼 netsliverlight 的回复:] [quote=引用 1 楼 qy1116 的回复:] 应该是权限问题了。
我都把应用程序的运行帐号改成改成有管理员权限的用户了。。[/quote]那照你这么说应该没问题啊,你试试手动结束这个进程看看[/quote] 手动可以结束[/quote]你把任务管理器打开,再运行你的程序,看你程序进程的用户是哪个!之后看该用户是否权限对的,还是不行的话 我也不知道怎么办了[/quote] 不行的 郁闷 进程帐号就是应用程序运行帐号
好基友一被子 2013-06-13
  • 打赏
  • 举报
回复
引用 4 楼 netsliverlight 的回复:
[quote=引用 3 楼 qy1116 的回复:] [quote=引用 2 楼 netsliverlight 的回复:] [quote=引用 1 楼 qy1116 的回复:] 应该是权限问题了。
我都把应用程序的运行帐号改成改成有管理员权限的用户了。。[/quote]那照你这么说应该没问题啊,你试试手动结束这个进程看看[/quote] 手动可以结束[/quote]你把任务管理器打开,再运行你的程序,看你程序进程的用户是哪个!之后看该用户是否权限对的,还是不行的话 我也不知道怎么办了
加载更多回复(4)

62,072

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧