使用filehelpers ExcelStorage-Excel文件未打开

本文关键字:文件 filehelpers ExcelStorage-Excel 使用 | 更新日期: 2023-09-27 18:22:11

我使用的文件助手ExcelStorage有点像这样:

ExcelStorage provider = new ExcelStorage(typeof(Img));
provider.StartRow = 2;
provider.StartColumn = 1;
provider.FileName = "Customers.xls";
provider.HeaderRows = 6;
provider.InsertRecords(imgs.ToArray()); // imgs was a list before

当我插入完记录后,我想打开我创建的Excelfile(我的软件仍在运行)。但Excel似乎以某种方式被锁定了。也就是说,有一个Excel实例在流程管理器中运行。当我杀死所有Excel实例时,我可以打开该文件。我是否必须以某种方式处理ExcelStorage?

使用filehelpers ExcelStorage-Excel文件未打开

我使用过FileHelpers,但没有使用ExcelStorage。此处的链接建议您可能应该使用FileHelpers.ExcelNPOIStorage。

查看ExcelStorage的源代码,没有公共的dispose方法。有一个专用的CloseAndCleanup方法,它在InsertRecords的末尾被调用。因此,我不认为你做错了什么。

ExcelNPOIStorage的用法看起来非常相似,在这里的私有清理方法中有一个对GC.Collect()的调用,所以我猜该组件的早期版本的清理存在已知问题。

您最好的选择是获取HANDLE.EXE的副本,您可以在提升的命令提示符下使用该副本来查看有问题文件的句柄。这可能是你的代码,防病毒或excel(如果打开)。Excel在打开文件时会对其进行完全锁定,防止普通记事本访问等。

如果拥有该文件句柄的进程是您自己的代码,那么在退出回到开发环境后,请查看句柄是否存在。如果清除了句柄,那么您就没有正确释放锁,这可能会稍微棘手一些,因为这将取决于您所编码的内容。

@timbo提到的CloseAndCleanup函数仅从几个地方调用,即Sheets属性和ExtractRecords/InsertRecords功能。唯一值得怀疑的是,当它试图执行CloseAndCleanup时,您是否看到任何异常,或者COM系统没有正确释放Excel应用程序的引用计数。

如果你能用一个小样本应用程序复制这一点,我会非常愿意对它进行快速测试,看看会发生什么。

注意1,如果您在Visual Studio中运行代码,则可能是一个名为<APPNAME>。VSHOST.EXE,这是visual studio的开发过程,或者如果您关闭了visual studio托管,只需您的<APP>。EXE。如果在IIS中为网页或web服务运行,则很可能会有一个w3p进程。

注意2,如果您在没有提升的情况下运行句柄,它可能会也可能找不到有问题文件的句柄。因此,始终建议运行高架,以确保结果准确无误。

注意3,ExcelStorage和ExcelNPOIStorage的区别在于,如果我没记错的话,前者处理.xls,后者处理.xlsx。