我该如何在不锁定文件的情况下打开Excel文件?

3
我有一个生成Excel报告并为用户打开的过程。问题是,如果有人将文件保持打开状态,它将被锁定,其他人无法生成报告,直到第一个人退出Excel文件。
是否有一种方法可以在不锁定文件的情况下打开Excel文件,使用Process.Start或Microsoft的Interop.Excel库?
我每次运行报告时都使用Interop库来构建文件,并将其保存为静态文件名在共享网络文件夹中,在此应用程序从中运行。
using Excel = Microsoft.Office.Interop.Excel;

...

xlsBook.SaveAs(newFileName, Excel.XlFileFormat.xlWorkbookNormal);

使用Process.Start打开文件。

Process.Start(newFileName);

您可以使用共享工作簿,但可能并不适合:http://office.microsoft.com/zh-cn/excel-help/use-a-shared-workbook-to-collaborate-HP010096833.aspx#BMshareworkbook - Fionnuala
@Remou 谢谢,但是每个运行报告的人都会用包含新数据的新副本覆盖文件,所以我认为共享不起作用。 - Rachel
您可以以只读方式打开Excel文件,我认为这不会锁定它,但我不确定。我不知道是否有命令行等效项可以做到这一点。另一种方法是使用一个“助手”Excel文件,其中包含宏来执行魔术,无论是以只读方式打开要读取的文件,还是将您生成的文件用作数据源而不是主报告文件。当然,根据您正在更新的内容和方式,您可以使用Excel内置的数据功能从数据库中获取数据集并将其放入工作表中。 - Chris
2个回答

8

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

var app = new Microsoft.Office.Interop.Excel.Application();
var workbook = app.Workbooks.Open(filename, ReadOnly: true);

或者你可以尝试在共享模式下保存:

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

谢谢,使用ReadOnly打开文件可以工作,尽管我不得不设置app.Visible = true来显示Excel。 - Rachel

3

如果最终用户只需要读取文件而不需要修改它,你可以创建一个影子副本,然后打开该副本。

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


这个文件每天至少会创建一次,每天的数据都不同,我不希望有一个巨大的临时文件夹,包含着每次运行报告的副本。 - Rachel
1
临时文件被存储在本地(至少应该是这样),因此您可以确保在适当的时间自动删除任何旧副本。 - Roy Dictus
你可以通过创建一个硬链接来避免创建完整的副本。 - Scott Miller
@ScottMiller:硬链接有帮助吗?即使它解决了问题,原始文件也无法以读写方式打开,如果两个人尝试对其进行写入操作,那么情况肯定会变得非常糟糕... - Chris
1
@RoyDictus 谢谢,我将文件复制到用户的本地临时文件夹(Path.GetTempPath()),然后从那里打开它。我忘记了我正在修改一个具有访问文件系统权限的XBAP而不是常规的asp.net Web应用程序。除非有人能告诉我如何使用Process.Start或Interop库打开文件而不锁定它,否则我会接受你的答案 :) - Rachel
1
@ScottMiller:硬链接没有用。它们只在同一驱动器上起作用,而且它们指向相同的文件->如果您独占地打开文件,尝试通过硬链接打开它将失败。 - Oliver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接