2015-11-27 1 views
0

У меня есть приложение C#, которое создает файл excel. Но если файл оставлен открытым и приложение запускается во второй раз, оно выдает исключение IO (поскольку в коде я заменяю существующий файл новым) Теперь я хочу проверить, открыт ли файл и убить процесс excel.exe, ссылающийся на этот файл. Есть ли способ, которым это может быть достигнуто?C# - Убить 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); 

EDIT: файл остается открытым, если в последнем запуске было исключение. Если он открывается пользователем, его можно убить, проверив свойство MainWindowTitle (как было предложено Yeldar).

+0

Я хотел бы сказать, что я думаю, что вы подходите к проблеме с того конца. Ваша программа должна изящно справиться с этим исключением. Возможно, с возможным повторением? Это гораздо приятнее, чем пытаться отправить Excel в забвение (с любыми потенциальными изменениями пользователя с ним). Плюс Office имеет тенденцию навязывать вам _ «возникла проблема с открытием этого файла раньше, откройте его снова?» _ Или некоторые из них – MickyD

+0

^Отчет создается только с помощью этого приложения, никогда не изменяемого вручную. – SharpCoder

+0

[This post] (http://stackoverflow.com/questions/13807102/find-all-open-excel-workbooks) описывает, как вы можете получить этот исполняемый экземпляр excel. Вы должны рассмотреть этот экземпляр вместо того, чтобы убить его. –

ответ

1

В магазинах Excel имя открываемого файла в его названии, как это:

Microsoft Excel - filename.xls 

Вы можете перебирать процессы и убить один с заданным именем:

string filename = "mylist.xls"; 
var excelProcesses = Process.GetProcessesByName("excel"); 

foreach (var process in excelProcesses) 
{ 
    if (process.MainWindowTitle == $"Microsoft Excel - {filename}") // String.Format for pre-C# 6.0 
    { 
    process.Kill(); 
    } 
} 

Обратите внимание, что :

  • также закроет все открытые файлы с тем же именем
  • будет отказаться от любых изменений, которые пользователь может изменить
  • заголовка окна Excel может (или нет, не уверен, нужно проверить) меняться от версии к версии

Однако, как я уже говорил в комментариях, лучше исправить причины, но не последствия - просто заставьте свою программу запускать новое приложение Excel без ошибок.

1

Другим решением может быть:

System.Diagnostics.Process.Start("CMD.exe","taskkill /f /im excel.exe"); 

Эта строка будет вызывать командную строку и выполнить команду taskkill.

Все программы открытия excel будут убиты таким образом.

Обновлено: (для одного файла)

System.Diagnostics.Process.Start("CMD.exe","taskkill /FI "WindowTitle eq Microsoft Excel - filename.xls"); 
+0

@ Микки. Я просто обновляю свой ответ. Проверьте это! –

+0

Ницца Тони, спасибо за редактирование! – MickyD

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