На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Выгрузка Excel из процессов - C#
    Доброго времени суток всем! Заранее прошу прощения если тема создана не в том разделе.
    Итак, есть код, который из Excel передает все данные на форму в dataGridView1. Естественно после работы с Эксель нужно выгрузить все его барахло для того чтобы он не висел в процессах.
    Весь код:
    ExpandedWrap disabled
      private void button3_Click(object sender, EventArgs e)
              {
                  test();
                
              }
              public void releaseObject(object obj)
              {
                  try
                  {
                      System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj);
                      obj = null;
                  }
                  catch (Exception ex)
                  {
                      obj = null;
                  }
                  finally
                  {
                      GC.Collect();
                  }
              }
              public void test()
              {
                  dsTest dSet = new dsTest();
                  Excel.Application ExcelApp = new Excel.Application();
                  Excel.Worksheet ExcelWorkSheet;
                  Excel.Workbook ExcelWorkBook;
                  Excel.Range ExcelRange;
       
                  var workbooks = ExcelApp.Workbooks;
                  ExcelWorkBook = workbooks.Open(@"D:\\Эксель.xlsm", 0, false);
                  ExcelWorkSheet = ExcelWorkBook.ActiveSheet;
                  ExcelRange = ExcelWorkSheet.UsedRange;
       
                  for (int Rnum = 2; Rnum <= ExcelRange.Rows.Count - 2; Rnum++)
                  {
                      DataRow dr = dSet.DataTable1.NewRow();
                      for (int Cnum = 1; Cnum <= ExcelRange.Columns.Count; Cnum++)
                      {
                          if ((ExcelRange.Cells[Rnum, Cnum] as Excel.Range).Value2 != null)
                          {
                              dr[Cnum - 1] =
                  (ExcelRange.Cells[Rnum, Cnum] as Excel.Range).Value2.ToString();
                          }
                      }
                      dSet.DataTable1.Rows.Add(dr);
                      dSet.DataTable1.AcceptChanges();
                  }
       
                  dataGridView1.DataSource = dSet.DataTable1;
                  dataGridView1.Visible = true;
                  ExcelWorkBook.Close(true, null, null);
                  ExcelApp.Quit();
                  releaseObject(ExcelApp);
                  releaseObject(workbooks);
                  releaseObject(ExcelWorkBook);
                  releaseObject(ExcelWorkSheet);
                  releaseObject(ExcelRange);
              }

    Проблема заключается вот в этой строке:
    ExpandedWrap disabled
      ExcelWorkBook = workbooks.Open(@"D:\\Эксель.xlsm", 0, false);

    Понадобилось путь к файлу засунуть в отдельную переменную. Записал:
    ExpandedWrap disabled
      string fullPath = "D:\\Эксель.xlsm";

    И после того как я вместо пути прописываю fullpath у меня Excel остается висеть в процессах. Если вернуть все как было, то есть путь напрямую, то все корректно работает. В чем тут может быть проблема?
      Итак решение найдено. Проблема заключалась в том что я запускал все это дело в Debug. Из за этого ссылки не освобождались. Нужно было делать это в релизе. Подробнее тут:
      http://stackoverflow.com/questions/3937181...eleasecomobject
      http://stackoverflow.com/questions/1572867...111137#38111137
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0201 ]   [ 16 queries used ]   [ Generated: 19.04.24, 08:07 GMT ]