如果发现Excel文件已打开,请将其关闭

时间:2013-11-04 12:50:44

标签: c# visual-studio-2010 excel exception exception-handling

在以下代码中,我试图检查Excel文件是否已打开, 如果是,那么我想关闭它,当我运行代码时,文件会 没关闭,你能帮忙吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;

namespace CloseIfFileOpen
{
    class Program
    {
        public static void Main()
        {
            Excel.Application oApp;
            Excel.Workbook oBook;

            oApp = new Excel.Application();

            oBook =oApp.Workbooks.Add(@"C:\Users\user\Documents\WEF\Excel\Example.xlsx");


            string filePath;

            filePath = @"C:\Users\user\Documents\WEF\Excel\Example.xlsx";


            try
            {
                using (File.Open(filePath, FileMode.Open)) { }
            }
            catch (IOException e)
            {
                var errorCode = Marshal.GetHRForException(e) & ((1 << 16) - 1);

                //return errorCode == 32 || errorCode == 33;
                MessageBox.Show("the file is unavailable now");

                oBook.Save();
                oBook.Close();
                oApp.Quit();
            }
        }
   }
}

6 个答案:

答案 0 :(得分:1)

我是否正确地假设您要检查该文件是否正被其他进程使用,如果是,请关闭它?因为我认为在Windows中没有办法做到这一点,所以你只能关闭自己对文件的使用。可能有办法通过使用Win32 API强制解锁文件,但没有任何内容构建到C#中。在文件上调用close只会关闭自己对文件的使用,不会影响其他进程。

答案 1 :(得分:0)

我正在使用此方法检查是否可以打开文件,如果是,则执行此操作,否则请执行此操作 将参数路径设置为Excel工作表路径

    private Microsoft.Office.Interop.Excel.Application appExcel;
    private Workbook newWorkbook = null;
    private _Worksheet objsheet = null;

    public void excel_init(String path)
    {
        appExcel = new Microsoft.Office.Interop.Excel.Application();

        if (System.IO.File.Exists(path))
        {
            // then go and load this into excel
            newWorkbook = appExcel.Workbooks.Open(path, true, true);
            objsheet = (_Worksheet)appExcel.ActiveWorkbook.ActiveSheet;
        }
        else
        {
            Console.WriteLine("Unable to open workbook");
            System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel);
            appExcel = null;
        }

    }

答案 2 :(得分:0)

您并不是说您想要对该文件进行独占访问。似乎不太可能,但也许Excel不会锁定文件,以便其他进程可以在读取模式下打开文件。也许你的文件开放行应该是:

using (File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None)) { }

答案 3 :(得分:0)

这段代码肯定会帮助您检查文件是否打开 (我检查了excel文件的代码)

private bool check_file_oppen(string check)
    {//where string check is the path of required file

        try
        {
            Stream s = File.Open(check, FileMode.Open, FileAccess.Read, FileShare.None);
            s.Close();
            MessageBox.Show("FILE IS NOT OPEN");
            return true;
        }
        catch (Exception)
        {
            MessageBox.Show("FILE IS OPEN");

            return false;
        }
    }

现在,&#34;如果这个excel文件已打开,那么如何关闭它?&#34;是我仍在寻找的问题,............

如果你找到答案,请与我分享,...............

感谢。

ARK。

答案 4 :(得分:0)

        foreach (var process in Process.GetProcessesByName("EXCEL"))
        {
            process.Kill();
        }

答案 5 :(得分:0)

在Java中,您可以使用这种方法-

//Open the excel file using Desktop.getDesktop()
    Desktop.getDesktop().open(new 
    File("C:\\Users\\AnubhavPatel\\Desktop\\Testing_Code_Macro.xlsm"));
    Thread.sleep(5000);
//Save and close it using robot class
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_S);
    robot.keyRelease(KeyEvent.VK_S);
    robot.keyRelease(KeyEvent.VK_CONTROL);

    robot.keyPress(KeyEvent.VK_ALT);
    robot.keyPress(KeyEvent.VK_F4);
    robot.keyRelease(KeyEvent.VK_F4);
    robot.keyRelease(KeyEvent.VK_ALT);

    Thread.sleep(5000);

//Then write to it using outputStream   
    FileOutputStream outputStream = new FileOutputStream(
            "C://Users//AnubhavPatel//Desktop/Testing_Code_Macro.xlsm");
    workbook.write(outputStream);
    outputStream.close();