簡體   English   中英

無法釋放Excel互操作COM對象

[英]Not able to release Excel interop COM objects

這是我的代碼:

        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實例,該實例始終在我的任務管理器中保持打開狀態。 我在這里閱讀了有關解決方案的信息,但我無法做到。 有什么我想念的嗎? 請幫忙。!

我不確定您的代碼出了什么問題。 但這是關閉您的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());     
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM