如何检查文件是否使用OLE在Excel中打开(将excel进程打开)

我如何检查一个文件是否已经在某个Excel实例中打开?

我使用DXL(DOORS)语言,但它应该独立于此语言。

有没有我可以调用来检查打开哪个文件的OLE方法,并将其与path/文件名进行比较?

如果可以的话,我可以只closures那个Excel应用程序中的工作表/文件吗?

编辑:这是我到现在为止,这个工程,但只有一次。 DXL保留一个Excel.exe进程打开,并在接下来的检查,使用实例没有打开的工作簿,甚至没有窗口。

if (confirm "File \"" fPath "\" already exists. Do you want to overwrite it?") { // check if file is opened in any Excel instance OleAutoObj oleWorkbooks = null; OleAutoObj oleExcel = null; OleAutoObj oleWorkbook = null; OleAutoArgs autoArgs = create; oleExcel = oleGetAutoObject("Excel.Application"); bool opened = false; // if excel is opened if(oleExcel != null){ d("Excel is opened"); // Get workbooks and open file oleGet(oleExcel,"Workbooks", oleWorkbooks); // compare each open workbook int count = 0; oleGet(oleWorkbooks,"Count", count); string workbookname = ""; string sPath = replace(fPath, "\\", "/"); sPath = stripPath(sPath, true); while (count > 0) { d("checking opened document"); clear(autoArgs); put(autoArgs, count); oleGet(oleWorkbooks,"Item", autoArgs, oleWorkbook); oleGet(oleWorkbook, "Name", workbookname); opened = sPath == workbookname; if(opened) { if(confirm "The file is currently opened in Excel. It must be closed. Do you want to close the document?") { clear(autoArgs); oleMethod(oleWorkbook,"Close",autoArgs); } break; } count--; } } oleCloseAutoObject(oleExcel); oleCloseAutoObject(oleWorkbooks); oleCloseAutoObject(oleWorkbook); // todo leaves excel process open if(!opened) { streamOutputData = write fPath; streamOutputData << sOutput; close streamOutputData; return true; } } 

使用现有的DXL方法解决它canOpenFile(stringpath,布尔写):

 if (confirm "File \"" fPath "\" already exists. Do you want to overwrite it?") { if(canOpenFile(fPath, true)) { streamOutputData = write fPath; streamOutputData << sOutput; close streamOutputData; return true; } else { e("File \"" fPath "\" is opened in another program. Close it! (It's probably Excel ;) )"); } } 

我不知道DXL,但这是你可以在VBA中做的,我让你适应DXL:

 Sub IsXLBookOpen(strName As String) 'Procedure designed to test if a specific Excel 'workbook is open or not. Dim i As Long, XLAppFx As Excel.Application 'Find/create an Excel instance On Error Resume Next Set XLAppFx = GetObject(, "Excel.Application") If Err.Number = 429 Then Set XLAppFx = CreateObject("Excel.Application") Err.Clear End If On Error GoTo 0 'Loop through all open workbooks in such instance For i = 1 To XLAppFx.Workbooks.Count If XLAppFx.Workbooks(i).Name = strName Then MsgBox("The workbook is open") 'Close the workbook and ask if user wants to save XLAppFx.Workbooks(i).Close 'Force close and save changes XLAppFx.Workbooks(i).Close True Next i End Sub 

改编自这里