C# 如何打开Excel文件而不锁定它?

C# 如何打开Excel文件而不锁定它?,c#,excel,interop,C#,Excel,Interop,我有一个创建Excel报告的过程,然后为用户打开它。问题是,如果有人让文件保持打开状态,它将保持锁定状态,在第一个人退出excel文件之前,没有人可以生成报告 是否有一种方法可以使用Process.Start或Microsoft的Interop.Excel库打开Excel文件而不锁定它 每次运行报表时,我都会使用Interop库生成文件,并将其作为静态文件名保存在运行此应用程序的共享网络文件夹中 using Excel = Microsoft.Office.Interop.Excel; ...

我有一个创建Excel报告的过程,然后为用户打开它。问题是,如果有人让文件保持打开状态,它将保持锁定状态,在第一个人退出excel文件之前,没有人可以生成报告

是否有一种方法可以使用
Process.Start
或Microsoft的
Interop.Excel
库打开Excel文件而不锁定它

每次运行报表时,我都会使用Interop库生成文件,并将其作为静态文件名保存在运行此应用程序的共享网络文件夹中

using Excel = Microsoft.Office.Interop.Excel;

...

xlsBook.SaveAs(newFileName, Excel.XlFileFormat.xlWorkbookNormal);
然后使用
过程打开文件。开始

Process.Start(newFileName);

如果最终用户只需要读取文件,而不需要修改文件,则可以创建卷影副本,然后打开该副本


只需将原始文件复制到临时位置并从那里打开即可。原始文件保持不变,因此其他人可以打开该文件。

您可以尝试以只读模式打开该文件:

var app = new Microsoft.Office.Interop.Excel.Application();
var workbook = app.Workbooks.Open(filename, ReadOnly: true);
或者您可以尝试以共享模式保存:

workbook.SaveAs(filename, AccessMode: XlSaveAsAccessMode.xlShared);

这个文件每天至少创建一次,每天都有不同的数据,我不想有一个巨大的临时文件夹,每次运行时都包含报告的副本。临时文件存储在本地(至少应该是这样),因此,您可以确保在适当的时间自动删除任何旧副本。您可以通过创建一个完整副本来避免创建完整副本。@RoyDictus谢谢,我将文件复制到用户的本地临时文件夹(
Path.GetTempPath()
)并从那里打开了它。我忘了我正在修改一个XBAP,它可以访问文件系统,而不是常规的asp.net web应用程序。除非有人告诉我使用
进程的方法,否则接受你的答案。启动
或Interop库打开文件而不锁定:)@ScottMiller:硬链接没有帮助。它们只在同一个驱动器上工作,并且指向同一个文件->如果以独占方式打开该文件,尝试通过硬链接打开该文件将失败。您可以拥有共享工作簿,但可能不适合:@Remou谢谢,但每个运行报告的人都会使用包含新数据的新副本覆盖该文件,所以我认为共享不起作用。你可以以只读方式打开excel文件,我想这不会锁定它,但我不知道。我不确定是否有命令行等价物可以做到这一点。另一种让人想到的方法是使用一个“助手”excel文件,该文件中有宏来发挥神奇的作用,可以以只读方式打开文件,也可以将生成的文件用作数据源,而不是主报告文件。当然,这取决于您正在更新的内容以及如何使用excel的内置数据功能从数据库中获取数据集以放入工作表中。谢谢,使用
ReadOnly
打开文件是可行的,尽管我必须将
app.Visible=true
设置为显示excel