Interop之后打开的重复Excel文档

时间:2018-01-31 11:04:16

标签: c# excel interop

我的应用程序功能如下:

  1. 获取用户凭据。
  2. 使用这些凭据将.xls文档从网络位置下载到临时文件中。
  3. 使用.xls在后​​台与此Microsoft.Office.Interop.Excel文档进行交互,以更新用户的展望日历(同时使用Interop)。
  4. 解析.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;
            }
    

    这非常好用,日历会更新,一切都按照预期运行。但是,出于某种原因,当然后从SharePoint站点手动打开.xls以便用户可以自己查看它时,刚刚下载的临时窗口也会打开(每个窗口都在一个单独的Excel窗口中)。

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

1 个答案:

答案 0 :(得分:0)

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

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

$s1="32.56.86.90.23";

$s2="11.23.32.90.10";
$s1_ar=explode(".",$s1);
$s2_ar=explode(".",$s2);
//assuming $s1_ar and $s2_ar both has unique values if not please make them unique 
$result_array = array();
$hasMatch = 0;
for($i = 0; $i < count($s1_ar) && $i < count($s2_ar); $i++){

    if(!isset($result_array[$s1_ar[$i]])){
        $result_array[$s1_ar[$i]] = 1;
    }else{
     $result_array[$s1_ar[$i]]++;
    }
    if(!isset($result_array[$s2_ar[$i]])){
        $result_array[$s2_ar[$i]] = 1;
    }else{
      $result_array[$s2_ar[$i]]++;
    }

} 

foreach($result_array as $result){
    if($result >=2) $hasMatch++;
}
if($hasMatch >= 2)
     echo "YES";
else
     echo "NO";