Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Почему после завершения работы с Excel из C# Excel остаётся в памяти?

548
11 сентября 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
Мне нужно сохранить в таблицу Excel данные. Они сохраняются нормально. При завершении работы компьютера появляется сообщение типа хотите ли вы сохранить изменения в worksheet? Ниже приведён мой код
Код:
public void ExportToExcel(string fileName, object[,] data, uint startPosition, uint count)
        {
            lock (this)
            {
                if (string.IsNullOrEmpty(fileName))
                {
                    throw new ApplicationException("File name can't be null or empty.");
                }
                if (data == null)
                {
                    throw new NullReferenceException("Data can't be null.");
                }
                else if (data.Length == 0)
                {
                    throw new ApplicationException("No data.");
                }
                if (startPosition + count > data.GetLength(0))
                {
                    throw new ApplicationException(string.Format("You try to use {0} rows whereas data array contains {1} rows.", (startPosition + count), data.GetLength(0)));
                }

                // This lines requires Excel application for own start.
                CultureInfo oldCI = Thread.CurrentThread.CurrentCulture;
                Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

                Application excelApplication = new Application();
                if (excelApplication == null)
                {
                    QuitFromExcel(fileName, oldCI, excelApplication, null, null);
                    throw new ApplicationException("EXCEL couldn't be started!");
                }
                Workbooks workbooks = excelApplication.Workbooks;
                _Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
                Sheets sheets = workbook.Worksheets;
                _Worksheet worksheet = (_Worksheet)sheets.get_Item(1);
                if (worksheet == null)
                {
                    QuitFromExcel(fileName, oldCI, excelApplication, workbook, worksheet);
                    throw new ApplicationException("Worksheet == null.");
                }
                try
                {
                    AddToExcelColumnsTitles(worksheet);
                    FillExcelTable(data, startPosition, count, worksheet);
                }
                catch (ApplicationException exception)
                {
                    QuitFromExcel(fileName, oldCI, excelApplication, workbook, worksheet);
                    throw new ApplicationException(exception.Message);
                }
                QuitFromExcel(fileName, oldCI, excelApplication, workbook, worksheet);
            }
        }

        private void QuitFromExcel(string fileName, CultureInfo oldCI, Application excelApplication, _Workbook workbook, _Worksheet worksheet)
        {
            if (workbook != null)
            {
                workbook.SaveCopyAs(fileName);
                workbook.Close(false, "", Missing.Value);
            }
            if (excelApplication != null)
            {
                excelApplication.Quit();
                Marshal.ReleaseComObject(excelApplication);
            }
            workbook = null;
            worksheet = null;
            excelApplication = null;
            // This line requires Excel application. Such as CurrentCulture property was changed.
            Thread.CurrentThread.CurrentCulture = oldCI;
            GC.GetTotalMemory(true);
        }
6.0K
19 сентября 2008 года
Balda
79 / / 12.05.2008
Попробуйте очищать память так:
 
Код:
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApplication);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
842
21 сентября 2008 года
sigmov
301 / / 16.09.2008
Неправильное закрытие рабочей книги наверное.
Попробуйте:

COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
COleVariant covFalse((short)FALSE);

workbook.Close(covFalse, covOptional, covOptional);
workbook.ReleaseDispatch();
workbooks.Close();
workbooks.ReleaseDispatch();
excelApplication.Quit();
excelApplication.ReleaseDispatch();

Тогда сообщение о сохранении не должно вас беспокоить
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог