下面是我用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"/>这么一句。
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"/>这么一句。
http://blog.sina.com.cn/u/5377df2f010004bd
asp.net中使用这样的调用是有一些问题的我想问一下,你的excelapplication是否可以成功建立??另外,你可以试试不在web应用中建立excelapplication,直接专门为这个做一个工程,这样的话,可以尽量的避免权限的问题,在aspnet的页面中直接操作这个就可以了
这个我也想过,不过总觉得太麻烦了。所以没有试。
Excel.Application已经可以成功建立了,操作也都可以顺利完成。
dll 好像应用版本是11的
SYSTEM权限是否意味着启动EXCEL进程的进程的账户是管理员账户?〉另外,你可以试试不在web应用中建立excelapplication,直接专门为这个做一个工程,这样
〉的话,可以尽量的避免权限的问题,在aspnet的页面中直接操作这个就可以了
我做了一个链接库,里边只是对GetWindowThreadProcessId的一个包装,但结果还是一样。我猜
原因是链接库使用的账户是装入该链接库的进程的账户。如果把所有ExcelApplication的操作做到一个工程里去,那么这个工程是DLL还是EXE,DLL的话还是有刚才我说的那个问题的。不知Reeezak(坚持信念)兄有没有实际做过,怎么做的?
asp.net 2.0, 生成excel pivot文件,怎么关都管不掉。
楼上的方法也试过了,没用。