Problem z Excelem - po zamknięciu, proces dalej trwa.

0

Hej!

Kombinowałem na różne sposoby i niestety nie potrafię znaleźć przyczyny mojego problemu.
Otwieram aplikację Excela:

             string _serverFilePath = "....";
            string _destinationFilePath = string.Format(@"C:\{0}.xls", "...");
            System.IO.FileInfo fs = new System.IO.FileInfo(_serverFilePath);
            if (fs.Exists)
                fs.CopyTo(_destinationFilePath, true);
            else
                return;

            Application aEx = new Application();
            Workbook wb = aEx.Workbooks.Open(_destinationFilePath);
            aEx.Visible = true;

Excel poprawnie otwiera plik. Użytkownik zapisuje (lub nie) zmiany i zamyka aplikację.
Niestety proces dalej trwa i nie ma ochoty zamknąć się samoistnie. Jak sprawić, aby aplikacja została w pełni zamknięta?

Moja aplikacja służy tylko do otwierania określonego pliku Excela, robi tam pewne zmiany i tyle. Dlatego też zamykanie procesu Excela z poziomu formy nie jest możliwe, ponieważ użytkownik może chcieć dokonać jakiś zmian w przerobionym arkuszu.

0

a jak na końcu dodasz aEx = null; ?

0

Sprawdz to:
oWB.Close();
oExcel.Quit();
oExcel.Application.Quit();
Excel zniknie z pamięci po zamknięciu aplikacji która go wywołała.

0

Opiszę nieco bardziej schemat działania.

Piszę dodatek do AutoCADa. Ładuję swoją bibliotekę, odpalam metodę:

 public static void ShowSpecificationForm()
        {
            GPSpecification gpspec = new GPSpecification();
            gpspec.Show();
        }

Na formie mam przycisk ze zdarzeniem:

private void btnSelectBlocks_Click(object sender, EventArgs e)
        {
            this.Hide();
            GEX.DoExcel(idArray, drawingParams.ToList<string>());
            this.Show();
        }
 

Po naciśnięciu przycisku tak naprawdę nie potrzebuję już mojej formy (poprzednio zamiast Hide miałem Close).
Zrobiłem teraz tak, że ukrywam, użytkownik zaznacza obszar w AutoCADzie, Excel robi swoje, Excel się pokazuje, moja forma również.
I teraz tak - jeśli najpierw zamknę Excela, a później formę, to proces znika. Jeśli zamknę wcześniej formę, a później Excela, to proces dalej tkwi na liście.

Mogę sobie z tym poradzić poprzez szukanie procesu Excela z pustym tytułem, ale szukam bardziej schludnego rozwiązania mojego problemu.

Na razie zdiagnozowałem, że problem tkwi w tym, iż przed zamknięciem Excela zamyka się forma, która Excela wywołała.

@Zoritt
Nie mogę zamykać "ręcznie" Excela. Arkusz, który się pokaże musi być widoczny dla użytkownika dopóty, dopóki on sam go nie zamknie.

1

dodałeś aEx = null; po wywołaniu excela?

0
abrakadaber napisał(a):

dodałeś aEx = null; po wywołaniu excela?

Oprócz
aEx=null;
dodałem także
System.GC.Collect();
i wydaje się, że działa teraz dobrze :)

2

Może warto też poczytać o interface IDisposable, szczegołnie podczas pracy z plikami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1