Próbuję użyć C# z biblioteką Interop COM, aby otworzyć zestaw bardzo ciężkich skoroszytów programu Excel. Muszę użyć C#, ponieważ muszę również uruchomić makra, przenieść niektóre komórki i uruchomić niestandardowy dodatek excel-add-in, którego używa moja firma.Automatyzacja C# Excel powoduje przeciek pamięci Excela
Mój program następnie wychodzi, pozostawiając otwarte skoroszytów, każdy w osobnej wersji programu Excel. NIE chcę, aby skoroszyty zostały zamknięte po wyjściu programu.
Problem polega na tym, że po wyjściu mojego programu C# z czasem skoroszyt programu Excel stopniowo zużywa więcej pamięci, aż pobiera 3,5 GB pamięci z oryginalnego 500 MB.
Kiedyś otwierałem skoroszyty ręcznie, a arkusze nigdy nie zużywały tak dużo pamięci. Kiedy zacząłem je otwierać za pomocą C#, zaczęły się łamać z powodu ekstremalnego wykorzystania pamięci. Moja teoria jest taka, że kiedy wchodzę w interakcję z obiektem COM Excel, tworzę przeciek pamięci.
Poniżej jest mój oryginalny kod:
using Excel = Microsoft.Office.Interop.Excel;
...
excelApp = new Excel.Application();
excelApp.Visible = true;
excelApp.Workbooks.Open(filename, misValue, misValue, misValue, misValue, misValue,
true, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue);
excelApp.Calculation = Excel.XlCalculation.xlCalculationAutomatic;
czytałem o tym, jak trzeba korzystać z marszałkiem zwolnić zastosowań, więc jestem teraz próbuje poniższy kod, ale nie ma łatwego sposobu, aby go przetestować, inne niż otwarcie wszystkich arkuszy i sprawdzenie, czy zużywają zbyt dużo danych.
excelApp = new Excel.Application();
excelApp.Visible = true;
Excel.Workbooks currWorkbooks = excelApp.Workbooks;
Excel.Workbook currWorkbook = currWorkbooks.Open(filename, misValue, misValue, misValue, misValue, misValue,
true, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue);
//excelApp.Calculation = Excel.XlCalculation.xlCalculationAutomatic;
int x = Marshal.ReleaseComObject(currWorkbook);
currWorkbook = null;
int y = Marshal.ReleaseComObject(currWorkbooks);
currWorkbooks = null;
Już ustawiłeś currWorkbook na wartość null .. więc dlaczego robisz to dwa razy. również Mashal.ReleaseComObject (currWorkBook) to wszystko, czego potrzebujesz, aby spróbować przypisać Int do sprawdzenia, czy obiekt został zwolniony, czy też nie. Czy otrzymujesz jakiekolwiek błędy? – MethodMan
Nie otrzymuję żadnych błędów. Problem polega na tym, że skoroszyty podręczne zostały uruchomione w ten sposób, powoli zużywają coraz więcej pamięci. – user804649
Możesz chcieć sprawdzić EPPlus (http://epplus.codeplex.com/). Nie jestem pewien, jaki rodzaj obsługi makr ma wsparcie (wspomina o VBA jako funkcji), ale ogólnie rzecz biorąc, uważam, że EPPlus jest znacznie bardziej wydajny i mniej podatny na awarie niż Excel Interop. – devuxer