Не закрывается процеесс excel при использовании interop

Рейтинг: 0Ответов: 1Опубликовано: 06.04.2023
 Excel.Application excel = null;
        Excel.Workbooks workbooks = null;
        Excel.Workbook workbook = null;
        Excel.Sheets worksheets = null;
        Excel.Worksheet worksheet = null;

        excel = new Excel.Application();
        excel.DisplayAlerts = false;
        if (string.IsNullOrEmpty(_filePath))
        {
            excel.DisplayAlerts = true;
            MessageBox.Show("Вы не выбрали файл", "Внимание!",
                 MessageBoxButtons.OK, MessageBoxIcon.Error);
            List<Person> list = new List<Person>();
            return list;
        }
        workbooks = excel.Workbooks;
        workbook = workbooks.Open(_filePath);
        worksheets = workbook.Worksheets;
        worksheet = worksheets.Item[1];

        int rows = worksheet.UsedRange.Rows.Count;
        int cols = worksheet.UsedRange.Columns.Count;

\\

тут считываются ячейки примерно вот так :

string? fio = (string)(worksheet.Cells[i, 1] as Excel.Range).Value2;

int age = (int)(worksheet.Cells[i, 3] as Excel.Range).Value2;

\\

        excel.Quit();
        Marshal.ReleaseComObject(worksheet);
        Marshal.ReleaseComObject(worksheets);
        Marshal.ReleaseComObject(workbook);
        Marshal.ReleaseComObject(workbooks);
        Marshal.ReleaseComObject(excel);
        GC.Collect();

        return Person.personlist;

я предполагаю, что тут мешается подсчёт использованных ячеек в переменные rows и cols. Если так и есть, то подскажите, пожалуйста, как их можно по другому реализовать? Если не в них, то всё же в чём и как это исправить?

Ответы

▲ 1

Помогло поставить функцию Quit() прямо перед отпусканием самого приложения. То есть так:

 Marshal.ReleaseComObject(worksheet);
                Marshal.ReleaseComObject(worksheets);
                Marshal.ReleaseComObject(workbook);
                Marshal.ReleaseComObject(workbooks);
                excel.Quit();
                Marshal.ReleaseComObject(excel);

И ещё нашёл лишний запуск экселя в форме окна, то есть при запуске приложения объявлялись переменные и соответсвенно запускался эксель