none
监听Excel文件关闭 RRS feed

  • 问题

  • 咨询个问题,excel文件是通过C#程序打开的,我想在该文件关闭的时候能够监听到,各位大神有没有好的方法,谢谢。
    2016年12月8日 2:35

答案


  • Hi  鲁大宝,

    使用Process类进行监测。 当你打开一个excelApp的时候,获取Process Id,然后为这个进行添加Exited关闭事件。这样当你关闭此进程时,会触发关闭事件。

    [DllImport("User32.dll", CharSet = CharSet.Auto)]
            public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
    
            private Process[] MyProcesses;
            private void button_Click(object sender, RoutedEventArgs e)
            {
                Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
                excelApp.Visible = true;
                //得到WorkBook对象,打开已有的文件
                Microsoft.Office.Interop.Excel.Workbook excelBook = excelApp.Workbooks._Open(
    @"d:\helloxls.xls"
    );
                //指定要操作的Sheet
                Microsoft.Office.Interop.Excel.Worksheet excelSheet = (Microsoft.Office.Interop.Excel.Worksheet)excelApp.ActiveSheet;
                //这里可以加一些对于文件的操作
                excelSheet = null;
                excelBook = null;
                excelSheet = null;
                excelBook = null;
                //这一句是非常重要的,否则Excel对象不能从内存中释
                //如果只是实现打开文件,等待用户操作Excel文件,可以去掉,让用户自己关闭文件时自动释放Excel对象内存
                //这个方法没找到
                //excelBook.Quit();
                excelBook = null;
    
    
                int ExcelID = 0;
                IntPtr intPtr = new IntPtr(excelApp.Hwnd);
                GetWindowThreadProcessId(intPtr, out ExcelID); //得到本进程唯一标志k
    
                MyProcesses = Process.GetProcessesByName("EXCEL");//需要监控的程序名,该方法带出该程序所有用到的进程
                foreach (Process myprocess in MyProcesses)
                {
                    if (myprocess.ProcessName.ToUpper() == "EXCEL")
                    {
                        if (myprocess.Id == ExcelID)
                        {
                            MessageBox.Show("EXCEL");
                            myprocess.EnableRaisingEvents = true;//设置进程终止时触发的时间
                            myprocess.Exited += new EventHandler(myprocess_Exited);//发现外部程序关闭即触发方法myprocess_Exited
                         
                        }
                    }
                }
            }
    
            private void myprocess_Exited(object sender, EventArgs e)//被触发的程序
            {
                MessageBox.Show("EXCEL close");
            }
    
    

    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 鲁大宝 2016年12月8日 8:25
    2016年12月8日 8:19
    版主

全部回复

  • 用是什么方法打开的Excel文件的?

    如果用进程(Process)方式,可以阻塞直到进程关闭即可知道文件被关闭。

    var process = Process.Start(...);
    process.WaitForExit();

    完整例子

    Process process = new Process();
    process.StartInfo.FileName = executable;
    process.StartInfo.Arguments = arguments;
    process.StartInfo.ErrorDialog = true;
    process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
    process.Start();
    process.WaitForExit(1000 * 60 * 5);    // Wait up to five minutes.


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年12月8日 5:12
  • 是用下面这个方法打开的

    Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();

                excelApp.Visible = true;
                //得到WorkBook对象,打开已有的文件
                Microsoft.Office.Interop.Excel.Workbook excelBook = excelApp.Workbooks._Open(

    @"e:\excel.xls"

    );
                //指定要操作的Sheet
                Microsoft.Office.Interop.Excel.Worksheet excelSheet = (Microsoft.Office.Interop.Excel.Worksheet)excelApp.ActiveSheet;
                //这里可以加一些对于文件的操作
                excelSheet = null;
                excelBook = null;
                excelSheet = null;
                excelBook = null;
                //这一句是非常重要的,否则Excel对象不能从内存中释
                //如果只是实现打开文件,等待用户操作Excel文件,可以去掉,让用户自己关闭文件时自动释放Excel对象内存
                //这个方法没找到
                //excelBook.Quit();
                excelBook = null;

    2016年12月8日 6:22

  • Hi  鲁大宝,

    使用Process类进行监测。 当你打开一个excelApp的时候,获取Process Id,然后为这个进行添加Exited关闭事件。这样当你关闭此进程时,会触发关闭事件。

    [DllImport("User32.dll", CharSet = CharSet.Auto)]
            public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
    
            private Process[] MyProcesses;
            private void button_Click(object sender, RoutedEventArgs e)
            {
                Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
                excelApp.Visible = true;
                //得到WorkBook对象,打开已有的文件
                Microsoft.Office.Interop.Excel.Workbook excelBook = excelApp.Workbooks._Open(
    @"d:\helloxls.xls"
    );
                //指定要操作的Sheet
                Microsoft.Office.Interop.Excel.Worksheet excelSheet = (Microsoft.Office.Interop.Excel.Worksheet)excelApp.ActiveSheet;
                //这里可以加一些对于文件的操作
                excelSheet = null;
                excelBook = null;
                excelSheet = null;
                excelBook = null;
                //这一句是非常重要的,否则Excel对象不能从内存中释
                //如果只是实现打开文件,等待用户操作Excel文件,可以去掉,让用户自己关闭文件时自动释放Excel对象内存
                //这个方法没找到
                //excelBook.Quit();
                excelBook = null;
    
    
                int ExcelID = 0;
                IntPtr intPtr = new IntPtr(excelApp.Hwnd);
                GetWindowThreadProcessId(intPtr, out ExcelID); //得到本进程唯一标志k
    
                MyProcesses = Process.GetProcessesByName("EXCEL");//需要监控的程序名,该方法带出该程序所有用到的进程
                foreach (Process myprocess in MyProcesses)
                {
                    if (myprocess.ProcessName.ToUpper() == "EXCEL")
                    {
                        if (myprocess.Id == ExcelID)
                        {
                            MessageBox.Show("EXCEL");
                            myprocess.EnableRaisingEvents = true;//设置进程终止时触发的时间
                            myprocess.Exited += new EventHandler(myprocess_Exited);//发现外部程序关闭即触发方法myprocess_Exited
                         
                        }
                    }
                }
            }
    
            private void myprocess_Exited(object sender, EventArgs e)//被触发的程序
            {
                MessageBox.Show("EXCEL close");
            }
    
    

    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 鲁大宝 2016年12月8日 8:25
    2016年12月8日 8:19
    版主
  • 非常感谢
    2016年12月8日 8:25