C# [progressBar]进度条显示问题
如下一个方法,分别用DataGridView,ProgressBar,Label的对象作为参数。实现导出datagridview时显示进度条。
/// <summary>
/// 将datagridview导出为excel文件,导出过程中显示进度条
/// </summary>
/// <param name="dgv">DataGridView</param>
/// <param name="pb">progressBar</param>
/// <param name="ll">Label</param>
public static void ExportToExcel(DataGridView dgv, ProgressBar pb, System.Windows.Forms.Label ll)
{
System.Data.DataTable dt = dgv.DataSource as System.Data.DataTable;
if (dt == null) return;
Microsoft.Office.Interop.Excel.Application xlapp = new Microsoft.Office.Interop.Excel.Application();
if (xlapp == null)
{
MessageBox.Show("无法创建Excel对象,可能您的电脑未安装Excel");
return;
}
System.Windows.Forms.SaveFileDialog saveDia = new SaveFileDialog();
saveDia.Filter = "Excel|*xls";
saveDia.Title = "导出为Excel文件";
saveDia.FileName = string.Format("{0}.xls", DateTime.Now.ToString("yyyyMMddHHmmss"));
if (saveDia.ShowDialog() == System.Windows.Forms.DialogResult.OK && !string.Empty.Equals(saveDia.FileName))
{
Microsoft.Office.Interop.Excel.Workbooks workbooks = xlapp.Workbooks;
Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
Microsoft.Office.Interop.Excel.Range range = null;
long totalCount = dt.Rows.Count;
pb.Visible = true;//进度条显示
ll.Visible = true;//进度label显示
pb.Maximum = (int)totalCount;
long rowRead = 0;
float percent = 0;
string fileName = saveDia.FileName;
for (int i = 0; i < dt.Columns.Count; i++)
{
worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1];
range.Font.Bold = true;
range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
range.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, null);
}
for (int r = 0; r < dt.DefaultView.Count; r++)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
worksheet.Cells[r + 2, i + 1] = dt.DefaultView[r][i];
range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[r + 2, i + 1];
range.Font.Size = 9;
range.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, null);
range.EntireColumn.AutoFit();
}
rowRead++;
pb.Value = (int)rowRead;
percent = ((float)(100 * rowRead)) / totalCount;
ll.Text = percent.ToString("0.00").Trim() + "%";
System.Windows.Forms.Application.DoEvents();
}
range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideHorizontal].Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;
if (dt.Columns.Count > 1)
{
range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideVertical].Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;
}
try
{
workbook.Saved = true;
workbook.SaveCopyAs(fileName);
}
catch (Exception ex)
{
MessageBox.Show("导出文件时出错,文件可能正被打开!\n'" + ex.Message);
return;
}
workbook.Close();
if (xlapp != null)
{
xlapp.Workbooks.Close();
xlapp.Quit();
int generation = System.GC.GetGeneration(xlapp);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlapp);
xlapp = null;
System.GC.Collect(generation);
}
GC.Collect();//强行销毁
#region 强行杀死最近打开的exce进程
System.Diagnostics.Process[] excelProc = System.Diagnostics.Process.GetProcessesByName("EXCEL");
System.DateTime startTime = new DateTime();
int m, killId = 0;
for (m = 0; m < excelProc.Length; m++)
{
if (startTime < excelProc[m].StartTime)
{
startTime = excelProc[m].StartTime;
killId = m;
}
if (excelProc[killId].HasExited == false)
{
excelProc[killId].Kill();
}
#endregion
pb.Visible = false;
ll.Visible = false;
MessageBox.Show("导出成功!");
}
}
}
progressBar1.Maximum=int.Parse(textBox1 .Text );
for (int i = 0; i < int.Parse(textBox1.Text)+1; i++)
{
progressBar1.Value = i;
label1.Text = ((100 * i) / (int.Parse(textBox1.Text))).ToString() + "%";
label1.Refresh();
}
}
}
}
[解决办法]
这个进度条是什么控件,看起来不错
[解决办法]
用 BackgroundWorker不多好哈,以前我纠结一段时间,后来有网友推荐用,蛮好用的.
[解决办法]