Rencyrence Ответов: 4

C# Winform Как правильно утилизировать Excel / Interop?


Здравствуйте, вот вам сценарий:

Я использую datagridview для экспорта данных в Excel, после многих раз экспорта я заметил, что мой компьютер стал медленным, и проверил процессы, и я увидел, что их слишком много Excel.exe бежит. Что я сделал, так это закрыл приложение, и оно удаляется в процессе.

Мой вопрос заключается в том, как правильно распорядиться Excel после экспорта данных, чтобы я не выходил из своего приложения каждый раз. Мой код ниже:

Microsoft.Office.Interop.Excel._Application Excel = new Microsoft.Office.Interop.Excel.Application();

                  Workbook wb = Excel.Workbooks.Add(XlSheetType.xlWorksheet);

                  Worksheet ws = (Worksheet)Excel.ActiveSheet;

                  //ws.PageSetup.Zoom = false;

                  //ws.PageSetup.FitToPagesTall = 1;
                  //ws.PageSetup.FitToPagesWide = 1;

                  Excel.Visible = true;

                  ws.Cells.EntireColumn.AutoFit();
                  ws.Cells.EntireRow.AutoFit();
                  ws.Cells.Style.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft; // Align cells to lef (excel)(

Пожалуйста, используйте мой код для пересмотра . спасибо

4 Ответов

Рейтинг:
32

Rencyrence

Спасибо, что это мне очень помогает!

Рейтинг:
2

koolprasadd

EXCEL и WORD - это очень неуправляемые объекты, поэтому GC не может собрать их в EXCEL, если сначала нам нужно использовать 'Marshal.Метод ReleaseComObject' для освобождения COM-объекта или каждого листа, а затем нам нужно сначала утилизировать книгу EXCEL, а затем выйти из нее в объект приложения EXCEL
смотрите ниже группу очистки

// Cleanup
GC.Collect();
GC.WaitForPendingFinalizers();

Marshal.FinalReleaseComObject(xlRng);
Marshal.FinalReleaseComObject(xlSheet);

xlBook.Close(Type.Missing, Type.Missing, Type.Missing);
Marshal.FinalReleaseComObject(xlBook);

xlApp.Quit();
Marshal.FinalReleaseComObject(xlApp);


Рейтинг:
2

Member 10187249

Прежде всего решение является правильным только одна вещь отсутствует, все еще в фоновой задаче excel пустой объект все еще работает для удаления, что вы можете поместить ниже кода наконец:

Process[] excelProcesses = Process.GetProcessesByName("excel");
        foreach (Process p in excelProcesses)
        {
            if (string.IsNullOrEmpty(p.MainWindowTitle)) // use MainWindowTitle to distinguish this excel process with other excel processes 
            {
                p.Kill();
            }
        }


CHill60

Нет, если все сделать правильно. Однако, если вы собираетесь копировать решения с других сайтов, то неплохо было бы отдать им должное c# - как я могу утилизировать свое приложение Excel - переполнение стека[^]

Рейтинг:
1

Mathi Mani

С тех пор как вы использовали Excel.Visible = true, excel будет виден пользователю на экране. Так что, что делать с excel на экране, зависит от пользователя. Пользователь может либо сохранить его и закрыть, либо просто выбросить без сохранения. И когда пользователь закрывает excel программу, процесс также должен быть закрыт/прекращен.