c# - Excel 自动化 : Close event missing

标签 c# excel events interop

大家好,

我在 C# 中通过 Interop 实现 Excel 自动化,我想在工作簿关闭时收到通知。但是,工作簿上没有关闭事件,应用程序上也没有退出事件。

有人做过吗? 我如何编写一段代码来响应正在关闭的工作簿(仅在工作簿真正关闭时才执行)?理想情况下,这应该发生在之后 关闭工作簿,这样我就可以依靠文件来反射(reflect)所有更改。

到目前为止我发现的详细信息:

有一个 BeforeClose() 事件,但如果有未保存的更改,则在询问用户是否保存它们之前引发此事件,所以目前我可以处理该事件,我没有最终文件和我无法释放 COM 对象,这都是我需要拥有/做的事情。我什至不知道工作簿是否真的会关闭,因为用户可能会选择中止关闭。

然后是BeforeSave()事件。因此,如果用户选择"is"来保存未保存的更改,则在 BeforeClose()之后执行 BeforeSave()。但是,如果用户选择“中止”,然后点击“文件 -> 保存”,则会执行完全相同的事件顺序。此外,如果用户选择“否”,则根本不会执行 BeforeSave()。只要用户不点击这些选项中的任何一个,这同样适用。

最佳答案

我使用类似轮询的方法创建了一个 hack,并且它有效:

鉴于要观察的工作簿,我创建了一个线程,该线程定期尝试在工作簿集合中查找该工作簿。

(DisposableCom 类是我当前对 properly cleanup COM objects 的解决方案。)

Excel.Application app = wbWorkbook.Application;
string sWorkbookName = wbWorkbook.Name;

Thread overseeWorkbooksThread = new Thread(new ThreadStart(
    delegate()
    {
        bool bOpened = false;

        Excel.Workbooks wbsWorkbooks = app.Workbooks;
        using (new DisposableCom<Excel.Workbooks>(wbsWorkbooks))
        {
            while (true)
            {
                Thread.Sleep(1000);

                if (wbsWorkbooks.ContainsWorkbookProperly(sWorkbookName))
                    bOpened = true;
                else
                    if (bOpened)
                        // Workbook was open, so it has been closed.
                        break;
                    else
                    {
                        // Workbook simply not finished opening, do nothing
                    }
            }

            // Workbook closed
            RunTheCodeToBeRunAfterWorkbookIsClosed();
        }
    }));

overseeWorkbooksThread.Start();

“ContainsWorkbookProperly”扩展方法如下所示:

public static bool ContainsWorkbookProperly(this Excel.Workbooks excelWbs,
    string sWorkbookName)
{
    Excel.Workbook wbTemp = null;
    try
        wbTemp = excelWbs.Item(sWorkbookName);
    catch (Exception)
    {
        // ignore
    }

    if (wbTemp != null)
    {
        new DisposableCom<Excel.Workbook>(wbTemp).Dispose();
        return true;
    }

    return false;
}

如果有更简单或更好的解决方案,我仍然会感兴趣。

关于c# - Excel 自动化 : Close event missing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2767439/

相关文章:

excel - 尽管链接值未更改,MS Excel 2013 链接数据公式仍恢复为值 #REF

html - upvote/downvote 箭头如何将操作提交给 Stack Overflow?

javascript - 如何为 NodeJS 中的事件扩展对象文字对象?

c# - Newtonsoft Json反序列化: How to throw an error if/when the given json string has MORE properties than necessary?

c# - 绑定(bind)行选择

c# - Api 上的 Umbraco Imagegen GetCropUrl

c++ - 通过 OLE 自动化从 C++ 应用程序运行存储在 Excel 工作簿中的指定宏

c# - OleDb Excel 加入来自 c# 的未命名列

python - 如何自动将 excel 文件的类型从 Tab 空格分隔的文本更改为 xls 文件?

javascript - jQuery - 当类被删除时