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 ...
随机推荐
- 百度地图HTML接口
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 条形码/二维码之开源利器ZXing图文介绍
全文目录: 基本介绍 二维码(比如:QRCode)的编码和解码演示 条形码(比如:EAN-13)的编码和解码演示 [一]. 基本介绍 : 1-1. ZXing是一个开源Java类库用于解析多种格式的条 ...
- 清除大文本中的html标签
public String clearHtmlText(String inputString) { if (StringUtils.isBlank(inputString)) { return &qu ...
- JavaScript 语法陷阱
没有一门编程语言是完美的,JavaScript 也不例外,它语法陷阱重重,防不胜防: 加号 "with" 分号自动插入 声明提升 "eval" 多行字符串 变量 ...
- WP Super Cache 安装与设置方法
1.首先,永久连接不能使用默认格式 2.修改永久链接格式,中文推荐采用 /%post_id%.html (这下你知道我的.orz哪里来了吧) 如果你和我一样蛋疼愿意为每篇文章写一个英语的post sl ...
- 帝国cms实现自动生成缩略图和自动分页功能
无论你手工发布,还是采集而来,免不了要进行手工操作弄缩略图,不然标题图片没有,挺烦人的 只需一次设定,就可以在文章编辑框里自动勾选上分页和生成缩略图,免除你次次进行操作的麻烦,好了,废话不多说,上菜“ ...
- Song of Pi
def main(): pi = ' # 预先给出需要比较的值 t = int(raw_input()) for _ in xrange(t): song = raw_input().strip(). ...
- Number Sequence--hdu1005
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- 异步编程设计模式Demo - PrimeNumberCalculator
using System; using System.Collections; using System.Collections.Specialized; using System.Component ...
- Xcode把应用程序打包成ipa
Xcode把应用程序打包成ipa 分类: App Store2012-11-20 15:47 11722人阅读 评论(0) 收藏 举报 Xcode教程 Xcode4发布测试 打包Archive操作是本 ...