2013-08-01 2 views
1

Я открываю несколько файлов excel в своем приложении. Некоторые из них будут автоматически открываться, когда приложение запускается, а некоторые открываются во время выполнения.Как проверить книгу excel уже открыта в C# win form

Теперь я хочу получить данные из файла excel при нажатии кнопки. Но прежде чем открыть его, я хочу проверить, что файл excel уже открыт.

  1. Если открытый, я хочу, чтобы читать из него непосредственно.
  2. если не открыт, я хочу открыть его и прочитать из него.

Но в обоих случаях я не хочу, чтобы закрыть файл после reading.`

Я использую этот метод, чтобы открыть файл первенствовать.

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

Пожалуйста, помогите Я новичок в C#.

+0

Возможный дубликат: http://stackoverflow.com/questions/6686886/how-to-access-an-already-opened-excel-file-in-c – Recipe

+0

Пример VBA: http://stackoverflow.com/questions/9373082/detect-ли-excel-workbook-is-open-use-vba –

+0

Еще одна проверка VBA: http://stackoverflow.com/questions/3156676/checking-if-an-excel-workbook-is-open – martin

ответ

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 
    } 

также, вы можете использовать один экземпляр приложения первенствовать тоже, а потом все открыто книга может быть зарегистрирована в App.Workbooks, однако иногда она иногда вызывает какое-то исключение (не знаю, почему, но я уже встречался раньше).

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

На самом деле это все еще стоит позвонить IsFileLock метод, чтобы проверить файл уже открыт в других приложениях, в противном случае вы можете столкнуться с некоторыми ошибками.

-1

Вы можете checkk, если у вас есть Read-Write доступ:

 /// <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.

Do .xlsx? Если это так, вы можете использовать для чтения и записи Excel-файлов OpenXML.

+2

Вы должны заверить другого человека тогда – Sayse

+0

Что вы имеете в виду? Если у него есть доступ для чтения и записи, файл excel не открывается. Потому что excel всегда блокирует открытый файл. – BendEg

+0

Как уже отмечалось, Excel блокирует файл, если он открыт для предотвращения незаконных модификаций. – aceminer

Смежные вопросы