我有一个在服务器上运行的应用程序,它必须为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文件)
- 文件存在→覆盖
- 文件打开→不保存,只需关闭
看起来这回答了这个问题,在选择保存或跳过之前检查文件是否正在使用中。
有没有办法检查文件是否正在使用中?
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);
}
如果我为必须更新的一个文件设置共享选项,所有问题都可以解决。以便多个用户可以同时更新文件:菜单→额外→...
这并不能 100% 解决问题,但总比没有好:
private static void saveAndClose(Workbook book, string filename)
{
try
{
File.Delete(filename);
}
catch { }
if (!File.Exists(filename))
book.SaveAs(filename);
book.Close(false);
}