96 votes

Fermeture du processus d'application d'Excel en C# après l'accès aux données

J'écris une application en C# qui ouvre un fichier modèle Excel pour des opérations de lecture/écriture. Je veux que lorsque l'utilisateur ferme l'application, le processus de l'application Excel ait été fermé, sans sauvegarder le fichier Excel. Voir mon gestionnaire de tâches après plusieurs exécutions de l'application.

enter image description here

J'utilise ce code pour ouvrir le fichier excel :

public Excel.Application excelApp = new Excel.Application();
public Excel.Workbook excelBook;
excelBook = excelApp.Workbooks.Add(@"C:/pape.xltx");

et pour l'accès aux données j'utilise ce code :

Excel.Worksheet excelSheet = (Worksheet)(excelBook.Worksheets[1]);
excelSheet.DisplayRightToLeft = true;
Range rng;
rng = excelSheet.get_Range("C2");
rng.Value2 = txtName.Text;

Je vois des questions similaires dans stackoverflow telles que cette question y este et les réponses aux tests, mais ça ne marche pas.

4voto

Kenneth Wong Points 41

J'ai rencontré les mêmes problèmes et j'ai essayé plusieurs méthodes pour les résoudre mais ça ne marche pas. Finalement, j'ai trouvé la solution à ma façon. Quelques références Entrez la description du lien ici

J'espère que mon code pourra aider quelqu'un à l'avenir. J'ai passé plus de deux jours à le résoudre. Voici mon code :

//get current in useing excel
            Process[] excelProcsOld = Process.GetProcessesByName("EXCEL");
            Excel.Application myExcelApp = null;
            Excel.Workbooks excelWorkbookTemplate = null;
            Excel.Workbook excelWorkbook = null;
try{
    //DO sth using myExcelApp , excelWorkbookTemplate, excelWorkbook
}
catch (Exception ex ){
}
finally
            {
                //Compare the EXCEL ID and Kill it 
                Process[] excelProcsNew = Process.GetProcessesByName("EXCEL");
                foreach (Process procNew in excelProcsNew)
                {
                    int exist = 0;
                    foreach (Process procOld in excelProcsOld)
                    {
                        if (procNew.Id == procOld.Id)
                        {
                            exist++;
                        }
                    }
                    if (exist == 0)
                    {
                        procNew.Kill();
                    }        
                }
            }

2voto

J'ai découvert qu'il est important d'avoir Marshal.ReleaseComObject dans un While boucle ET terminer avec Collecte des ordures .

static void Main(string[] args)
{
    Excel.Application xApp = new Excel.Application();
    Excel.Workbooks xWbs = xApp.Workbooks;
    Excel.Workbook xWb = xWbs.Open("file.xlsx");

    Console.WriteLine(xWb.Sheets.Count);

    xWb.Close();
    xApp.Quit();

    while (Marshal.ReleaseComObject(xWb) != 0);
    while (Marshal.ReleaseComObject(xWbs) != 0);
    while (Marshal.ReleaseComObject(xApp) != 0);

    GC.Collect();
    GC.WaitForPendingFinalizers();
}

1voto

user2605046 Points 29
excelBook.Close();
excelApp.Quit();

ajouter la fin du code, cela pourrait être suffisant. cela fonctionne sur mon code

1voto

qwfddq Points 41

La bonne façon de fermer tous les processus excel

var _excel = new Application();
foreach (Workbook _workbook in _excel.Workbooks) {
    _workbook.Close(0);
}

_excel.Quit();
_excel = null;

En utilisant l'exemple du processus, cela peut fermer tous les processus excel indépendamment.

var process = System.Diagnostics.Process.GetProcessesByName("Excel");
foreach (var p in process) {
    if (!string.IsNullOrEmpty(p.ProcessName)) {
        try {
            p.Kill();
        } catch { }
    }
}

1voto

Alican Kuklaci Points 11

Vous pouvez tuer le processus avec votre propre COM objet excel pid

ajouter quelque part en dessous du code d'importation de la dll

[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowThreadProcessId(IntPtr hwnd, ref int lpdwProcessId);

et utiliser

 if (excelApp != null)
            {
                int excelProcessId = -1;
                GetWindowThreadProcessId(new IntPtr(excelApp.Hwnd), ref excelProcessId);

                Process ExcelProc = Process.GetProcessById(excelProcessId);
                if (ExcelProc != null)
                {
                    ExcelProc.Kill();
                }
            }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X