关于asp.net导出excel的注意(2)

每次导出时都会报Application is busy的错误,但是调试时,有时又不会报错,并且每次都会在进程中产生一个新的excel进程

代码如下: 

 

  //Process[] myProcesses = Process.GetProcessesByName("EXCEL");
        //foreach (Process myProcess in myProcesses)
        //{
        //    myProcess.Kill();
        //}//杀死所有excel的进程

 

 

 Excel.ApplicationClass pApplication = null;

        Excel._Workbook xBk = null; ;
        Excel._Worksheet xSt = null; ;
        Excel._QueryTable xQt = null; ;
        try
        {
            string pstrSql = "select * from jobs";
            string title = "title";

            string ExcelConn = "ODBC;DRIVER=SQL Server;SERVER=localhost;UID=sa;PWD=123456;APP=Microsoft(R) Windows (R) 2000 Operating System;WSID=me;DATABASE=pubs";
            pApplication = new Excel.ApplicationClass();

            xBk = pApplication.Workbooks.Add(true);

            xSt = (Excel._Worksheet)xBk.ActiveSheet;
            pApplication.Cells[2, 2] = title;

            xSt.get_Range(pApplication.Cells[2, 2], pApplication.Cells[2, 2]).Font.Bold = true;
            xSt.get_Range(pApplication.Cells[2, 2], pApplication.Cells[2, 2]).Font.Name = "黑体";
            xSt.get_Range(pApplication.Cells[2, 2], pApplication.Cells[2, 2]).Font.Size = 22;
            xQt = xSt.QueryTables.Add(ExcelConn, xSt.get_Range(pApplication.Cells[4, 2], pApplication.Cells[4, 2]), pstrSql);
            xQt.Name = "导出EXCEL";
            xQt.FieldNames = true;
            xQt.RowNumbers = false;
            xQt.FillAdjacentFormulas = false;
            xQt.PreserveFormatting = false;
            xQt.BackgroundQuery = true;
            xQt.RefreshStyle = Excel.XlCellInsertionMode.xlInsertDeleteCells;
            xQt.AdjustColumnWidth = true;
            xQt.RefreshPeriod = 0;
            xQt.PreserveColumnInfo = true;
            xQt.Refresh(xQt.BackgroundQuery);
            Thread.Sleep(1000);    //这一步最关键,只有在这里让线程休眠1秒钟,才会导出成功(具体多长时间没有研究过),否则都会报Application is busy的错误  。

   pApplication.Visible = true;
            pApplication.Quit();
        }
        catch (Exception Err)
        {
            Response.Write(Err.Message);
        }
        finally
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(pApplication);

            xSt = null;
            xBk = null;
            pApplication = null;
          

            GC.Collect();//回收垃圾

        }

posted on 2008-07-31 17:19  小白鸭  阅读(356)  评论(0)    收藏  举报

导航