1

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

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

  1. 如果它是open,我想直接从中读取。
  2. 如果它没有打开,我想打开它并从中读取。

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

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

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

请帮助我是 C# 的新手。

4

2 回答 2

2

如果我理解正确,您实际上想查找此 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 应用程序的单个实例,然后可以从 App.Workbooks 中检索所有打开的工作簿,但是,它有时会引发一些异常(不知道为什么,但我之前确实遇到过)。

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

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

于 2013-08-01T08:35:00.700 回答
-1

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

        /// <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-Files。

于 2013-08-01T08:18:44.593 回答