从 C# 启动 Excel 并在“保存”时将其关闭

Posted

技术标签:

【中文标题】从 C# 启动 Excel 并在“保存”时将其关闭【英文标题】:Launch Excel from C# and close it on "Save" 【发布时间】:2010-06-17 13:25:04 【问题描述】:

我想使用 C# 和 Microsoft Excel 执行以下操作:

1 - 用户选择一个文件。

2 - 显示 Microsoft Excel 以编辑该文件。

3 - 只要用户单击 Excel 的“保存”按钮,Microsoft Excel 就会关闭。用户不必单击退出。

关于#3 的任何想法?

问候, 塞巴斯蒂安

【问题讨论】:

你问的是如何做基本的 Excel 互操作还是只做 #3? 我不是 100% 确定这是一个很好的工作流程。如果我(作为您的用户)执行 1 和 2 并开始编辑文件会发生什么。我在完全完成编辑之前被召集参加会议,但我认为“我可能会离开一段时间,最好保存一下”。我愿意,巴姆! Excel 关闭 - 这根本不是我想要的。 【参考方案1】:

您可以让 Excel 宏处理 BeforeSave 事件,取消用户发起的保存,将文件保存在宏中,保存后您将在宏中,然后可以关闭 Excel。

所以可能是这样的:

Private Sub myBeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If Not HandlingBeforeSave Then
        HandlingBeforeSave = True
        Cancel = True
        Me.Save
        Application.Quit    
    End If
End Sub

This kb 文章描述了从 C# 向 Excel 添加宏。

【讨论】:

这可能会引发 ***。 @SLaks:为什么和哪一点?我原以为宏代码会没问题,他可以在托管代码启动并插入宏后立即关闭对 Excel 的任何引用,所以我会认为没问题? Me.Save 应该引发BeforeSave 事件。顺便说一句,您也可以在托管代码中执行此操作。 (没有宏) @SLaks:是的,没想到,需要检查方法的递归入口。【参考方案2】:

您也可以使用 FileSystemWatcher 类来赶上保存时间,并在其上杀死 Excel。当然,如果您知道用户必须保存文件的位置。

【讨论】:

【参考方案3】:

我的 Interop 有点生锈,但我认为 Excel 在保存文件时会触发一个事件。

但是,我认为这是一个非常危险的功能,因为根据我的经验,互操作往往有点不确定:)。想象一下,当用户在您的应用程序之外使用 Excel 时,如果保存处理程序处于活动状态会发生什么 - 他点击保存,Excel 消失!

【讨论】:

【参考方案4】:

您可以将 VSTO 用于 Excel。使您能够针对 Excel 对象模型编写 C# 代码。应该能够做你想做的事。

不过,SWeko 有一个很好的观点。您将需要弄清楚如何确定它是否应该在保存时关闭。如果不是每次保存都会关闭 Excel。

【讨论】:

【参考方案5】:

您可以处理WorkbookBeforeSave 事件,然后运行一个计时器,每十秒检查一次Saved 属性,如果是true,则关闭Excel。

关闭 Excel 时应小心谨慎,因为如果您关闭他们正在处理的(不同的)文件,您的用户会非常生气。

【讨论】:

【参考方案6】:

我不确定这是否有帮助,但我认为它接近您的需要 http://www.c-sharpcorner.com/UploadFile/jodonnell/Excel2003fromCSharp12022005021735AM/Excel2003fromCSharp.aspx

【讨论】:

【参考方案7】:

我遇到了类似的问题,但是我等到用户关闭 Excel。在Excel automation: Close event missing 上查看我的“解决方案”。

我发现当用户点击“保存”时关闭 Excel 有点不直观。如果您坚持“保存”事件,您可能希望在用户保存后立即观察文件元数据的变化(例如,最后修改日期)。

【讨论】:

以上是关于从 C# 启动 Excel 并在“保存”时将其关闭的主要内容,如果未能解决你的问题,请参考以下文章

html 在模态中打开YouTube视频,并在关闭模态时将其停止

在启动 C# .NET 时将文本加载到文本框中

Angular,body添加css溢出:如果模态打开则隐藏并在关闭时将其删除?

在使用 RxSwift 和 mvvm 发出 moya 请求时添加微调器,并在用户收到响应时将其关闭

每当我单击一个开关时,我都需要创建一个新对象,并在关闭时将其删除

javascript [在页面滚动上设置动画粘贴CTA]这将在滚动时为点击元素设置动画,并在用户点击时将其关闭。 #javascript #css #sitewre