9 / 9 / 1
Регистрация: 28.02.2013
Сообщений: 208
1

Правильное закрытие Excel

22.07.2014, 16:20. Показов 17106. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот так я открываю xls файл
C#
1
2
3
4
5
Excel.Application app = new Excel.Application();
            app.Workbooks.Open(Path.GetDirectoryName(Application.ExecutablePath) + "\\electronic_transfer.xls");
            Excel.Workbook book = app.ActiveWorkbook;
            Excel.Worksheet sheet = book.Worksheets[1];
            book.Application.DisplayAlerts = false;
Вот так завершаю
C#
1
2
3
4
5
6
7
app.Quit();
            app = null;
            book = null;
            sheet = null;
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
Все нормально, процесс excelя не висит, как ни странно, все работает. Только на другом ПК с такой же версией офиса(2010) и прочим каждый раз выскакивает сообщение "Прекращена работа программы Microsoft Excel". При закрытии окна все продолжает работу, но уж очень сильно напрягает. Есть соображения?
Просто убивать процесс пробовал - такая же ситуация.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2014, 16:20
Ответы с готовыми решениями:

Закрытие книги Excel без запроса на сохранение
Excel.Application xlApp = new Excel.Application(); //Excel Excel.Workbook xlWB; //рабочая книга ...

Правильное закрытие соединения с БД
Приветствую! Мужики, подскажите, как правильно? Так: if ($result->num_rows == 0){ ...

Правильное закрытие курсора
Как правильно закрыть Cursor? Если делать так: .... String from = {"name","count"}; intto...

Правильное закрытие страниц сайта
Интересует следующее. Стоит скрипт который все внешние ссылки реализовывает в вид...

12
40 / 40 / 16
Регистрация: 07.08.2012
Сообщений: 187
22.07.2014, 16:39 2
C#
1
2
  excelappworkbook.Save();
  excelapp.Quit();
0
9 / 9 / 1
Регистрация: 28.02.2013
Сообщений: 208
22.07.2014, 16:58  [ТС] 3
С сохранением тоже самое
0
40 / 40 / 16
Регистрация: 07.08.2012
Сообщений: 187
22.07.2014, 17:05 4
На какой строке ругается?
Попробуй варьировать строки Save и Visible
C#
1
2
3
4
            excelappworkbooks = excelapp.Workbooks;
            excelappworkbook = excelappworkbooks[1];
            excelappworkbook.Save();
            excelapp.Visible = true;
0
9 / 9 / 1
Регистрация: 28.02.2013
Сообщений: 208
22.07.2014, 17:29  [ТС] 5
Не могу сказать на какой строке, потому что на моем компе, где проект ничего не выскакивает.
Как я уже ни пробовал, всегда при закрытии выскакивает на других компах
0
40 / 40 / 16
Регистрация: 07.08.2012
Сообщений: 187
22.07.2014, 17:41 6
try catch в помощь с
C#
1
2
3
4
5
6
  
Message.Box("Record Close");
excelappworkbook.Save();
Message.Box("Save");
  excelapp.Quit();
Message.Box("Quit");
Смысл прост - какое сообщение не выдаст, там и копать
Как вариант - отрыть книгу Excel, ничего в нее не записывать и закрыть

Еще вариант отрытия/закрытия Excel
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
excelapp = new Excel.Application();
            Object missing = Type.Missing;
            excelapp.Visible = false;
            //Получаем набор ссылок на объекты Workbook
            excelappworkbooks = excelapp.Workbooks;
            //Открываем книгу и получаем на нее ссылку
            excelappworkbook = excelapp.Workbooks.Open(WorkCat,
                               Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
              Type.Missing, Type.Missing, Type.Missing, Type.Missing,
              Type.Missing, Type.Missing);
            //Получаем массив ссылок на листы выбранной книги
            excelsheets = excelappworkbook.Worksheets;
            //Получаем ссылку на лист 1
            excelworksheet = (Excel.Worksheet)excelsheets.get_Item(1);
//....
//....
 
            excelappworkbooks = excelapp.Workbooks;
            excelappworkbook = excelappworkbooks[1];
            excelappworkbook.Save();
            excelapp.Visible = true; //показываем документ пользователю
//excelapp.Quit(); //либо закрытие
0
Master of Orion
Эксперт .NET
6099 / 4955 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.07.2014, 18:16 7
goremukin, пример освобождения:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
       workBook.Close(true, filePathTarget, Missing.Value);
        app.DisplayAlerts = true;
        app.Quit();
        Release(workSheet2);
        Release(workSheet1);
        Release(workBook);
        Release(workBooks);
        Release(app);
        workSheet2 = null;
        workSheet1 = null;
        workBook = null;
        workBooks = null;
        app = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();
метод Release:
C#
1
2
3
4
5
6
7
8
private static void Release(object obj) {
        // Errors are ignored per Microsoft's suggestion for this type of function:
        // [url]http://support.microsoft.com/default.aspx/kb/317109[/url]
        try {
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj);
        } catch {
        }
    }
