Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果发现Excel文件已打开,请将其关闭_C#_Visual Studio 2010_Excel_Exception_Exception Handling - Fatal编程技术网

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

C# 如果发现Excel文件已打开,请将其关闭,c#,visual-studio-2010,excel,exception,exception-handling,C#,Visual Studio 2010,Excel,Exception,Exception Handling,在下面的代码中,我试图检查Excel文件是否打开, 如果是,那么我想关闭它,当我运行代码时,文件会关闭 不要关门,你能帮忙吗 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 使用System.IO; 使用System.Runtime.InteropServices; 使用System.Windows.Forms; 使用Microsoft.Office.Interop.Excel; 使用Excel=Microsoft.Offic

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

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.IO;
使用System.Runtime.InteropServices;
使用System.Windows.Forms;
使用Microsoft.Office.Interop.Excel;
使用Excel=Microsoft.Office.Interop.Excel;
命名空间CloseIfFileOpen
{
班级计划
{
公共静态void Main()
{
Excel应用oApp;
Excel.ook;
oApp=新的Excel.Application();
oBook=oApp.Workbooks.Add(@“C:\Users\user\Documents\WEF\Excel\Example.xlsx”);
字符串文件路径;
filePath=@“C:\Users\user\Documents\WEF\Excel\Example.xlsx”;
尝试
{
使用(File.Open(filePath,FileMode.Open)){}
}
捕获(IOE异常)
{

var errorCode=Marshal.GetHRForException(e)&((1我正在使用此方法检查是否可以打开文件。如果可以,那么打开,如果不能,那么不打开 将参数路径设置为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;
        }

    }

我用这个方法来检查我是否可以打开一个文件,如果可以,那么就打开,如果不能,那么就不要打开 将参数路径设置为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;
        }

    }

我假设您想检查该文件是否正在被另一个进程使用,如果是,请将其关闭。因为我认为在windows中没有任何方法可以做到这一点,您只能关闭自己对该文件的使用。可能有一些方法可以通过使用Win32 API强制解锁文件,但C#中没有内置任何内容。在f上调用closeile只会关闭您自己对该文件的使用,不会影响其他进程。

我是否认为您想检查该文件是否正在被其他进程使用,如果是,请关闭它?因为我认为在windows中没有任何方法可以做到这一点,您只能关闭您自己对该文件的使用。可能有办法强制取消使用使用Win32 API控制文件,但C#中没有内置任何内容。对文件调用close只会关闭您自己对该文件的使用,不会影响其他进程。

您并不是说希望以独占方式访问该文件。这似乎不太可能,但Excel可能不会锁定该文件,以便其他进程可以以读取模式打开该文件。也许您的文件打开行应该是:


使用(File.Open(filePath,FileMode.Open,FileAccess.Read,FileShare.None)){}
您并不是说希望独占访问该文件。这似乎不太可能,但Excel可能不会锁定该文件,以便其他进程可以在读取模式下打开该文件。您的文件打开行可能应该是:


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

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

现在,“如果这个excel文件是打开的,那么如何关闭它?”是我仍在搜索的问题

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

谢谢


ARK.

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

现在,“如果这个excel文件是打开的,那么如何关闭它?”是我仍在搜索的问题

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

谢谢


ARK.

在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();

在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();

我想提供帮助,但您的代码相当不可读。命名很糟糕,没有注释,而且很混乱。我想提供帮助,但您的代码相当不可读。命名很糟糕,没有注释,而且很混乱。您可以在C#中终止特定进程:尝试{foreach(Process proc in Process.GetProcessesByName(“utorrent”){proc.kill();}}catch(Exception ex){MessageBox.Show(ex.Message);}当然,但这会迫使您杀死实际的违规进程,而不是强迫它释放文件。它还假设您知道违规进程是哪个。是的,确切地说,如果文件已打开,我将关闭它。您可以杀死C#中的特定进程:尝试{foreach(process proc In process.GetProcessesByName(“utorrent”)){proc.Kill();}}catch(Exception ex){MessageBox.Show(ex.Message);}当然可以,但这会迫使您杀死实际的违规进程,而不是强制它释放文件。它还假设您知道违规进程是哪个。是的,如果文件打开,我会关闭它。
//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();