在C#中关闭Excel应用程序进程后访问数据

98
我正在使用C#编写一个应用程序,该程序打开一个Excel模板文件进行读/写操作。我希望当用户关闭应用程序时,Excel应用程序进程已关闭,且不保存Excel文件。在多次运行应用程序后查看我的任务管理器。
我使用以下代码打开Excel文件:
public Excel.Application excelApp = new Excel.Application();
public Excel.Workbook excelBook;
excelBook = excelApp.Workbooks.Add(@"C:/pape.xltx");

我使用以下代码来访问数据:

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

我在stackoverflow上看到了类似的问题,比如这个问题这个问题,以及测试答案,但都不起作用。


1
Excel和Word非常慢,并且存在许多怪癖,例如您遇到的问题。这些文件是带有一些XML和其他内容的zip文件。还有Open XML SDK(或者可能是更近期的东西)可以打开文档。这样的代码也可以在本地没有安装Office的情况下工作。考虑不使用Excel。 - Sten Petrov
22个回答

-1
        GetWindowThreadProcessId((IntPtr)app.Hwnd, out iProcessId);
        wb.Close(true,Missing.Value,Missing.Value);
        app.Quit();
        System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("Excel");
        foreach (System.Diagnostics.Process p in process)
        {
            if (p.Id == iProcessId)
            {
                try
                {
                    p.Kill();
                }
                catch { }
            }
        }
}
[DllImport("user32.dll")]

private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

uint iProcessId = 0;

这个 GetWindowThreadProcessId 函数可以找到正确的 Excel 进程 ID,然后将其关闭。祝您使用愉快!


-1
private void releaseObject(object obj)
{
    try
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
        obj = null;
    }
    catch (Exception ex)
    {
        obj = null;
        MessageBox.Show("Unable to release the Object " + ex.ToString());
    }
    finally
    {
        GC.Collect();
    }
}

尽管这段代码可能解决了问题,但是包括一种解释的说明(https://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers),即如何以及为什么解决了这个问题,将有助于提高您帖子的质量,并可能导致更多的赞。请记住,您正在为未来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释,并指出适用的限制和假设。 - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接