2014-02-25 31 views
0

这里是我的代码:无法释放的Excel互操作COM对象

 Application app = null; //release this object 
     Workbook wrkbuk = null;//release this object 
     Worksheet wrksheet = null;//release this object 
     object misval = System.Reflection.Missing.Value; 
     app = new Application(); 
     app.Visible = false; 
     string sPath = Server.MapPath("sample"); 
     var workbukObj = app.Workbooks; //release this object 
     wrkbuk = workbukObj.Open(sPath + "\\TotalDistance.xlsx", misval, misval, misval, misval, misval, misval, misval, misval, misval, misval, misval, misval, misval, misval);// releaase this object 
     wrksheet = ((Worksheet)wrkbuk.Worksheets[1]); //release this object 
     Range cells = ((Worksheet)wrkbuk.Worksheets[1]).Cells; //release this 
     int row = 2; 
     int column = 2; 
     wrksheet.Cells[row, column] = Convert.ToDateTime(txtFromDate.Text).ToString("dd-MM-yyyy") + " " + txtFromTime.Text; 
     row++; 
     wrksheet.Cells[row, column] = Convert.ToDateTime(txtToDate.Text).ToString("dd-MM-yyyy") + " " + txtToTime.Text; 
     row = 5; 
     column = 1; 
     for (int k = 0; k < finalPack.Count; k++) 
     { 
      wrksheet.Cells[row, column] = finalPack[k].vehicleNumber; 
      column++; 
      //wrksheet.Cells[row, column] = finalPack[k].driverName; 
      //column++; 
      //wrksheet.Cells[row, column] = finalPack[k].driverNumber; 
      //column++; 
      //wrksheet.Cells[row, column] = finalPack[k].driverAddress; 
      //column++; 
      if (finalPack[k].distanceTravelled == .001) 
      { 
       wrksheet.Cells[row, column] = ""; 
      } 
      else 
      { 
       wrksheet.Cells[row, column] = Convert.ToDateTime(finalPack[k].frmTime).ToString("dd-MM-yyyy"); 

      } 
      column++; 
      wrksheet.Cells[row, column] = finalPack[k].startAddress; 
      column++; 
      wrksheet.Cells[row, column] = finalPack[k].endAddress; 
      column++; 
      if (finalPack[k].distanceTravelled != .001) 
      { 
       wrksheet.Cells[row, column] = finalPack[k].distanceTravelled; 
      } 
      else 
      { 
       wrksheet.Cells[row, column] = ""; 

      } 
      column++; 
      if (finalPack[k].tempDist != 0.0) 
      { 
       wrksheet.Cells[row, column] = finalPack[k].tempDist; 
      } 
      else 
      { 
       wrksheet.Cells[row, column] = ""; 

      } 
      column++; 
      if (finalPack[k].totalDistance != 0.0) 
      { 
       wrksheet.Cells[row, column] = finalPack[k].totalDistance; 
      } 
      else 
      { 
       wrksheet.Cells[row, column] = ""; 

      } 
      column = 1; 
      row++; 

     } 

     string filePath = Server.MapPath("DistanceReports") + "\\" + DateTime.Now.ToString("dd_MMM_yyyy HH_mm_ss") + ".xlsx"; 
     wrkbuk.SaveAs(filePath, misval, misval, misval, misval, misval, XlSaveAsAccessMode.xlExclusive, misval, misval, misval, misval, misval); 

     wrkbuk.Close(Type.Missing, Type.Missing, Type.Missing); 
     workbukObj.Close(); 

     string Timezone = "India Standard Time"; 
     if (Session["timeZone"] != null) 
      Timezone = Session["timeZone"].ToString(); 
     DateTime currentTime = timeZoned(Timezone); 

     FileInfo file = new FileInfo(filePath); 
     if (file.Exists) 
     { 
      Response.Clear(); 
      Response.ClearHeaders(); 
      Response.ClearContent(); 
      Response.AddHeader("content-disposition", "attachment; filename=" + "DistanceReport" + currentTime.ToString("yyyy/MM/dd HH:mm") + ".xlsx"); 
      Response.AddHeader("Content-Type", "application/Excel"); 
      Response.ContentType = "application/vnd.xls"; 
      Response.AddHeader("Content-Length", file.Length.ToString()); 
      Response.WriteFile(file.FullName); 

     } 
     try 
     { 
      app.Quit(); 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 

      Marshal.FinalReleaseComObject(cells); 
      Marshal.FinalReleaseComObject(wrksheet); 
      Marshal.FinalReleaseComObject(wrkbuk); 
      Marshal.FinalReleaseComObject(workbukObj); 
      Marshal.FinalReleaseComObject(app); 
      // wrkbuk.Close(null, null, null); 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 

     } 
     catch 
     { 
     } 

我试图关闭EXCEL.EXE实例,它总是停留在我的任务管理器中打开。 我读了关于解决方案here,但我无法做到这一点。 有什么我失踪?请帮忙。!

+0

你真的* *需要所有这些代码来演示该问题? – Bathsheba

+0

我想我需要整个代码..我想要显示什么COM对象声明,并且他们是否正确释放或不.. – writeToBhuwan

+0

可能重复的[了解垃圾收集在.net](http://stackoverflow.com/questions/17130382/understanding-garbage-collection-in-net) –

回答

1

我不确定您的代码中发生了什么问题。但这里是一个函数关闭您的Excel文件:

private void releaseObject(object obj) { 
     try { 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
      obj = null; 
     } 
     catch (Exception ex) { 
      obj = null; 
      MessageBox.Show("Unable to release the Object " + ex.ToString()); 
     } 
     finally { 
      GC.Collect(); 
     } 
    } 

然后你把它在你的代码的末尾:

try { 
    wrkbuk.Close(true); 
    app.Quit(); 
    releaseObject(app); 
    releaseObject(wrkbuk);  
    releaseObject(wrksheet); 
} catch (Exception ex) { 
    MessageBox.Show(ex.ToString());  
}