簡體   English   中英

正確方法在Excel流程中取消Background Worker

[英]Proper Way cancel Background Worker in Excel process

提供以下代碼是取消Background Worker的最佳方法,以便Excel正確關閉。 例如,如果用戶在excel流程的中間關閉表單。 下面的代碼工作正常。 只是盯着后台工作人員,所以只想了解它,並想以正確的方式來做即可。 基本上,下面的代碼將允許用戶使用復選框選擇要導出的列(字段)。 int [] cols是他們選擇的列的對應數字。

*這里是更新的代碼。 我將建議與取消和循環期間的中斷一起使用,以及基本的bgw msdn文章。 我想不出另一種方法來檢查何時退出Excel,所以我使用了行數。 謝謝你的提示。

    private void XLWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        this.XLWorker.ReportProgress(-1);

        xl._Application app = new Microsoft.Office.Interop.Excel.Application();
        xl._Workbook workbook = app.Workbooks.Add(Type.Missing);

        // creating new Excelsheet in workbook 
        xl._Worksheet worksheet = null;

        // get the reference of first sheet. By default its name is Sheet1. 
        // store its reference to worksheet            
        worksheet = workbook.Sheets[1];
        worksheet = workbook.ActiveSheet;

        // changing the name of active sheet 
        worksheet.Name = "User Details";
        worksheet.Cells.Font.Size = "12";

        int headerCounter = 1;
        foreach (int col in _export)
        {
            worksheet.Cells[1, headerCounter] = _form.DataGridResultsSet.Columns[col].HeaderText;
            headerCounter++;
        }

        //Format zip code
        xl.Range rngResult = null;
        xl.Range FindRange = null;

        int rowCount = worksheet.UsedRange.Rows.Count;
        for (int columnIndex = 1; columnIndex <= worksheet.UsedRange.Rows.Count; columnIndex++)
        {
            FindRange = worksheet.UsedRange.Columns[columnIndex];
            rngResult = FindRange.Find("ZipCode", Type.Missing, Type.Missing, Type.Missing, Type.Missing, xl.XlSearchDirection.xlNext, Type.Missing, Type.Missing, Type.Missing);

            if (rngResult != null)
            {
                rngResult.EntireColumn.NumberFormat = "00000";
            }
        }

        //Add rows
        int colCounter = 0;
        int pending = 0;
        for (int i = 0; i < _form.DataGridResultsSet.Rows.Count - 1; i++)
        {
            if ((XLWorker.CancellationPending == true))
            {
                e.Cancel = true;
                break;
            }
            else
            {
                foreach (int col in _export)
                {
                    worksheet.Cells[i + 2, colCounter + 1] = _form.DataGridResultsSet.Rows[i].Cells[col].Value.ToString();
                    colCounter++;
                }
                colCounter = colCounter - _export.Length;
                XLWorker.ReportProgress((i * 100) / _form.DataGridResultsSet.Rows.Count - 1);
            }
            pending = i;
        }
        int cancel = pending + 2;
        if (cancel < _form.DataGridResultsSet.Rows.Count)
        {
            Marshal.FinalReleaseComObject(rngResult);
            Marshal.FinalReleaseComObject(FindRange);
            Marshal.FinalReleaseComObject(worksheet);

            rngResult = null;
            FindRange = null;

            worksheet = null;

            workbook.Close(false, Type.Missing, Type.Missing);

            app.Application.Quit();
            app.Quit();

            Marshal.FinalReleaseComObject(workbook);
            workbook = null;

            Marshal.FinalReleaseComObject(app);
            app = null;

            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
        else
        {
            //Format sheet
            worksheet.Columns.AutoFit();
            worksheet.Cells.HorizontalAlignment = xl.XlHAlign.xlHAlignLeft;
            worksheet.Cells.Font.Size = "11";
            xl.Range rngB = (xl.Range)worksheet.Rows[1];
            rngB.Font.Bold = true;

            //Worker completed
            XLWorker.ReportProgress(100);

            Marshal.FinalReleaseComObject(rngResult);
            Marshal.FinalReleaseComObject(FindRange);
            Marshal.FinalReleaseComObject(rngB);
            Marshal.FinalReleaseComObject(worksheet);
            Marshal.FinalReleaseComObject(workbook);

            rngResult = null;
            FindRange = null;
            rngB = null;
            worksheet = null;
            workbook = null;

            //Sleep unti export is complete
            Thread.Sleep(1000);

            //Show Excel
            app.Visible = true;

            //Cleanup
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
    }

    private void XLWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        if (e.ProgressPercentage < 0)
        {
            this.buttonActExport.Text = "Calculating...";
            toolStripProgressBar1.Visible = true;
            toolStripStatusLabel1.Visible = true;
        }
        else if (e.ProgressPercentage != 100)
        {
            this.buttonActExport.Text = ("Exporting: " + e.ProgressPercentage.ToString() + "%");
            toolStripProgressBar1.Value = e.ProgressPercentage;
        }
        else
        {
            this.buttonActExport.Text = "Done";
            toolStripProgressBar1.Value = e.ProgressPercentage;
        }
    }

    private void XLWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if ((e.Cancelled == true))
        {
            this.buttonActExport.Text = "Canceled!";
        }

        else if (!(e.Error == null))
        {
            this.buttonActExport.Text = ("Error: " + e.Error.Message);
        }
        else
        {
            this.buttonActExport.Text = "Done!";
        }
        this.buttonActExport.Text = "Export";
        this.buttonActExport.Enabled = true;
        toolStripProgressBar1.Visible = false;
        toolStripStatusLabel1.Visible = false;
        toolStripProgressBar1.Value = 0;
    }

您需要執行“合作取消”,您需要修改代碼以與取消過程“合作”,並優雅地停止其嘗試執行的操作。 所需要做的就是檢查整個代碼中的workerXL.CancellationPending ,如果返回true,則執行適當的步驟來“取消”該操作,例如處置必要的資源並關閉excel實例。

暫無
暫無

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

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