C#使用正则查找Excel表格里正确数据

上周加班两天,帮生产组在一万多条数据里面找出不正确的数据,都快找吐了,想到下次不能这样了,决定写个小工具,用正则来匹配正确的数据,并把不正确的数据保存到本地,以供查看。
经过网上查找,要实现想要的功能,需要分三步
1. 读取本地excel表格数据
2. 利用正则匹配正确的
3. 保存不正确的数据到本地
下面一步步实现

一、读取excel表格

由于新手,以前没有接触过这方面的内容,于是乎,呼唤度娘,在度娘上找到了一篇关于C#读取excel表格写的很好的博文关于C#读取excel表格写的很好的博文,摘抄如下:

——抄录开始—-
C#读取excel表格三种经典方法:
1.OLEDB方式
优点:将excel直接当做数据源处理,通过SQL语句直接读取内容,读取速度较快
缺点:读取方式不灵活,无法直接读取某一个单元格,只有将整个sheet页读取出来后放到DataTable中,再在DataTable中根据行列数来获取指定的值,当excel量很大时,会非常占用内存,当内存不够时,会抛出内存溢出的异常
读取代码,就不摘录了,想看的可以参考,毕竟我使用的是第二种笨的方法。
2.Com组件的方式(通过添加Microsoft.Office.Interop.Excel.dll实现)
优点:能够非常灵活的读取Excel中的数据,用户能够调用各种函数进行各种处理(暂时没发现)。
缺点:基于单元格的处理,读取速度较慢,对于数据量大的文件,最好不要使用此方法,使用此方法时,必须正确添加DLL引用才可以正确使用
我使用此种方法实现的,后面会给出代码的链接
3.NPIO方式读取Excel
NPIO是POI项目的.NET版本。POI是一个开源的Java读写Excel.Word等微软OLE2组件文档的项目。使用NPIO可以在没有安装Office或者相应环境的机器上对Word/Excel文档进行读写
优点:读取Excel速度较快,读取方式操作灵活
缺点:需要下载相应的插件并添加到系统引用当中
——抄录结束—-
打字真累。
由于我要读取的excel表格数据量比较大,大概有一万一千多条数据,为了防止在读取过程中程序假死,使用了backgroundworker组件进行异步操作,把耗时操作放在后台线程进行,交互界面只显示读取进度。百度了该组件的使用,又发现了一篇很好的博文
在使用该组件的时候,对读取excel表格的耗时操作主要实在事件DoWork中执行
(1)总结一下我使用backgroundworker组件的方法
把该组件单独放在一个窗体中,然后加一个取消按钮,这样可以在执行过程随时取消读取过程。
在主界面添加backgroundworker组件,若要在进度条窗体中执行该组件的事件函数,首先声明一个backgroundworker对象,然后需要在构造函数中把该组件的事件添加到该窗体。
在导入excel表格按钮函数中调用函数 RunWorkerAsync() 以触发DoWork事件 然后把属性WorkerReportsProgress WorkerSupportsCancellation 设置为true 使得事件ProgressChanged 可以被触
发 ,异步操作可以被取消。然后显示进度条窗体。在后台进行读取excel耗时操作时。
注意事项:
1.注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
2.不能跨线程调用控件。意思就是加入有两个线程thread1、thread2,在thread1中创建的控件control1,在thread2中 是不能使用control1的,否则会抛出不能跨线程调用控件的异常
(2)读取Excel表格首要声明几个需要的变量 。
类型为Excel.Application的变量app 表示Excel应用程序 用来打开 关闭Excel程序。
类型为Excel.Sheets的sheets的变量表示一个excel文件中所有的sheet页集合。该变量用来调用所引起get_Item() 得到想要读取的sheet页。
类型为Excel.Workbook的变量workbook用来表示一个打开的工作本。通过调用属性Worksheets获取一个打开的workbook中的sheet集合sheets ,然后sheets调用索引器get_Item()得到想要读取的sheet页, 得到确定的sheet页之后 首先获取该sheet页表格的行数和列数,然后利用两层for循环,把每一个单元格的数据存放到DataTable中,然后再对DataTable中的数据进行相关操作。

二、循环匹配正确的数据

利用正则类库的IsMathc(string input,string patten)在foreach循环里面对每一个单元格里的数据进行匹配,若匹配成功,进行下一个匹配 ,若匹配失败,则放在一个list中。有些正则是比较复杂的,不好写,因此可以参考正则生成 是一个比较不错的工具。

三、保存不正确的数据

最后把list里面所有不匹配的数据保存到本地。使用File类库的函数WriteAllLines(stirng path,string s) 保存到本地。

代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值