下面是我用ASP.NET开发的一个网站的代码片断,Private Declare Auto Function GetWindowThreadProcessId Lib "User32" (ByVal hWnd As Integer, ByRef intProcessID As Integer) As IntegerPrivate Sub SendExcel(ByVal dt As DataTable)
    Dim oExcelApp As Excel.Application = Nothing
    Dim oExcelBook As Excel.Workbook = Nothing
    Try
        操作EXCEL文件……
    Finally
        If Not oExcelApp Is Nothing Then
            Dim intProcessId As Integer = 0
            Dim intThreadId As Integer = 0
            Try
                If Not oExcelBook Is Nothing Then
                    oExcelBook.Close()
                    oExcelBook = Nothing
                End If
                oExcelApp.Workbooks.Close()
                oExcelApp.Quit()
                If oExcelApp.VBE.MainWindow.HWnd <> 0 Then
                    intThreadId = GetWindowThreadProcessId(oExcelApp.VBE.MainWindow.HWnd, intProcessId)
                End If
            Catch ex As Exception
            Finally
                oExcelApp = Nothing
                GC.Collect()
                GC.WaitForPendingFinalizers()
            End Try
            If intProcessId <> 0 Then
                System.Diagnostics.Process.GetProcessById(intProcessId).Kill()
            End If
        End If
    End Try
        发送EXCEL文件内容……
End Sub不知为什么GetWindowThreadProcessId函数返回的intProcessId和intThreadId总是0,我用C++和VB.NET编了两个小程序在同一时刻用相同的值试验都没问题。我猜可能是ASP.NET的用户和权限设置问题,也不知对不对,具体怎样设置就更不清楚了。没办法,只好请高手指教。顺便,当时因为EXCEL对象无法建立,我手工往web.config文件里加过<identity impersonate="true"/>这么一句。

解决方案 »

  1.   

    确实是权限问题,调用系统进程,必须要SYSTEM权限。关于EXCEL进程的问题,我是这么干的:
    http://blog.sina.com.cn/u/5377df2f010004bd
      

  2.   

    这个东西是win32api吧?
    asp.net中使用这样的调用是有一些问题的我想问一下,你的excelapplication是否可以成功建立??另外,你可以试试不在web应用中建立excelapplication,直接专门为这个做一个工程,这样的话,可以尽量的避免权限的问题,在aspnet的页面中直接操作这个就可以了
      

  3.   

    Reeezak:
      这个我也想过,不过总觉得太麻烦了。所以没有试。
      Excel.Application已经可以成功建立了,操作也都可以顺利完成。
      

  4.   

    excel 2003 好像就没有这个问题了
    dll 好像应用版本是11的
      

  5.   

    关于Excel进程退出的问题,我看好多人提到了杀进程的方法,但是没人提到进程ID获取不到的问题。真的没有人遇到过这个问题吗?
      

  6.   

    >  确实是权限问题,调用系统进程,必须要SYSTEM权限。
    SYSTEM权限是否意味着启动EXCEL进程的进程的账户是管理员账户?〉另外,你可以试试不在web应用中建立excelapplication,直接专门为这个做一个工程,这样
    〉的话,可以尽量的避免权限的问题,在aspnet的页面中直接操作这个就可以了
    我做了一个链接库,里边只是对GetWindowThreadProcessId的一个包装,但结果还是一样。我猜
    原因是链接库使用的账户是装入该链接库的进程的账户。如果把所有ExcelApplication的操作做到一个工程里去,那么这个工程是DLL还是EXE,DLL的话还是有刚才我说的那个问题的。不知Reeezak(坚持信念)兄有没有实际做过,怎么做的?
      

  7.   

    5.可能会出现asp_net用户操作Excel的权限不够,配置Dcom。运行Dcomcnfg.exe,找到Excel应用程序,配置其属性,身份验证级别选“无”,身份标识选“交互式用户”,安全性页面,启动和访问均给everyone。注意:查看当前进程中是否有Winword进程存在,如果有且不能被结束,那么重启动计算机。再次运行你的代码即OK。这样以后就不会出现权限不够的情况了。
      

  8.   

     我也是碰到了这个问题。
    asp.net 2.0, 生成excel pivot文件,怎么关都管不掉。
    楼上的方法也试过了,没用。