免费预览已结束,剩余63页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Excel连接字符串在.NET中的应用介绍几种在.NET中直接连接Excel作为数据源的几种方法以及连接字符串的说明。Microsoft Jet OLE DB 4.0Provider=Microsoft.Jet.OLEDB.4.0;DataSource=C:MyExcel.xls;ExtendedProperties=Excel8.0;HDR=Yes;IMEX=1;64位机器可以看这里/Articles/Show/using-jet-in-64-bit-environments。如果上面的连接字符串不奏效,可以尝试下面的格式。有些早期版本的2003格式的Excel文件需要在连接字符串中添加OLEDB前缀作为Provider标识。OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;DataSource=C:MyExcel.xls;ExtendedProperties=Excel8.0;HDR=Yes;IMEX=1;连接字符串中的双引号是必须的,请注意在代码中进行转义。C#,C+中使用对双引号进行转义。VB6,VBScript中使用对双引号进行转义。XML(或web.config)中使用"对双引号进行转义。HDR=Yes;用于指示将Excel表格中的第一行作为标题,此时在查询语句中可以将标题作为数据表的字段名使用。HDR=No;则表示将Excel表格中的所有行都作为数据内容而不包含标题,此时在查询语句中需要使用F1,F2等作为字段名。如第一列为F1,第二列为F2等,以此类推。IMEX=1;用于指示始终将Excel单元格中的内容作为text类型的数据。该选项会对Excel文件内容的回写产生影响。SQL语法:Select Column Name One, Column Name Two From Sheet One$。注意Excel wooksheet的名字必须以$结尾并且包含在方括号中。列名如有需要也应当包含在方括号中(如列名中包含有空格其它特殊字符等)。如何通过程序获取指定Excel文件中各个Sheet的名称?using(OleDbConnectionconnection=newOleDbConnection(connectionString)DataTabledt=connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,newobjectnull,null,null,Table);stringsqlStr=Select*From +dt.Rows0TABLE_NAME.ToString();除了表名和列名的写法有所不同外,SQL语句的使用方法和在SQL Server中基本相同。在.NET中数据访问层仍然可以使用OleDbHelper类,使用方法与普通的数据库一样。另外,如果指定的Excel文件需要密码才能打开,你需要在连接字符串中提供连接密码,否则打开Excel文件会失败。具体的内容可以看这里,/Articles/Show/how-to-open-password-protected-excel-workbookACE OLEDB 12.0Provider=Microsoft.ACE.OLEDB.12.0;DataSource=c:myFoldermyOldExcelFile.xls;ExtendedProperties=Excel12.0;HDR=YES;使用ACE 12.0可以连接早期版本(97-2003)的Excel文件,对于2003以后版本的Excel也通用,但前提是Office组件中安装了对应的ACE,否则无法使用。可以去下面的地址下载ACE组件。/download/en/details.aspx?id=13255该连接字符串同样适用于Xlsb和Xlsm格式的Excel文件。Microsoft Excel ODBC DriverDriver=MicrosoftExcelDriver(*.xls);DriverId=790;Dbq=C:MyExcel.xls;DefaultDir=c:mypath;使用ReadOnly=0表示连接是只读的,所有对数据源的更新操作将不可回写。Driver=MicrosoftExcelDriver(*.xls);Dbq=C:MyExcel.xls;ReadOnly=0;.NET xlReader for Microsoft ExcelDataSource=c:myExcelFile.xlsx;HDR=yes;Format=xlsx;注意上面的连接字符串中使用了HDR=yes参数,表示将Excel数据表的首行作为标题。.NET WinForm中使用Timer定时更新ProgressBar的进度 在.NET WinForm程序中,大多数情况下我们是知道程序运行所需要的时间或步骤的,比如批量复制文件时文件的数量,数据导出或导入时数据的总行数等等。对于步骤比较确定的操作,如果程序执行过程时间较长,很容易使用BackgroundWorker结合ProgressBar来显示一个实时的进度。相关内容大家可以看我博客中的其它文章,有关如何使用BackgroundWorker和ProgressBar。但是,有的时候我们是不确定程序执行的具体步骤或时长的,比如连接一个远程服务或数据库服务,或者调用一个远程过程或WebService等,这个时候我们就没有办法去触发BackgroundWorker的ProgressChanged事件,因此也就不能实时去更新ProgressBar的进度了。有两种替代的办法可以解决这个问题。第一是将ProgressBar的Style设置为Marquee而不是默认的Blocks。在Marquee模式下,进度条会不停地向前走用来模拟一个长时间的操作。事实上,Windows中也有很多类似的进度条,大多都是出现在对操作过程所需的步骤和时长不太确定的时候。这种方法很简单,不过你仍然要将后台的执行过程放到多线程来执行,否则进度条会卡在UI线程中。一个好的办法就是依旧使用BackgroundWorker组建,将后台的执行程序放到BackgroundWorker的DoWorker事件中,然后调用BackgroundWorker的RunWorkerAsync方法来异步执行程序。这样,UI线程和后台执行程序的线程可以分开,进度条便不会再卡了。第二种方法是使用System.Windows.Forms.Timer定时器控件,设置好Timer的Interval间隔时间,在Timer的Tick事件中来更新ProgressBar的进度。由于Timer天生就是多线程的,所以这种办法实现起来很方便。1usingSystem;2usingSystem.Collections.Generic;3usingSystem.ComponentModel;4usingSystem.Data;5usingSystem.Drawing;6usingSystem.Linq;7usingSystem.Text;8usingSystem.Windows.Forms;9usingSystem.Threading;1011namespaceWindowsFormsApplication21213publicpartialclassForm1:Form1415privateBackgroundWorkerworker=newBackgroundWorker();16privateSystem.Windows.Forms.Timertimer=newSystem.Windows.Forms.Timer();17publicForm1()1819InitializeComponent();20gressBar1.Value=0;21gressBar1.Maximum=200;22gressBar1.Step=1;23timer.Interval=100;24timer.Tick+=newEventHandler(timer_Tick);25worker.WorkerReportsProgress=true;26worker.DoWork+=newDoWorkEventHandler(worker_DoWork);27worker.RunWorkerCompleted+=newRunWorkerCompletedEventHandler(worker_RunWorkerCompleted);28worker.RunWorkerAsync();29timer.Start();303132voidtimer_Tick(objectsender,EventArgse)3334if(gressBar1.VgressBar1.Maximum)3536gressBar1.PerformStep();37383940voidworker_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse)4142timer.Stop();43gressBar1.Value=gressBar1.Maximum;44MessageBox.Show(Complete!);454647voidworker_DoWork(objectsender,DoWorkEventArgse)4849intcount=100;50for(inti=0;i1?s:);567privatevoiddataGridView1_DataBindingComplete(objectsender,DataGridViewBindingCompleteEventArgse)89BindingSourcedata=this.dataGridView1.DataSourceasBindingSource;10if(data=null|data.DataSource=null)1112return;131415/*Showtotalrecordsnumber*/16/Retrievetheunfilteredrowcountby17/temporarilyunfilteringthedata.18data.RaiseListChangedEvents=false;19StringoldFilter=data.Filter;20data.Filter=null;21intiTotalNum=data.Count;22this.toolStripStatus_Total.Text=string.Format(Totalof0record1.,iTotalNum.ToString(),iTotalNum1?s:);23data.Filter=oldFilter;24data.RaiseListChangedEvents=true;2526/*Showfilterinformation.*/27intiFilterNum=data.Count;28stringfilter=data.Filter;29if(String.IsNullOrEmpty(filter)3031this.toolStripStatus_Separator2.Visible=false;32this.toolStripStatus_Filter.Visible=false;33this.toolStripStatus_ShowAll.Visible=false;3435else3637this.toolStripStatus_Separator2.Visible=true;38this.toolStripStatus_Filter.Visible=true;39this.toolStripStatus_ShowAll.Visible=true;40this.toolStripStatus_Filter.Text=string.Format(0record1found.,iFilterNum.ToString(),iFilterNum1?s:);41this.toolStripStatus_Filter.Text+=(Filter:+filter+);42434445privatevoidtoolStripStatus_ShowAll_Click(objectsender,EventArgse)4647DataGridViewAutoFilterColumnHeaderCell.RemoveFilter(this.dataGridView1);481. 当前用户选择的总行数。2. DataGridView中一共有多少行。3. Filter的信息及使用Filter之后的数据行数。4. 用于移除Filter的链接。代码中一个是三个事件,dataGridView1_SelectionChanged事件用于在DataGridView行被选择时触发,用来更新StatusStrip中当前用户选择的总行数;dataGridView1_DataBindingComplete事件在DataGridView数据完成绑定时触发,用来更新StatusStrip中Filter的信息及使用Filter之后的数据行数,以及DataGridView的数据总行数,注意其中将BindingSource的RaiseListChangedEvents设置为false以取得DataGridView数据源中的真实数据行数,之后再将其设置为true以获取到Filter的相关信息;toolStripStatus_ShowAll_Click事件为用户点击Show All链接时触发,用于移除DataGridView中的Filter。.NET WinForm下一个支持更新ProgressBar进度的DataGridView导出数据到Excel的类 将DataGridView数据导出到Excel的方法大家应该都不陌生,无非就是对DataGridView进行行和列的遍历,将数据写入到Excel Workbook中,不过项目中需要添加对Excel的COM引用,这个会受到客户端环境的限制。如果直接将数据以CSV的形式导出就更简单了,CSV是一种简单的以分隔符(如逗号,Tab制表符等)分隔数据的文件,支持用Excel或记事本打开。一般而言,直接将数据导出到CSV文件中速度会比较快,但是如果将数据导出到Excel标准格式的文件中时需要调用COM组件中的对象,因此速度会慢一些,这时考虑在UI中加入一个实时进度条是有必要的。如何在多线程中使用ProgressBar相信很多人也都不陌生了,最简单的方法就是使用BackgroundWorker组件,将数据导出的代码放到BackgroundWorker的DoWork事件处理程序中去完成,并实时报告进度,BackgroundWorker的ProgressChanged事件用于更新UI线程中ProgressBar的值,BackgroundWorker的RunWorkerCompleted事件则用来处理操作完成之后的一些事情,例如隐藏ProgressBar,或者显示错误信息等。但是,这里会有一个问题。数据导出的方法一般来说是一个公共方法,它允许在应用程序的不同地方被调用,因此该方法不应该依赖于任何一个窗体或UI元素,我们应该想办法将它独立出来专门写成一个类,同时它还要能支持ProgressBar的更新。按照传统的使用BackgroundWorker的方法,我们需要将BackgroundWorker传递到这个类中,同时类里面还需要处理与BackgroundWorker相关的事件,以及与UI相关的一些事情,这显然违背了敏捷开发中的“单一指责原则一个类只允许有一个引起它变化的原因”。引入太多与UI相关的元素会导致类不够通用,实现起来也很困难。如何从DataGridView导出数据到Excel或CSV文件应该不是什么难事,现在的主要问题是如何支持ProgressBar的进度实时更新。一个比较好的办法是采用.NET的事件驱动方式。我们可以在类中定义几个事件,例如开始进行数据导出时的事件,数据正在导出时的事件,数据导出完成之后的事件。调用端通过注册这些事件来取得与类的联系。说白了,联系的纽带就是事件,这个和WinForm程序中各个窗体之间进行互动的原理一样。来看看这些事件的主要用途。1. 开始进行数据导出时的事件该事件在数据真正开始导出之前被触发,用来获取数据导出总共需要多少步(通常可以认为是DataGridView数据中行和列的总和,试具体导出方式而定)。调用方在事件处理程序中可以更新ProgressBar的属性,如Value,Maximnm,Visible等。2. 数据正在导出时的事件该事件主要负责更新ProgressBar的进度。我们规定每导出一行或一列数据即触发一次事件。调用方在事件处理程序中更新ProgressBar的进度。3. 数据导出完成之后的事件在导出数据的方法中,无论什么情况(成功结束或抛出异常)只要结束了数据导出即触发该事件,同时传递一个自定义的继承自EventArgs类的参数。调用方在事件处理程序可以根据这个参数来判断数据导出是否成功完成,从而决定是在UI线程中显示错误信息或给出工程完成的提示信息。注意调用方在事件处理程序中必须使用Invoke通过代理来更新UI,否则会抛跨线程UI操作的异常。而对于像MessageBox.Show()这样的模态对话框,如果不是在Invoke中通过代理来调用,它会因为在非UI线程中被执行而失去模态对话框的作用。类的完整代码:ExportDataGridViewToExcel.zip前端调用的例子:privateExportDataGridViewToExcelexport=null;publicDetailsTable()InitializeComponent();export=newExportDataGridViewToExcel();export.DataGridViewControl=this.dataGridView1;export.ExportStartingEvent+=newEventHandler(export_ExportStartingEvent);export.ExportProgressingEvent+=newEventHandler(export_ExportProgressingEvent);export.ExportEndedEvent+=newEventHandler(export_ExportEndedEvent);/Dataexportendevent.voidexport_ExportEndedEvent(objectsender,ExportDataGridViewToExcel.ExportEndedEventArgse)if(e.IsCompleted)if(this.InvokeRequired)this.Invoke(newMethodInvoker(delegate()MessageBox.Show(Complete!,Prompt,MessageBoxButtons.OK,MessageBoxIcon.Information););elseif(this.InvokeRequired)this.Invoke(newMethodInvoker(delegate()MessageBox.Show(this,Exportfilefailed.rn0+e.Errors=null?string.Empty:e.Errors.Message,Errors,MessageBoxButtons.OK,MessageBoxIcon.Error););if(this.InvokeRequired)this.Invoke(newMethodInvoker(delegate()this.toolStripProgressBar.Visible=false;);/Dataexportinprocessevent.voidexport_ExportProgressingEvent(objectsender,EventArgse)intnowValue=Convert.ToInt32(sender);if(this.InvokeRequired)this.Invoke(newMethodInvoker(delegate()this.toolStripProgressBar.Value=nowValue;);/Dataexportstartingevent.voidexport_ExportStartingEvent(objectsender,EventArgse)intmaxValue=Convert.ToInt32(sender);if(this.InvokeRequired)this.Invoke(newMethodInvoker(delegate()this.toolStripProgressBar.Value=0;this.toolStripProgressBar.Maximum=maxValue;this.toolStripProgressBar.Visible=true;);/ExporttoCSV.privatevoidexportToCSVToolStripMenuItem_ExportToCSV_Click(objectsender,EventArgse)this.saveFileDialog_CSV.FileName=this.Text;if(saveFileDialog_CSV.ShowDialog()=System.Windows.Forms.DialogResult.OK)export.FilePath=saveFileDialog_CSV.FileName;Threadthread=newThread(newParameterizedThreadStart(export.DataGridViewToCSV);thread.Start(saveFileDialog_CSV.OpenFile();/ExporttoExcel.privatevoidexportToExcelToolStripMenuItem_ExportToExcel_Click(objectsender,EventArgse)this.saveFileDialog_Excel.FileName=this.Text;if(saveFileDialog_Excel.ShowDialog()=System.Windows.Forms.DialogResult.OK)export.FilePath=saveFileDialog_Excel.FileName;Threadthread=newThread(newThreadStart(export.DataGridViewToExcel);thread.Start();privatevoidcopyToolStripMenuItem_Copy_Click(objectsender,EventArgse)DataObjectd=this.dataGridView1.GetClipboardContent();Clipboard.SetDataObject(d);privatevoidtoolStripButton_ToExcel_Click(objectsender,EventArgse)this.exportToExcelToolStripMenuItem_ExportToExcel.PerformClick();privatevoidtoolStripButton_ToCSV_Click(objectsender,EventArgse)this.exportToCSVToolStripMenuItem_ExportToCSV.PerformClick();最后三个事件处理程序依次是:DataGridView上下文菜单中的Copy事件;DataGridView上下文菜单中Export to Excel事件,可以直接使用exportToExcelToolStripMenuItem工具条按钮的PerformClick方法;DataGridView上下文菜单中的Export to CSV事件,直接使用exportToCSVToolStripMenuItem工具条按钮的PerformClick方法。.NET WinForm程序在Windows7下实现玻璃效果和任务栏进度条效果Windows7提供了许多不错的用户体验,诸如窗体背景透明、玻璃磨砂效果、任务栏的JumpList定义以及任务栏进度条显示等等。伴随着这些特效的出现,Windows在底层也提供了相应的API支持,使得开发人员可以根据需要非常容易地在自己的应用程序中实现这些效果。如果你是原生的C+追随者,那恭喜你了!你完全可以毫无障碍地去使用这些API,前提是你需要阅读庞大的开发文档。如果你是新生的.NET开发人员(姑且还是将.NET developer称之为新生者吧,毕竟咱比C+出来得晚),也没有关系,微软在msdn网站中也发布了专门的Windows7 API托管类库,专门用于在.NET应用程序中调用。先来看看IE浏览器在Windows 7下下载文件时任务栏的进度条显示吧,相信很多人都不会陌生,如果你还闻所未闻,要么是你已经out了要么就是你从来就没有关注过Windows 7的这些细节。要在你自己的.NET应用程序中实现这个效果仅仅靠现有的.NET类库是不够的,必须要借助于Windows 7 API的支持。有关在托管代码中调用Windows 7 API可以看微软msdn上的一篇文章,/WindowsAPICodePack。首先需要下载并安装Windows_API_Code_Pack_Self_Extractor,其实就是一个压缩包,里面包含了所有的源代码以及大量的示例,并附有文档可以查阅,非常详细。不过使用这些类库有几个前提条件:1. .NET Framework的版本必须是3.5SP1及以上。2. 运行的环境必须是在Windows 7 RTM及其相关版本,在Vista下部分功能可用。3. 需要DirectX的支持。下面是我用这些类库实现的一个效果,包含了窗体透明玻璃磨砂效果以及任务栏进度条显示。实现的代码很简单,但前提是你引用了WindowsAPICodePack的相关类库。usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Threading;usingMicrosoft.WindowsAPICodePack.Taskbar;usingMicrosoft.WindowsAPICodePack.Shell;namespaceVerticalProgressBarpublicpartialclassForm1:GlassFormprotectedBackgroundWorkerworker=null;publicForm1()InitializeComponent();worker=newBackgroundWorker();worker.WorkerReportsProgress=true;worker.DoWork+=newDoWorkEventHandler(worker_DoWork);worker.ProgressChanged+=newProgressChangedEventHandler(worker_ProgressChanged);worker.RunWorkerCompleted+=newRunWorkerCompletedEventHandler(worker_RunWorkerCompleted);worker.RunWorkerAsync();voidworker_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse)MessageBox.Show(Complete!);voidwo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江省鄞州中学2026届数学高二上期末检测模拟试题含解析
- 2026届内蒙古巴彦淖尔第一中学高二上生物期末质量检测试题含解析
- 辽宁省建平县高级中学2026届高一生物第一学期期末综合测试试题含解析
- 销售回款培训
- 山东省潍坊新2026届高二上生物期末质量检测试题含解析
- 销售公司新员工培训课件模
- 熟食门安全卫生制度
- 上海市十校2026届语文高三上期末学业水平测试试题含解析
- 卫生院分级预警制度
- 牛肉操作间卫生管理制度
- 2024-2025学年度高一英语下学期期中试卷(北师大版含答案)
- 银行从业者观《榜样》心得体会
- 农村年底活动方案
- 2024届山东省威海市高三二模数学试题(解析版)
- 设备管理奖罚管理制度
- LINE6效果器HD300中文说明书
- 2025年航运行业安全生产费用提取和使用计划
- 纳米纤维凝胶隔热材料的应用研究进展
- 蟹苗买卖合同协议
- 2025年社区养老服务补贴政策及申领方法
- 胸外科手术围手术期的护理
评论
0/150
提交评论