Не удалось закрыть Excel даже после выпуска ресурсов

Я пробовал много решений, но не работал. Помогите мне решить эту проблему. Ниже приведен код, используемый в SSIS Script Task

using Excel = Microsoft.Office.Interop.Excel; Excel.Application xlApp = null; Excel.Workbooks workbooks = null; Excel.Workbook xlWorkbook = null; Excel.Worksheet worksheet = null; Excel.Range xlRange = null; try { xlApp = new Excel.Application(); xlApp.DisplayAlerts = false; xlApp.AskToUpdateLinks = false; workbooks = xlApp.Workbooks; xlWorkbook = workbooks.Open("sample.csv", 2, true); xlWorksheet = xlWorkbook.Sheets[1]; xlRange = xlWorksheet.UsedRange; int rowCount = xlRange.Rows.Count; for (int row = 2; row <= rowCount; row++) { //some logic } } catch (Exception ex) { MessageBox.Show(ex.Message); } finally //releasing all resources { GC.Collect(); GC.WaitForPendingFinalizers(); Marshal.ReleaseComObject(xlRange); Marshal.ReleaseComObject(xlWorksheet); xlRange = null; xlWorksheet = null; xlWorkbook.Close(); Marshal.ReleaseComObject(xlWorkbook); xlWorkbook = null; workbooks = null; xlApp.Quit(); Marshal.ReleaseComObject(xlApp); xlApp=null; } 

даже после выпуска ресурсов, все еще видят один процесс excel

Для этого есть два способа:

Первый метод

Вы можете создать пользовательскую ReleaseObject как ReleaseObject ниже:

 private void ReleaseObject(object obj) { try { int intRel = 0; do { intRel = System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); } while (intRel > 0); } catch (Exception ex) { obj = null; } finally { GC.Collect(); } } 

И используйте следующий код:

 xlWorkBook.SaveAs("...."); xlWorkBook.Close(); xlApp.Quit(); ReleaseObject(xlRange); ReleaseObject(xlWorkSheet); ReleaseObject(xlWorkBook); ReleaseObject(xlApp); 

Второй метод

Создайте класс внутри задачи скрипта, создайте функцию, которая получит идентификатор процесса Excel.Application и убьет его

 using Excel = Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; using System.Diagnostics; class Sample { [DllImport("user32.dll")] static extern int GetWindowThreadProcessId(int hWnd, out int lpdwProcessId); Process GetExcelProcess(Excel.Application excelApp) { int id; GetWindowThreadProcessId(excelApp.Hwnd, out id); return Process.GetProcessById(id); } } 

а затем вы можете использовать GetExcelProcess(XlApp).Kill();

Похоже, ты на правильном пути. Тем не менее, вы в настоящее время являетесь его ExcelApplication, который является фактическим процессом, который вы увидите в Мониторе задач и его ExcelDocument, который должен быть закрыт до того, как WordApplication можно будет убить.

Взгляните на этот простой пример:

 public void Foo(string filePath) { var application = new Excel.Application(); // do your stuff here... var document = application.Workbooks.Open(filePath, ReadOnly: true, Visible: false); // this is the magic: clear 'application' and 'document', // once the work is finished if (document != null) document.Close(SaveChanges: false); if (application != null) application.Quit(SaveChanges: false); document = null; application = null; } 

Здесь вы увидите, что на самом деле мы правильно закрываем () книгу (документ) и Quit () приложение. Это часть того, что вы делаете в секции finally, но помните, что переменные инициализируются, прежде чем вы сможете в разделе try ….

Мой совет здесь: не называть сборку мусора (GC) и маршал вручную. Если вы не совсем уверены, что он делает, это может повредить вам позже побочными эффектами. Далее вы можете улучшить выборку, добавив красивую структуру using (...) вокруг ExcelApplication и ExcelWorkbook.

Правильная очистка объектов Interop.Excel сложна. Сделайте это неправильно, и вы можете запустить игру SQL или SSIS с множеством экземпляров Zombie Excel.

введите описание изображения здесь

Интернет усеян советом о том, как правильно Close() объекты Close() , Quit() , ReleaseObject() Interop.Excel . Совет, который работает для вас, будет зависеть от того, какой порядок вы называете своими объектами и какие методы вы называете. Например, если вы использовали метод двойной точки, тогда вы создали непривлекательный объект. Даже если вы прислушаетесь ко всем советам и структурируете свой код, чтобы избежать ошибок, все меняется, когда пакет SSIS развертывается на сервере. Microsoft в основном сказала разработчикам не делать этого .

Microsoft в настоящее время не рекомендует и не поддерживает автоматизацию приложений Microsoft Office от любого бездействия, неинтерактивного клиентского приложения или компонента (включая ASP, ASP.NET, DCOM и NT Services), поскольку Office может проявлять нестабильное поведение и / или тупиковой ситуации, когда Office запущен в этой среде.

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

Послушайте, я знаю, что есть много способов Interop.Excel на Interop.Excel и даже больше о том, как их очистить. Но эти статьи ориентированы на людей, которые запускают один экземпляр кода на своей машине. Это не рекомендуется для среды предприятия с SSIS. Да, это воняет.

Но есть решения! NetOffice похож на Interop.Excel и помогает обрабатывать закрытие и удаление COM-объектов. Моим сильным предпочтением является EPPlus API, он очень легкий, похож на Interop.Excel и на 10X быстрее без проблем с очисткой. Он может делать почти все, что может сделать Interop, кроме печати и макросов. Даже лучше, чем C #, начнется с использования встроенных компонентов SSIS Excel, которые Microsoft предоставила для работы с ETL.

Удачи!

  • Почему SSIS сохраняет последнюю строку как NULL при передаче данных из Excel в CSV?
  • Проблема использования переменной SSIS в потоке данных
  • Импорт большого файла excel с использованием диспетчера соединений excel в SSIS
  • SSIS: сделать Excel видимым в задании скрипта во время выполнения задания агента SQL Server
  • SSIS Импорт документов Excel с использованием позиции столбца, имени не
  • Ошибка SSIS Excel Source с ошибкой и возвращаемый код ошибки 0xC020801C с установленным значением 64BitRuntime равным FALSE
  • Задача сценария SSIS C # для динамического выбора первого листа последнего файла Excel с определенным именем
  • Excel не открывается, сгенерированный с помощью c #
  • Форматирование адресатов SSIS Excel
  • Как разбить данные таблицы на отдельные файлы Excel с помощью пакета SSIS?
  • Может ли макрос (Excel) обрабатываться ssis?
  • Давайте будем гением компьютера.