互操作后打开的重复 Excel 文档

Duplicate Excel Documents Opening After Interop

我的应用程序功能如下:

  1. 获取用户凭据。
  2. 使用这些凭据从网络位置将 .xls 文档下载到临时文件。
  3. 在后台与此 .xls 文档交互,使用 Microsoft.Office.Interop.Excel 更新用户的 Outlook 日历(也使用 Interop)。

解析.xls的相关方法如下:

private static List<AppointmentDetails> ParseXls(string localSchedulePath, string initials)
        {
            List<AppointmentDetails> list = new List<AppointmentDetails>();
            List<string> alreadyCounted = new List<string>();
            Excel.Application excel = new Excel.Application();
            Excel.Workbook workbook = excel.Workbooks.Open(localSchedulePath);
            Excel.Worksheet worksheet = workbook.Sheets["On Call"];
            Excel.Range schedule = worksheet.Range["A1", "P369"];
            foreach (Excel.Range row in schedule.Rows)
            {
                foreach (Excel.Range cell in row.Cells)
                {
                    if (cell.Value == null || alreadyCounted.Contains(IndexToExcel(cell.Row, cell.Column))) continue;
                    if (cell.Value.ToString().Contains(initials))
                    {
                        List<int> rows = new List<int>();
                        int rowNum = cell.Row;
                        int colNum = cell.Column;
                        rows.Add(rowNum);
                        alreadyCounted.Add(IndexToExcel(rowNum, colNum));
                        while (schedule.Range[IndexToExcel(++rowNum, colNum)].Value != null &&
                        schedule.Range[IndexToExcel(rowNum, colNum)].Value.ToString().Contains(initials))
                        {
                            alreadyCounted.Add(IndexToExcel(rowNum, colNum));
                            rows.Add(rowNum);
                        }
                        string regionCode = worksheet.Range[IndexToExcel(1, colNum)].Value.ToString();
                        list.Add(new AppointmentDetails
                        {
                            StartDate = DateTime.Parse(worksheet.Range[IndexToExcel(rows[0], 2)].Value.ToString()),
                            EndDate = DateTime.Parse(worksheet.Range[IndexToExcel(rows[rows.Count - 1], 2)].Value.ToString()),
                            Region = regionCode
                        });
                    }
                }
            }
            return list;
        }

这绝对没问题,日历已更新,一切正常。但是,出于某种原因,当 .xls 然后从 SharePoint 站点手动打开以便用户可以自己查看时,刚刚下载的临时文件也会打开(每个都在单独的 Excel window).

这不是一部大戏,但我不明白为什么会这样,如果可以的话,我宁愿摆脱一个小故障。知道如何解决这个问题吗?

答案很简单。感谢 @Ctznkane525 指出这一点。 Interop 资源在超出范围时不会自行清理。这需要手动完成。

在问题中的函数底部添加了以下两行代码以抑制警报,然后关闭应用程序。

excel.DisplayAlerts = false;
excel.Quit();