【问题标题】:How to save excel file without GUI notifications?如何在没有 GUI 通知的情况下保存 excel 文件?
【发布时间】:2013-10-21 11:21:17
【问题描述】:

我有一个在服务器上运行的应用程序,它必须将一些内容写入 excel 文件。当我想保存和关闭文件时,当文件被其他机器和用户打开时,我会遇到麻烦。 Excel 打开对话框以询问文件名,但它在服务器上运行,没有用户关闭对话框。因此,当文件打开且无法写入时,应该跳过没有 GUI 询问文件名的文件。

Workbook book = excel.Workbooks.Open(filename);
Worksheet sheet = (Worksheet) book.Worksheets.get_Item(1);
// write stuff in cells
book.SaveAs(filename);
book.Close(false);

我怎样才能让excel尝试保存文件然后关闭无论如何?

(在我的应用中没有丢失数据,反正以后可以写入excel文件)


  • 文件存在 → 覆盖
  • 文件打开 → 不保存,直接关闭

【问题讨论】:

    标签: c# excel interop save


    【解决方案1】:

    看起来这回答了问题,请在选择保存或跳过之前检查文件是否正在使用。

    Is there a way to check if a file is in use?

    protected virtual 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;
    }
    

    要检查文件是否存在,您可以使用

    if (File.Exists(filename)){
        // if the file exists
        book.Save();
    }
    else{
    //if the file doesnt exist
        book.SaveAs(filename);
    }
    

    【讨论】:

    • 如果文件刚刚被锁定,这会有所帮助。覆盖问题如何?在检查和保存之间仍然有可能打开文件。有没有办法锁定文件以进行检查和保存?
    • 查看更新的答案以检查文件是否存在并保存或另存为。如果您的文件打开检查是在您打开文件和关闭文件之间进行的,那么在那段时间里没有其他人可以打开/编辑/锁定它
    • 这在保存时也无济于事,因为我用 excel 打开文件并且它已经自己锁定了它。 打开 excel 文件时它可能很有用。
    • 如果您在正确的位置应用该功能,您会在尝试打开文件之前知道文件是否被锁定,然后在打开文件时将其锁定,以便您知道可以保存。
    【解决方案2】:

    如果我为我必须更新的一个文件设置共享选项,所有问题都可能得到解决。这样多个用户可以同时更新文件:菜单 → 额外 → ...


    这并不能 100% 解决问题,但总比没有好:
    private static void saveAndClose(Workbook book, string filename)
    {
        try
        {
            File.Delete(filename);
        }
        catch { }
        if (!File.Exists(filename))
            book.SaveAs(filename);
        book.Close(false);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      相关资源
      最近更新 更多