动态处理excel转换CSV文件实践

之前写的一个小工具,为了保证处理数据的速度,需要csv的数据文件。之前总是用Excel文件另存为获得,这往往造成许多不便,尤其是使用有多个sheet的表格的文件另存为时出现问题的概率更高。因此,想改进一下程序,初步的优化目标是:程序判断所选文件是Excel文件还是csv文件(openfiledialog筛选剩此两种文件),若是csv文件则按原程序流程执行。如果是Excel文件则进行另存为处理,若有多个数据sheet则,弹出可选择sheet对话框,选择相应的sheet项将改文件另存为csv文件,之后按原程序流程进行。

任务过程中遇到的问题及处理方法

1)处理Excel文件首先要在项目中添加引用com组件中的Microsoft Excel XX object library。可参看博文http://blog.csdn.net/tekuiero/article/details/50534001。另外,在后台处理Excel文件的时候,会出现程序退出后Excel后台进程无法关闭的情况,原因是默认情况关闭Excel后台使用时,会弹出警告对话框,供用户选择后才会完全关闭。而程序调用则无法显示该弹出的对话框,因此卡在此位置。解决方法是需要将DisplayAlerts属性设置为false,然后调用Quit()方法;

2)  在处理多个sheet项的Excel文件的时候,希望能够动态弹出带有sheet名的radiobutton项,在用户选取其中之一后执行后续程序流程。动态生成控件的难度不大,只需要定义好控件的位置大小等属性就基本上没有问题,问题的难点在于如何使用动态生成的控件,并且让程序在此处等待用户操作。在解决问题过程中,发现窗体的showdialog()方法可以实现阻断父窗体程序的功能,属于模态显示,与show()不同可以参看http://blog.csdn.net/zlwzlwzlw/article/details/7915862,其中有详细介绍。

2.1)小功能:使用showdialog()时,要使子窗体居中于父窗体显示,要在构造函数处添加this.StartPosition = FormStartPosition.CenterParent; https://www.cnblogs.com/sufei/archive/2012/12/03/2799468.html该文有详细介绍。

3)在确定了控件载体之后,就是动态添加radiobutton并遍历radiobutton选出其中选中的值,使用了遍历控件的方法foreach (RadioButton rb in gb.Controls.OfType<RadioButton>())可以遍历相关的控件类型,另外由于需要点击按钮来确定选中的radiobutton,在添加button事件时,用到了button.click=new EventHandler(this.clickbutton),然后定义clickbutton(object sender,EventArgs e)函数即可。在执行该方法时需要遍历之前生动态生成的radiobutton,此处不能再次生成子窗体的应用实例,新生成的实例没有任何控件。因此需要子窗体的实例定义为全局属性。按钮添加的事件运行结束之后,便可以关闭子窗体,因为使用了showdialog(),因此关闭子窗体之后,父窗体程序阻断消失,程序从showdialog()下一行开始继续执行。

至此,动态监测选择文件是否为Excel,若为Excel文件弹出的Excelsheet项供用户选择并转化为csv文件,且不影响原来的程序已经完成。虽然与初始构想稍微不同(初始构想是,全部在父窗体上进行,父窗体的大小会动态改变以适应radiobutton项的添加),从程序的运行效果来看,弹出子窗体效果更符合用户使用习惯,并且程序也因此大大简化!另:程序操作excel文件,还有相当多的内容没有发觉。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值