【发布时间】:2015-11-27 16:00:38
【问题描述】:
我有一个创建 excel 文件的 C# 应用程序。但是如果文件保持打开并且应用程序第二次运行,它会引发 IO 异常(因为在代码中我用新文件替换了现有文件) 现在,我想检查文件是否打开并终止引用该文件的 excel.exe 进程。 有什么办法可以实现吗?
注意:可能会打开多个 excel 文件。我只想关闭正在使用我的文件的进程。
xlFilePath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
File.Copy(xlFilePath + "\\file.xlsx", String.Format("{0}\\OutputFile{1}.{2}.xlsx", xlFilePath, DateTime.Now.Year, DateTime.Now.Month), true);
xlFilePath = Path.Combine(xlFilePath, String.Format("{0}\\OutputFile{1}.{2}.xlsx", xlFilePath, DateTime.Now.Year, DateTime.Now.Month));
appl = new Excel.Application(Visible = false);
wbookss = appl.Workbooks;
wbook = wbookss.Open(xlFilePath);
//Excel.Worksheets wsheetss = appl.Worksheets;
wsheet = wbook.Sheets["Sheet1"];
Application_GenerateReport(wsheet);
Clipboard.Clear();
wbook.Close(true);
wbookss.Close();
appl.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(wsheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wbookss);
System.Runtime.InteropServices.Marshal.ReleaseComObject(appl);
编辑:如果上次运行时出现异常,文件将保持打开状态。如果它是由用户打开的,则可以通过检查 MainWindowTitle 属性(正如 Yeldar 所建议的那样)将其杀死。
【问题讨论】:
-
我会说,我认为您从错误的角度解决问题。你的程序应该优雅地处理这个异常。也许有可能重试?这比试图将 Excel 发送到遗忘(接受任何潜在的用户更改)要好得多。 Plus Office 往往会用 “之前打开此文件时出现问题,请再次打开它?” 或类似 来唠叨您
-
^报告仅使用此应用生成,从未手动修改。
-
This post 描述了如何获取正在运行的 excel 实例。您应该考虑该实例而不是杀死它