如何检查excel工作簿已经在C#中打开

本文关键字:工作簿 何检查 检查 excel | 更新日期: 2023-09-27 18:25:56

我正在应用程序中打开多个excel文件。有些将在应用程序启动时自动打开,而有些则在运行时打开。

现在我想通过点击按钮从excel文件中获取数据。但在打开它之前,我想检查一下excel文件是否已经打开。

  1. 如果它是打开,我想直接从中读取
  2. 如果未打开,我想打开它并从中读取

但在这两种情况下,我都不想在阅读后关闭文件。"

我正在使用这种方法打开excel文件。

objExcel = new Excel.ApplicationClass();
objWorkbook = objExcel.Workbooks.Open(...);`

请帮帮我,我是C#的新手。

如何检查excel工作簿已经在C#中打开

如果我理解得很清楚,你实际上想知道这个winform应用程序是否已经打开了一些文件,对吧?

如果是这样的话,我认为它应该相当简单——只需将打开的工作簿缓存到某个字典中即可:

    static Dictionary<string, Workbook> _openedWorkBooks = new Dictionary<string, Workbook>();    
    public static Workbook GetWorkbook(string filePath)  {    
        Workbook wkb = null;    
        if (!(_openedWorkBooks.TryGetValue(filePath, out wkb)))    
        {
            // Open the file and store it into the dictionary    
        }
        return wkb;  
    }
    // remember to remove it when it's closed  
    public static CloseWorkbook()  
    {    // need to remove the corresponding key from the dictionary  
    }

此外,你也可以使用excel应用程序的单个实例,然后所有打开的工作簿都可以从应用程序中重新发布。然而,Workbooks有时会引发一些异常(不知道为什么,但我以前确实遇到过)。

            var app = new Microsoft.Office.Interop.Excel.Application();
            var bk1 = app.Workbooks.Open("c:'temp'myfile.xls");
            var allOpenBks = app.Workbooks;

实际上,调用IsFileLock方法来检查文件是否已被其他应用程序打开仍然是值得的,否则您可能会遇到一些错误。

如果您有读写访问权限,您可以检查k:

        /// <summary>
    /// Check wether a file is locked
    /// </summary>
    /// <param name="file"></param>
    /// <returns></returns>
    public static bool IsFileLocked(FileInfo file)
    {
        FileStream stream = null;
        try
        {
            stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
        }
        catch (IOException)
        {
            //the file is unavailable because it is:
            //still being written to
            //or being processed by another thread
            //or does not exist (has already been processed)
            return true;
        }
        finally
        {
            if (stream != null)
                stream.Close();
        }
        //file is not locked
        return false;
    }

该代码来自StackOverflow上的其他代码。

是否.xlsx?如果是这样,您可以使用OpenXML读取和写入Excel文件。