回 帖 发 新 帖 刷新版面

主题:[求助]紧急 请问如何获得已经打开的excel文件的文件路径,文件名?

[求助]紧急 请问如何获得已经打开的excel文件的文件路径,文件名? 
我目前的程序需要获得当前正在打开的所有excel文件的列表, 
我已经查找了很久,都不能找到C#的方法, 
请高手帮忙,多谢!!! 
跪求高手帮忙!!! 
相关: 
这里有一个VB的方法 
http://www.bczs.net/xml/2003/4/26/1711527.xml  

关于此方法的msn信息在GetObject函数 Visual Basic中。 

贴上一段相关代码: 
' Add Option Strict Off to the top of your program. 
Option Strict Off 
' Declare necessary API routines: 
   Declare Function FindWindow Lib "user32" Alias _ 
      "FindWindowA" (ByVal lpClassName As String, _ 
      ByVal lpWindowName As Long) As Long 

   Declare Function SendMessage Lib "user32" Alias _ 
   "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _ 
      ByVal wParam As Long, ByVal lParam As Long) As Long 

Sub GetExcel() 
   Dim MyXL As Object   ' Variable to hold reference 
   ' to Microsoft Excel. 
   Dim ExcelWasNotRunning As Boolean   ' Flag for final release. 

   ' Test to see if there is a copy of Microsoft Excel already running. 
   On Error Resume Next   ' Defer error trapping. 
   ' Getobject function called without the first argument returns a 
   ' reference to an instance of the application.  
   ' If the application is not running, an error occurs. 
   MyXL = GetObject(, "Excel.Application") 
   If Err().Number <> 0 Then ExcelWasNotRunning = True 
   Err().Clear() ' Clear Err object in case error occurred. 

   ' Check for Microsoft Excel. If Microsoft Excel is running, 
   ' enter it into the Running Object table. 
   DetectExcel() 

   ' Set the object variable to reference the file you want to see. 
   MyXL = GetObject("c:\vb\TEST.XLS") 

   ' Show Microsoft Excel through its Application property. Then 
   ' show the actual window containing the file using the Windows 
   ' collection of the MyXL object reference. 
   MyXL.Application.Visible = True 
   MyXL.Parent.Windows(1).Visible = True 
   '  Do manipulations of your  file here. 
   ' 
End Sub 

Sub DetectExcel() 
   ' Procedure dectects a running Excel and registers it. 
   Const WM_USER = 1024 
   Dim hWnd As Long 
   ' If Excel is running this API call returns its handle. 
   hWnd = FindWindow("XLMAIN", 0) 
   If hWnd = 0 Then   ' 0 means Excel not running. 
      Exit Sub 
   Else 
      ' Excel is running so use the SendMessage API 
      ' function to enter it in the Running Object Table. 
      SendMessage(hWnd, WM_USER + 18, 0, 0) 
   End If 
End Sub 

回复列表 (共5个回复)

沙发

C#开发Excel 我做过一点
Marshal.GetActiveObject("Excel.Application")//这个可以获取正在运行Excel对象
当然,如果没有运行你可以new 一个Application,并设为可见

开发需要引用两个com:office lib 11 和 mir excel 11
这个根据你安装的office版本不一样会改变
在引用——〉com里面自己找找就行
再添加完成后,先到对象浏览器中熟悉下这两个com分别给你提供了什么方法

网上的关于这个的方法大多都是vb的,但是vb翻译成C#是很容易的事情

板凳

用WMI访问系统进程,或者枚举已打开的窗口可能可以达到目的,

3 楼

获取已打开的excel的文件的句柄,然后由属性获取该句柄的详细信息.其中包括文件路径,文件名

4 楼

谢谢各位的热心回答,分已加上,出于兴趣再请问各位高手,
1。我可以通过进程,获取打开的文件句柄么?
2。如果不是excel进程而是任意进程
Marshal.GetActiveObject(String  progID )中的progID如何获取?
系统快照中的progID是DWORD类型的。
附系统快照函数,结构
(HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID); )

BOOL WINAPI Process32Next(HANDLE hSnapshot,LPPROCESSENTRY32 lppe);

typedef struct tagPROCESSENTRY32 { 

DWORD dwSize; // 结构大小; 

DWORD cntUsage; // 此进程的引用计数; 

DWORD th32ProcessID; // 进程ID; 

DWORD th32DefaultHeapID; // 进程默认堆ID; 

DWORD th32ModuleID; // 进程模块ID; 

DWORD cntThreads; // 此进程开启的线程计数; 

DWORD th32ParentProcessID; // 父进程ID; 

LONG pcPriClassBase; // 线程优先权; 

DWORD dwFlags; // 保留; 

char szExeFile[MAX_PATH]; // 进程全名; 

} PROCESSENTRY32;


5 楼

String  progID 
每个程序对应一个
这个是可以在注册表中查出来的

我来回复

您尚未登录,请登录后再回复。点此登录或注册