我想实现在导出excel时显示一进度条,注意不是状态样那里的,但是进度条总是不行,有人知道为什么吗?
思路:在excel生成一行时(通过for循环),就改变一次processbar的值,gridView中有多少行,就用100除以行数。
progressBarValue,progressBarStep为公共变量,在excel生成一行时(通过for循环)不断改变它的值,再传到进度条窗口中显示。
代码如下:
进度条窗口代码:
    public partial class Processbar : Form
    {
        public  int progressBarValue;
        public  int progressBarStep;
        public Processbar()
        {
            InitializeComponent();
        }        private void 操作进行中_Load(object sender, EventArgs e)
        {
            SetProcessbar();
        }
        private void  SetProcessbar()
            {
            //public static  System.Windows.Forms.ToolStripProgressBar _toolStripProgressBar1this.progressBar1;
            progressBar1.Maximum = 100;//设置最大长度值
            //progressBar1.Value = 0;//设置当前值
            progressBar1.Step = 100 / (EquipmentMS.Dal.DataGripViewExport._gridView.RowCount);//设置没次增长多少
            //progressBar1.Value += progressBar1.Step;//让进度条增加一次
            progressBar1.Value = progressBarValue;
            progressBar1.Step = progressBarStep;
            if (progressBarValue > 99)
            {
                this.Close();
            }导出excel时的部分代码(主要是控制进度条的值):
public static void ExportTOExcel()
        {
            if (gridView.Rows.Count == 0)
            {
                MessageBox.Show("没有数据可供导出!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            else
            {
                saveFileDialog.Filter = "Execl files (*.xls)|*.xls";
                saveFileDialog.FilterIndex = 0;
                saveFileDialog.RestoreDirectory = true;
                saveFileDialog.CreatePrompt = true;
                saveFileDialog.Title = "导出文件保存路径";
                saveFileDialog.ShowDialog();
                string strName = saveFileDialog.FileName;
                if (strName.Length != 0)
                {
                    //new EquipmentMS.Equipment.Processbar().ShowDialog();
                    //toolStripProgressBar1.Visible = true;
                    showPressbarThreadStart();
                    System.Threading.Thread.Sleep(1000);
                    System.Reflection.Missing miss = System.Reflection.Missing.Value;
                    Microsoft.Office.Interop.Excel.ApplicationClass excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
                    excel.Application.Workbooks.Add(true); ;
                    excel.Visible = false;//若是true,则在导出的时候会显示EXcel界面。
                    if (excel == null)
                    {
                        MessageBox.Show("EXCEL无法启动!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                    Microsoft.Office.Interop.Excel.Workbooks books = (Microsoft.Office.Interop.Excel.Workbooks)excel.Workbooks;
                    Microsoft.Office.Interop.Excel.Workbook book = (Microsoft.Office.Interop.Excel.Workbook)(books.Add(miss));
                    Microsoft.Office.Interop.Excel.Worksheet sheet = (Microsoft.Office.Interop.Excel.Worksheet)book.ActiveSheet;
                    sheet.Name = "sheet1";                    //生成字段名称
                    for (int i = 1; i < gridView.ColumnCount; i++)
                    {
                        excel.Cells[1, i ] = gridView.Columns[i].HeaderText.ToString();
                    }
                    //填充数据
                    for (int i = 0; i < gridView.RowCount - 1; i++)
                    {
                        for (int j = 1; j < gridView.ColumnCount; j++)
                        {
                            if (gridView[j, i].Value == typeof(string))
                            {
                                excel.Cells[i + 2, j] = "" + gridView[i, j].Value.ToString();
                            }
                            else
                            {
                                excel.Cells[i + 2, j] = gridView[j, i].Value.ToString();
                            }
                        }
                        EquipmentMS.Equipment.Processbar b = new EquipmentMS.Equipment.Processbar();
                        b.progressBarValue = b.progressBarValue + (100 / gridView.RowCount);
                        //(EquipmentMS.Equipment.Processbar.progressBarValue) += EquipmentMS.Equipment.Processbar.progressBarStep;
                    }
                    sheet.SaveAs(strName, miss, miss, miss, miss, miss, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss);
                    book.Close(false, miss, miss);
                    books.Close();
                    excel.Quit();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(books);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
                    GC.Collect();
                    MessageBox.Show("数据已经成功导出到:" + saveFileDialog.FileName.ToString(), "导出完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    showPressbarThreadAbort();
                    //EquipmentMS.Equipment.Processbar.Close();
                    //EquipmentMS.Equipment.Processbar.progressBarValue = 0;
                    //EquipmentMS.Equipment.Processbar.Visible = false;
                }
            }
        }

解决方案 »

  1.   

    我觉得,用for就是个错误,应该用while
      

  2.   

    关键代码:
    进度条窗口和获取进度条的值是分别在不同的winform文件的。
    1、进度条窗口processbar.cs:        public  int progressBarValue; 
            public  int progressBarStep; 
    ......
                progressBar1.Step = 100 / (EquipmentMS.Dal.DataGripViewExport._gridView.RowCount);//设置没次增长多少 
                //progressBar1.Value += progressBar1.Step;//让进度条增加一次 
                progressBar1.Value = progressBarValue; 
                progressBar1.Step = progressBarStep; 2、获取进度条的值DataGripViewExport.cs:
    //填充数据 
                        for (int i = 0; i < gridView.RowCount - 1; i++) 
                        { 
                            for (int j = 1; j < gridView.ColumnCount; j++) 
                            { 
                                if (gridView[j, i].Value == typeof(string)) 
                                { 
                                    excel.Cells[i + 2, j] = "" + gridView[i, j].Value.ToString(); 
                                } 
                                else 
                                { 
                                    excel.Cells[i + 2, j] = gridView[j, i].Value.ToString(); 
                                } 
                            } 
                            EquipmentMS.Equipment.Processbar b = new EquipmentMS.Equipment.Processbar(); 
                            b.progressBarValue = b.progressBarValue + (100 / gridView.RowCount); 
                            //(EquipmentMS.Equipment.Processbar.progressBarValue) += EquipmentMS.Equipment.Processbar.progressBarStep; 
                        } 
      

  3.   

     EquipmentMS.Equipment.Processbar b = new EquipmentMS.Equipment.Processbar(); 
                            b.progressBarValue = b.progressBarValue + (100 / gridView.RowCount); 
                            //(EquipmentMS.Equipment.Processbar.progressBarValue) += EquipmentMS.Equipment.Processbar.progressBarStep; 
    EquipmentMS.Equipment.Processbar b = new EquipmentMS.Equipment.Processbar(); 
    这个怎么在For循环里啊 错在这里吧
    EquipmentMS.Equipment.Processbar  这个你自己写的控件? 
      

  4.   

    EquipmentMS.Equipment.Processbar b = new EquipmentMS.Equipment.Processbar(); //主要是用用启动显示进度条窗口的。
     b.progressBarValue = b.progressBarValue + (100 / gridView.RowCount); // 赋值给进度条的值看得明白吗?
      

  5.   

    HA HA HA HA HA!!!!!!