C#: закрыть файл Excel без всплывающего окна - PullRequest
0 голосов
/ 03 марта 2020

Так что в основном мое приложение запускает макрос Excel из файла, который обновляет файл и затем закрывает его.

Когда я открываю файл, я устанавливаю переменную «DisplayAlerts = false», чтобы игнорировать все всплывающие окна и он работает, как и ожидалось, на моем компьютере ... однако, мой коллега пытался использовать его и для каждого файла, он получает всплывающее окно с вопросом, хочет ли он сохранить все изменения ...

Проверено другое вопросы о всплывающих окнах в Excel, но все предлагаемые решения используют "oBook.Saved = true;" или «oBook.Close (false);», но у меня это не сработало.

Мой код выглядит следующим образом:

    using Microsoft.Office.Interop.Excel;

    public static bool Trigger_Macro_From_File(string path)
    {
        ApplicationClass oExcel = null;
        Workbook oBook = null;
        try
        {
            string filename = Path.GetFileName(path);
            string macro_name = "!some_macro";
            string macro = @"'" + filename + @"'" + macro_name;

            // Create an instance of Microsoft Excel
            oExcel = new ApplicationClass
            {
                DisplayAlerts = false,
                Visible = false
            };

            oBook = oExcel.Workbooks.Open(path);

            RunMacro(oExcel, new Object[] { macro });

            oBook.Save();
            oBook.Saved = true;
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
        finally
        {
            oBook?.Close(false);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook);
            oBook = null;
            oExcel?.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel);
            oExcel = null;
            GC.Collect();
        }
    }

Кто-нибудь знает что-нибудь об этом?

Заранее спасибо.

1 Ответ

0 голосов
/ 06 марта 2020

Можно дважды проверить, что в диспетчере задач не запущен другой процесс «Microsoft Excel».

Допустим, в какой-то момент в процессе разработки вы запустили программу и открыли книгу с чем-то вроде

xlWorkbook = xlApp.Workbooks.Open(filePath);

Затем по какой-то причине вы столкнулись с исключением и убили программу, не закрывая файл правильно (workbook.Close(..), app.Quit(..) и т. д.).

Процесс Microsoft Excel все еще выполняется в фоновом режиме и имеет дескриптор файла, который вы хотите редактировать. Таким образом, вы не можете выполнить инструкцию, которая сохраняет файл под тем же именем. Вот почему появляется всплывающее окно.

Этот сценарий взят с точки зрения разработчика, но такое же поведение могло бы произойти на компьютере вашего коллеги, если ваше приложение зависло, не завершив работу должным образом, и перезапустилось.

Кроме того, будьте осторожны, чтобы оператор finally не всегда мог выполняться , поэтому дважды проверьте, какой сценарий может привести к закрытию вашего приложения без освобождения COM-объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...