соответственно вызываете его для всех объектов, которые создаете в программе.

Добавлено через 2 минуты
однако я советую использовать EPPlus вместо Interop. Намного симпатичнее выглядит:
C#
1
2
3
4
5
6
7
8
9
10
        using (ExcelPackage package = new ExcelPackage())
        {
            ExcelWorksheet ws = package.Workbook.Worksheets.Add("testsheet");
 
            ws.Cells["B1"].Value = "Number of Used Agencies";
            ws.Cells["C1"].Value = "Active Agencies";
            ws.Cells["D1"].Value = "Inactive Agencies";
            ws.Cells["E1"].Value = "Total Hours Volunteered";
            package.Save();
         }
2
9 / 9 / 1
Регистрация: 28.02.2013
Сообщений: 208
22.07.2014, 22:18  [ТС] 8
try catch в помощь с
я думаю, что ничего try и catch не даст, потому что сообщение от windows, а программа работает.

Добавлено через 16 минут
Цитата Сообщение от Psilon Посмотреть сообщение
пример освобождения:
таким образом всегда остается висеть процесс excel.exe, поэтому я сделал так:
C#
1
2
3
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
по неизвестным мне причинам так процесс закрывается)

C#
1
app.DisplayAlerts = true;
убрал, а то запросы на сохранение файла все время выскакивают

C#
1
app.WorkBooks = null; //ругается, поэтому убрал
Завтра посмотрю будет ли табличка "прекращена работа.." на другом компьютере

Цитата Сообщение от Psilon Посмотреть сообщение
EPPlus
нужно будет попробовать) уже второй раз мне помогаешь)
1
Master of Orion
Эксперт .NET
6099 / 4955 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.07.2014, 23:17 9
goremukin, таким образом он закрывается, потому что сборщик удаляет объекты с финализатором в 2 прохода. Поэтому, собственно, и нужно использтвать using везде, где только можно. Тогда одной сборки достаточно.
1
9 / 9 / 1
Регистрация: 28.02.2013
Сообщений: 208
23.07.2014, 12:58  [ТС] 10
Эх, все-равно с каждым закрытием екселя вылазит это окно(
0
Master of Orion
Эксперт .NET
6099 / 4955 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.07.2014, 13:58 11
Лучший ответ Сообщение было отмечено goremukin как решение

Решение

goremukin, ну и хорошо, значит, EPPlus вас ждет

А то знакомо, реализуешь что-то, а потом переписывать лень, работает же А тут стимул...
1
9 / 9 / 1
Регистрация: 28.02.2013
Сообщений: 208
23.07.2014, 18:22  [ТС] 12
У меня есть 4 бланка в excel. По необходимости я некоторые открываю, работаю с ними, вывожу на печать и закрываю. И вот при закрытии происходит такая беда. Поэтому я решил тупо при запуске программы открыть в ней все 4 бланка, а потом при нажатии на баттоны заполнять, выводить на печать и все) 4 процесса excel не сильно загрузят систему ведь?)
0
Master of Orion
Эксперт .NET
6099 / 4955 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.07.2014, 19:49 13
goremukin, если 100% будет работа с 4 бланками, то не страшно.
1
23.07.2014, 19:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2014, 19:49
Помогаю со студенческими работами здесь

Правильное закрытие окна по ESC
Есть прекрасно работающий код, который я нашел где-то в дебрях инета. // Это надо прописать в...

Правильное открытие, закрытие соединения
Приветствую. Знаю что этот вопрос уже затёрт до дыр, знаю что соединение требует много ресурсов....

Правильное закрытие от индексации Внешних ссылок
Правильное закрытие от индексации ВС, для этого мне ненужную ссылку на сайте оформлять так?

Правильное создание UserForm в Excel
Господа, всем респ!!! Помогите.... Нужно сделать анкету в excel? но чтоб она была...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru