C# WinFrom 导入Excel文件,显示进度条
因为WINForm程序是在64位上运行如果使用另外一种快速的读取Excel的方法会报“未在本地计算机上注册“Microsoft.Jet.OLEDB.12.0”提供程序”
所以我就换了现在这种读取有点慢的方式
PS 采用上一种方式要更改成32位,由于我的系统有其他需求只有64位支持,所以不得不放弃,而且也需要客户端注册这个
Form1
控件 一个显示路径的TextBox: txt_ExcelPath
两个按钮 Button:btn_selectpath,btn_savedata
一个backgroundWorker1组件
/// <summary>
/// 选择Excel文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_selectpath_Click(object sender, EventArgs e)
{
OpenFileDialog openFile = new OpenFileDialog();
openFile.Filter = "Excel(*.xlsx)|*.xlsx|Excel(*.xls)|*.xls";
openFile.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
openFile.Multiselect = false;
if (openFile.ShowDialog() == DialogResult.OK)
{
txt_ExcelPath.Text = openFile.FileName;
}
}
/// <summary>
/// 数据导入
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_datainto_Click(object sender, EventArgs e)
{
dt = new System.Data.DataTable();
this.backgroundWorker1.RunWorkerAsync(); // 运行 backgroundWorker 组件
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
RadProcessBar form = new RadProcessBar(this.backgroundWorker1);// 显示进度条窗体
form.ShowDialog(this);
form.Close(); }
此处的RadProcessBar 是显示进度条的窗体(进度条期间禁止其他操作)
以下是backgroundWorker1组件的一些事件
/// <summary>
/// 完成进程工作之后的处理动作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
else if (e.Cancelled)
{
dt = new System.Data.DataTable(); //如果取消重新定义datatable
}
else
{
dataGridView1.DataSource = dt;
}
} private System.Data.DataTable dt = new System.Data.DataTable(); //你可以在这个方法内,实现你的调用,方法等。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//System.Data.DataTable dt = GetDataFromExcelByCom();
//dataGridView1.DataSource = dt;
BackgroundWorker worker = sender as BackgroundWorker;
string[] columnName = { "", "", "", "", "", "", "", "" };
string excelFilePath = txt_ExcelPath.Text.Trim();
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Sheets sheets;
object oMissiong = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Excel.Workbook workbook = null; try
{
if (app == null) return ;
workbook = app.Workbooks.Open(excelFilePath, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong,
oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong);
sheets = workbook.Worksheets; //将数据读入到DataTable中
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)sheets.get_Item();//读取第二张表 次数我的测试Excel中数据在2表中
if (worksheet == null) return ; int iRowCount = worksheet.UsedRange.Rows.Count;
int iColCount = ;// worksheet.UsedRange.Columns.Count;//个人根据需求选择数据源的列数
//生成列头
for (int i = ; i < iColCount; i++)
{
var name = columnName[i]; //"column" + i;
while (dt.Columns.Contains(name)) name = name + "_1";//重复行名称会报错。
dt.Columns.Add(new DataColumn(name, typeof(string)));
}
//生成行数据
Microsoft.Office.Interop.Excel.Range range;
int rowIdx = ;//第一行为标题 实际数据从第二行开始
for (int iRow = rowIdx; iRow <= iRowCount; iRow++)
{
DataRow dr = dt.NewRow();
for (int iCol = ; iCol <= iColCount; iCol++)
{
range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[iRow, iCol];
dr[iCol - ] = (range.Value2 == null) ? "" : range.Text.ToString();
}
dt.Rows.Add(dr);
Thread.Sleep();
worker.ReportProgress(iRow*/iRowCount);//加载进度条
if (worker.CancellationPending) // 如果用户取消则跳出处理数据代码
{
e.Cancel = true;
break;
} } }
catch { return; }
finally
{
workbook.Close(false, oMissiong, oMissiong);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
workbook = null;
app.Workbooks.Close();
app.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
app = null;
}
}
进度条Form RadProcessBar
一个progressBar1 一个按钮
public partial class RadProcessBar : Form
{ private BackgroundWorker backgroundWorker1; //ProcessForm 窗体事件(进度条窗体) public RadProcessBar(BackgroundWorker backgroundWorker1)
{
InitializeComponent(); this.backgroundWorker1 = backgroundWorker1;
this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
} void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Close();//执行完之后,直接关闭页面
} void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
} private void btn_cancel_Click(object sender, EventArgs e)
{
this.backgroundWorker1.CancelAsync();
this.btn_cancel.Enabled = false;
this.Close();
}
}
C# WinFrom 导入Excel文件,显示进度条的更多相关文章
- VC下载文件显示进度条
VC下载文件显示进度条 逗比汪星人2009-09-18上传 by Koma http://blog.csd.net/wangningyu http://download.csdn.net/deta ...
- JS原生上传大文件显示进度条-php上传文件
JS原生上传大文件显示进度条-php上传文件 在php.ini修改需要的大小: upload_max_filesize = 8M post_max_size = 10M memory_li ...
- VC下载文件 + 显示进度条
在codeproject里找了许久,发现这样一个VC下载文件并显示进度条的源码,于是添加了些中文注释: 1.下载线程函数: UINT DownloadFile(LPVOID pParam) { CWn ...
- jQuery上传文件显示进度条
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script sr ...
- libcurl开源库在Win32程序中使用下载文件显示进度条实例
一.配置工程引用libcurl库 #define CURL_STATICLIB #include "curl/curl.h" #ifdef _DEBUG #pragma comme ...
- Android 下载文件 显示进度条
加入两个权限 一个是联网,另一个是读写SD卡 <uses-permission android:name="android.permission.INTERNET">& ...
- delphi CopyFileProgressBar 拷贝文件显示进度条
CopyFileProgressBar(pwidechar(ListBox1.Items.Strings[I]),pwidechar(NewDir+'\'+ExtractFileName(ListBo ...
- Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现)(转)
Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现) 相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦 ...
- WPF下载远程文件,并显示进度条和百分比
WPF下载远程文件,并显示进度条和百分比 1.xaml <ProgressBar HorizontalAlignment="Left" Height="10&quo ...
随机推荐
- idea导入项目出错
在idea导如项目后,总是会报错,每个类都会报错.解决的办法是: 1. 2.添加本地jdk 3.添加项目中的lib包
- cellForRowAtIndexPath方法不执行的那些坑
今天用到了uitableview,是xib形式的.不过cellForRowAtIndexPath方法死活不执行,检查了返回的row数量,section的数量,数据源,代理都没问题,不过cellForR ...
- .net 4.0 面向对象编程漫谈基础篇读书笔记
话说笔者接触.net 已有些年头,做过的项目也有不少,有几百万的,也有几十万的,有C/S的,也有B/S的.感觉几年下来,用过的框架不少,但是.net的精髓一直没有掌握.就像学武之人懂得各种招式,但内功 ...
- 基于Pojo的开发模式(day03)
上一次的文章讨论到了Spring的设计目标:使得JEE开发更易用. ok,作为一个Java开发人员,应该都知道struts这个框架,不知道是否大家都清楚struts1和struts2的区别. 首先,这 ...
- arry()数组的理解及api的使用(一)
我们想要了解数组,首先就要先要了解到什么是数据结构,所谓的数据结构就是把数据与数据见的关系按照特定的结构来保存.设计合理的数据结构是解决问题的前提.了解了数据结构后我们下面来数组的定义:数组(arra ...
- Reverse digits of an integer.
class Solution { public: int reverse(int x) { ;//long 是怕中间过程溢出 <<,max=-min-){ ans=ans*+x%; x=x ...
- 给软件增加注册功能 c#
1.软件注册类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- cxiamge 使用静态库 vs2010
首先下载cxiamge,我使用的是cxiamge_702 下载地址:http://download.csdn.net/detail/xing_ping_1987/8085129 编译静态库 新建项目, ...
- Erlang中的图形化检测工具(4)
这儿例举出若干个用于检视运行时系统的图形化工具,这些工具可以很好地帮助我们增进对系统的理解.借助这些工具,我们可以很好地以图形化方式观察进程.应用和监督层级. (1) Appmon.Appmon 是用 ...
- python列表sort方法的两个参数key, reverse
使用列表的sort方法可以进行排序,其中有两个参数用来表示排序的方式,代码: In [7]: a = ['x11','abc323','e26','112ddd'] In [8]: a.sort(ke ...