当前位置: 代码迷 >> ASP.NET >> ASP.NET操作 EXCEL后历程无法结束
  详细解决方案

ASP.NET操作 EXCEL后历程无法结束

热度:282   发布时间:2013-02-25 00:00:00.0
ASP.NET操作 EXCEL后进程无法结束
我的网站根目录下面有一个模板文件,程序里面将数据计算出来以后就写入那个模板文件里面去,然后另存到服务器上面的
D:\\Reports\\Week_Product_Yield_Reports.xls
最后将D盘的这个Excel文件下载到用户本地,我在我本地测试没有问题,可以结束Excel进程,但是服务器上面就一直结束不掉。网上的方法都试过了,全都无效,有人说通过dcomcnfg来配置权限,但是我服务器上面 dcomcnfg 里面的Microsoft.Excel.Application的属性根本都编辑不了,全部是灰色的,知道的友友说说看,这里上传不了图片。


C# code
 #region 将数据写入到服务器上面的Excel模板    /// <summary>    /// 将数据写入到服务器上面的Excel模板    /// </summary>    public void WriteToExcel()    {        string filepath = Server.MapPath(@"~/Samples/week_product_yield.xls");        Excel.Application xApp = new Excel.ApplicationClass();        Excel.Workbook xBook = xApp.Workbooks._Open(filepath,          Missing.Value, Missing.Value, Missing.Value, Missing.Value          , Missing.Value, Missing.Value, Missing.Value, Missing.Value          , Missing.Value, Missing.Value, Missing.Value, Missing.Value);        Excel.Worksheet xSheet = (Excel.Worksheet)xBook.Sheets[1];        ////////////////////////////////////////////////////        if (this.txtStartTime.Text.Trim() != "" && this.txtEndTime.Text.Trim() != "")        {            _TheStartTime = this.txtStartTime.Text.Trim().Substring(0, 10);            _TheEndTime = this.txtEndTime.Text.Trim().Substring(0, 10);            DateTime stStart = Convert.ToDateTime(_TheStartTime);            DateTime stEnd = Convert.ToDateTime(_TheEndTime);            if (DateTime.Compare(stStart, stEnd) > 0)            {                this.lblMessage.Text = "警告:结束时间必须大于开始时间!";                this.lblMessage.ForeColor = Color.Red;                return;            }            if (dt.Rows.Count > 0)            {                dt.Clear();            }            DateTime TheStartTime = Convert.ToDateTime(_TheStartTime);            DateTime TheEndTime = Convert.ToDateTime(_TheEndTime);            if (this.ddlModelList.Text == "80-A368-00W00")            {                dt = rm.GetWeekProductYidldReportData(_TheStartTime, _TheEndTime);            }            else if (this.ddlModelList.Text == "80-A368-10W00")            {                dt = rm.GetWeekProductYidldReportData2(_TheStartTime, _TheEndTime);            }            else            {                dt = rm.GetWeekProductYidldReportData3(TheStartTime, TheEndTime);            }                  }        //////////////////////////////////////////////////               Excel.Range rng4 = xSheet.get_Range("B9", Missing.Value);            rng4.Value2 = dt.Rows[0]["FTOTQTY"].ToString();            Excel.Range rng5 = xSheet.get_Range("B10", Missing.Value);            rng5.Value2 = dt.Rows[0]["FFQTY"].ToString();            Excel.Range rng6 = xSheet.get_Range("B11", Missing.Value);            if (Convert.ToInt32(rng5.Value2) == 0 && Convert.ToInt32(rng4.Value2) != 0)            {                rng6.Value2 = "0.00%";            }            else if (Convert.ToInt32(rng5.Value2) == 0 && Convert.ToInt32(rng4.Value2) == 0)            {                rng6.Value2 = "0.00%";            }            else            {                rng6.Value2 = (Convert.ToDouble(rng5.Value2) / Convert.ToInt32(rng4.Value2)) * 100 + "%";            }                     Excel.Range rng10 = xSheet.get_Range("D9", Missing.Value);            rng10.Value2 = dt.Rows[2]["FTOTQTY"].ToString();            Excel.Range rng11 = xSheet.get_Range("D10", Missing.Value);            rng11.Value2 = dt.Rows[2]["FFQTY"].ToString();            Excel.Range rng12 = xSheet.get_Range("D11", Missing.Value);            if (Convert.ToInt32(rng11.Value2) == 0 && Convert.ToInt32(rng10.Value2) != 0)            {                rng12.Value2 = "0.00%";            }            else if (Convert.ToInt32(rng11.Value2) == 0 && Convert.ToInt32(rng10.Value2) == 0)            {                rng12.Value2 = "0.00%";            }            else            {                rng12.Value2 = (Convert.ToDouble(rng11.Value2) / Convert.ToInt32(rng10.Value2)) * 100 + "%";            }                                    string startNowDay = this.txtStartTime.Text.Trim().Substring(0, 10);            string endNowDay = this.txtEndTime.Text.Trim().Substring(0, 10);            Excel.Range rng31 = xSheet.get_Range("A4", Missing.Value);            rng31.Value2 = "Date From " + startNowDay + " To " + endNowDay;            //rng31.Interior.ColorIndex = 10;            Excel.Range rng32 = xSheet.get_Range("A6", Missing.Value);            //rng32.Value2 = "Customer Model P/N:   VPN: 80-A368-00W00";            rng32.Value2 = "Customer Model P/N:   VPN:" + this.ddlModelList.Text;            Excel.Range rng33 = xSheet.get_Range("C12", Missing.Value);            rng33.Value2 = "NOTES:";            Excel.Range rng34 = xSheet.get_Range("G4", Missing.Value);            rng34.Value2 = "Report By:" + this.txtReportBy.Text.Trim();            //DeleteExcelFile();            xApp.DisplayAlerts = false;            xBook.SaveAs("D:\\Reports\\Week_Product_Yield_Reports.xls",                    Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,                    Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value,                    Missing.Value, Missing.Value);            killExcel(xApp);            xApp = null;                        if (xApp != null)            {                xApp.ActiveWorkbook.Close(false, Missing.Value, Missing.Value);            }                      if (xApp != null)        {            xApp.ActiveWorkbook.Close(false, Missing.Value, Missing.Value);        }        GC.Collect(System.GC.GetGeneration(xSheet));        GC.Collect(System.GC.GetGeneration(xBook));        if (xApp != null)         {             killExcel(xApp);                    }    }    #endregion   [DllImport("User32.dll", CharSet = CharSet.Auto)]    public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);   private static void killExcel(Excel.Application excel)    {        Process[] ps = Process.GetProcesses();        IntPtr t = new IntPtr(excel.Hwnd); //得到这个句柄,具体作用是得到这块内存入口         int ExcelID = 0;        GetWindowThreadProcessId(t, out ExcelID); //得到本进程唯一标志k        foreach (Process p in ps)        {            if (p.ProcessName.ToLower().Equals("excel"))            {                if (p.Id == ExcelID)                {                    p.Kill();                }            }        }    }
  相关解决方案