как проверить, открыт ли файл в Excel с помощью OLE (оставляет процесс Excel открытым) - PullRequest
1 голос
/ 24 августа 2011

как я могу проверить, открыт ли файл в каком-либо экземпляре Excel?

Я использую язык DXL (DOORS), но он не должен зависеть от этого языка.

Есть ли OLEметод, который я могу вызвать, чтобы проверить, какой файл открыт и сравнить его с путем / именем файла?

, и если это возможно, могу ли я закрыть только этот лист / файл в этом приложении 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;    
        }
    }

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

решил это, используя существующий метод DXL canOpenFile (путь строки, запись bool):

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 ;) )");
        }
    }
0 голосов
/ 24 августа 2011

Я не знаю 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

Адаптировано с здесь

...