0

我有一个在服务器上运行的应用程序,它必须将一些东西写入 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文件)


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

2 回答 2

1

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

有没有办法检查文件是否正在使用?

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);
}
于 2013-10-21T11:31:11.070 回答
0

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


这并不能 100% 解决问题,但总比没有好:

private static void saveAndClose(Workbook book, string filename)
{
    try
    {
        File.Delete(filename);
    }
    catch { }
    if (!File.Exists(filename))
        book.SaveAs(filename);
    book.Close(false);
}
于 2013-10-21T12:01:25.300 回答