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找到一条出路。

Excel互操作:工作簿.打开挂起

我发现了这个问题。以下是挂起的原因:

1) 我正在通过网络打开工作簿。

Workbook workBook = workBooks.Open(file, 0,
                                  true,
                                  5,
                                  "",
                                  "",
                                  true,
                                  XlPlatform.xlWindows,
                                  "'t",
                                  false,
                                  false,
                                  0,
                                  true,
                                  1,
                                  0);

文件不在我的本地计算机中。在我将文件复制到本地机器并打开后,挂起的案例数量减少了。

2) 服务器内存。挂起的另一个原因是服务器的CPU使用率是100%。这不在我的控制范围内。但我很满意我找到了这个。

Open方法的主要问题是它的响应不足以让调用者知道这些原因。最好的方法是,在线程中执行此活动,并给线程一个执行时间。如果线程在指定的时间范围内没有响应,则失败。