互操作后打开的重复 Excel 文档
Duplicate Excel Documents Opening After Interop
我的应用程序功能如下:
- 获取用户凭据。
- 使用这些凭据从网络位置将
.xls
文档下载到临时文件。
- 在后台与此
.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();
我的应用程序功能如下:
- 获取用户凭据。
- 使用这些凭据从网络位置将
.xls
文档下载到临时文件。 - 在后台与此
.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();