Excel互操作:工作簿.打开挂起
本文关键字:挂起 工作簿 互操作 Excel | 更新日期: 2023-09-27 18:21:58
这是我上一个问题的延续(用vba代码打开Excel工作簿-错误通知VSTO),该问题尚未解决。我对ExcelInterop有一个新的问题。即使excel文件中没有任何错误,我也看到workBooks.Open有时会无限期地挂起,从而导致我的应用程序永远挂起。我正在使用以下代码初始化excel对象
public static class InterOpService
{
private static Application _excel;
public static Application Excel
{
get
{
try
{
_excel = (Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
_excel.Visible = true;
}
catch(Exception ex)
{
_excel = new Application { Visible = true };
}
return _excel;
}
}
}
上面的代码返回一个Excel对象。它还试图避免创建Excel对象的多个实例。下面的代码使用这个返回的对象
Application excel = InterOpService.Excel;
Workbooks workBooks = excel.Workbooks;
string file = fileName;
Workbook workBook = workBooks.Open(file, 0,
true,
5,
"",
"",
true,
XlPlatform.xlWindows,
"'t",
false,
false,
0,
true,
1,
0);
我看到挂起工作簿.open的一个可能原因是文件共享。可能是防病毒扫描程序对文件进行了独占锁定,而我的应用程序在尝试打开时挂起了。问题是这是一种随机行为,我真的很难复制它。另一个问题是,我只能用Interop找到一条出路。
我发现了这个问题。以下是挂起的原因:
1) 我正在通过网络打开工作簿。
Workbook workBook = workBooks.Open(file, 0,
true,
5,
"",
"",
true,
XlPlatform.xlWindows,
"'t",
false,
false,
0,
true,
1,
0);
文件不在我的本地计算机中。在我将文件复制到本地机器并打开后,挂起的案例数量减少了。
2) 服务器内存。挂起的另一个原因是服务器的CPU使用率是100%。这不在我的控制范围内。但我很满意我找到了这个。
Open方法的主要问题是它的响应不足以让调用者知道这些原因。最好的方法是,在线程中执行此活动,并给线程一个执行时间。如果线程在指定的时间范围内没有响应,则失败。