C# 如何在特定excel文件已打开时自动关闭该文件(而不关闭excel)?

C# 如何在特定excel文件已打开时自动关闭该文件(而不关闭excel)?,c#,excel,C#,Excel,是否可以在excel文件已打开时关闭它?我编写了一段代码,可以确定某个特定excel文件是否已打开,但一旦确定该文件已打开,我就无法关闭该文件。我尝试了以下方法(见下文)关闭工作簿和excel应用程序: //我的工作簿名为“工作簿”,而Excel应用程序名为“Excel”。 工作簿。关闭(true); excel.Quit() 执行后一个代码不会关闭已打开的Excel窗口。了解我用于确定文件是否打开的代码也可能会有所帮助(如下所示): 同样,我无法创建一个“杀死Excel”的程序。如果已经打开

是否可以在excel文件已打开时关闭它?我编写了一段代码,可以确定某个特定excel文件是否已打开,但一旦确定该文件已打开,我就无法关闭该文件。我尝试了以下方法(见下文)关闭工作簿和excel应用程序:


//我的工作簿名为“工作簿”,而Excel应用程序名为“Excel”。
工作簿。关闭(true); excel.Quit()

执行后一个代码不会关闭已打开的Excel窗口。了解我用于确定文件是否打开的代码也可能会有所帮助(如下所示):


同样,我无法创建一个“杀死Excel”的程序。如果已经打开的Excel窗口的路径与我尝试读取和写入的路径相同,我只需要知道如何关闭该窗口。

请查看以下示例代码:-

using Excel = Microsoft.Office.Interop.Excel;

Excel.Application exl = new Excel.Application();

# open a file
Excel.Workbook wbook = exl.Workbooks.Open("some_file.xlsx");

# To close the file
wbook.Close();

exl.Quit();
编辑1:-

如果上述解决方案不适用于您,您可以参考以下链接:-


您可以使用Windows API,根据某个窗口的标题关闭该窗口

这将调用窗口关闭,因此它将提示用户是否确实要关闭:

using System.Runtime.InteropServices;

...

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

const UInt32 WM_CLOSE = 0x0010;
然后

IntPtr windowPtr = FindWindowByCaption(IntPtr.Zero, "MyFile.xlsx - Excel");
if (windowPtr == IntPtr.Zero)
{
     MessageBox.Show("Document not open");
     return;
}

SendMessage(windowPtr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
如果需要强制关闭,即使文件已被修改,也只能终止相关的excel进程。但请记住,如果其他excel窗口运行在同一个excel流程实例中,这也将强制杀死它们

  using System.Diagnostics;
  ...
  Process[] processes = Process.GetProcesses();

  foreach (Process p in processes)
  {
      if (p.MainWindowTitle == "MyFile.xlsx - Excel")
      {
          p.Kill();
          break;
      }
  }

你已经试过这个了吗?.close()命令不关闭已打开的文件;这就是我在这个主题上找到的所有解决方案(包括您刚才推荐的解决方案)中主要关注的内容。可能重复的内容并不相同,因为我无法“杀死Excel”,这是您链接的主要解决方案所推荐的。另外,使用.close()或.quit()不会从屏幕中删除已打开的Excel文件。使用.close()和.quit()命令不会关闭已打开的Excel文件。我想关闭已经打开的文件。有没有办法关闭Excel窗口而不提示用户,也不关闭Excel。谢谢你的帮助。
  using System.Diagnostics;
  ...
  Process[] processes = Process.GetProcesses();

  foreach (Process p in processes)
  {
      if (p.MainWindowTitle == "MyFile.xlsx - Excel")
      {
          p.Kill();
          break;
      }
  }