microsoft query sql引用单元格_Microsoft.Office.Interop.Excel操作Excel拾遗
背景:
最近用C#写了一个小工具需要操作Excel,网上搜到的方案都是COM组件方式,即Microsoft.Office.Interop.Excel居多,除此之外,还有以下几种方法:
- Microsoft.Office.Tools.Excel
- 网上较少介绍,资料和例子有限,但好像是比COM方法先进
- OleDB方式,即把Excel当作一个数据库
- 采用NPOI 库方式
- 这种方法无需在目标电脑上安装Excel
- CSV方式,也就是作为文件流来操作
- OpenXML方式,貌似也是第一个第三方工具
由于时间关系,采用了资料最多的COM组件方式,即Microsoft.Office.Interop.Excel,但在实际使用中遇到了几个障碍,在此记录一下。
不过,这些故障的原因都没有官方权威说明背书,所以可能有误,请自行甄别。如有高手能够不吝赐教,万分感谢!
- 用COM组件方法时,作为宇宙第一IDE的Visual Studio 无法进行“编辑代码并继续调试”。
- 这个功能的缺失,大大降低了本人懒癌晚期的开发效率。好处就是需要在F5之前尽量把代码想清楚,而不像以前那样,把所有的工作就交给调试器
- Range.FindNext()方法,不可以嵌套使用,否则会造成下一个查找开始点的混乱,从而造成死锁。
- 我的需求有点特别。因为我要查找的字符串在Excel中被拆分成一行n列,所以需要先找到包含该字符串第一部分的某个单元格,然后在该行上对比随后的几列加起来是不是要查找的字符串。说起来麻烦,下面是例子。我要查找的是191/1/1/1,到了Excel中是像下面这样储存的。
一开始我的想法是,先把整个Sheet中UsedRanged定义为rg,用rg.Find()方法先找到191,然后把该行定义为一个新的Range比如rg1,然后用rg1的Find()方法,查找后面的“1”,“1/1”。
其实到此为止都没有问题,问题出现在rg.FindNext()这个方法上。
rg.FindNext()方法需要的参数是rg本身,而查找过程的终止是对比当前所在Range的Address和事先保存好的第一次进行Find()的Address,如果两者一致,就说明FindNext回到了原点,当前查找范围不包含待查找内容,循环结束。
不过,像我上面的需求,因为有嵌套存在,就影响了FindNext的结果。
我其实想到过这个问题,所以我以为我重新定义了rg1,在rg1中进行Find是不会影响rg这个Range的FindNext动作的。可惜,事实证明并非如此,rg的FindNext因为受到影响,陷入无限循环,直到宇宙的终结……
没那么夸张,停止调试、杀死进程或者断电都行。(抱歉戏精上身了)
我暂时没有进一步考虑聪明点的办法,只是简单应用Sheet.Cells[m,n]这个方法取到了后面几个单元格进行对比,避免触碰Range.Find雷区。代价就是似乎效能降低了不少,而且需要把m和n进行硬编码,万一列数发生变化就要修改代码。
- 注意程序的最后对Excel进程的释放,否则任务管理器里会看到越来越多的Excel进程留在那里
关于这一点,可以参照下面两篇文章。
[C# .Net] 使用 Microsoft.Office.Interop.Excel 讀 / 寫 Excel 2010 | 余小章 @ 大內殿堂dotblogs.com.tw
透過.NET程式操作Excel的注意事項-黑暗執行緒blog.darkthread.net
- 关于Range的操作
- 不太清楚网上的一些文章为什么固执地使用“A1”这样的参数来解释Range的范围,这种方式只适合硬编码,而无法用for循环来进行遍历。我觉得Cells[m,n]这种方式更适合循环操作。
- 关于使用单元格的内容,网上的资料不是太多,一般都是判断Value2,或者把它再转成String。但有时候Value2会是null,而且Text这个属性也不是每次都很保险。
- 有关效率问题,刚刚读到了下面这篇文章,貌似这样也避免了Value2/Text为null的异常情况。
C#(com组件)操作Excel读写 - 红烧狮子头 - 博客园www.cnblogs.com
和他所引用的文章
关于通过COM自动化调用Excel的效率问题 - 马维峰 - 博客园www.cnblogs.com
我也要回头重写自己的查找/判断部分,提高一点性能。
上面这篇文章的内容值得一看。
暂时先想到这些,回头如果有时间了,会尝试一下读写Excel的另外几种方法。
microsoft query sql引用单元格_Microsoft.Office.Interop.Excel操作Excel拾遗相关推荐
- 计算机单元格的引用计算,计算机应用 单元格的引用 单元格的引用.pptx
单元格的引用 主讲人:李军 <计算机应用 > 单元格的引用 在制作前要分析表格及插入函数与公式的要点,然后再进行相应的操作.本案例的制作要点包括插入列.插入公式.复制公式.插入函数.复制函 ...
- Excel技能培训-INDIRECT实现拼接动态引用单元格,trl+pageDown速切换工作簿,多工作表求和,多个工作簿合并和拆分
1. 使用INDIRECT实现拼接动态引用单元格内容 =INDIRECT("E"&COUNTA(G14:G17)) 2. 使用ctrl+pageUp ,ctrl+pageD ...
- VBA中引用单元格与区域
在Visual Basic中,Range对象既可表示单个单元格,也可表示单元格区域. 引用 含义 Range("A1") 单元格A1 Range("A1 ...
- EXCEL引用单元格的几种格式
XCEL最强大的功能便是公式,使用公式必须用到引用单元格,EXCEL单元格的引用分为A1引用.R1C1引用,R1C1引用一般很少使用,我们通常更喜欢A1引用,今天小编分享A1引用单元格的几种格式: 工 ...
- C# Microsoft.Office.Interop.Owc11 导出excel文件
C# Microsoft.Office.Interop.Owc11 导出excel文件 1.新建项SupremeWindowsForms窗体应用项目(项目平台设置称X86) 注意:因为大多数第三方写的 ...
- 如何通过VB合并Excel单元格以及设置Excel行高?VB创建Excel表格,合并单元格,生成图形等操作
如何通过VB合并Excel单元格以及设置Excel行高? 例如:我想把第一列的第4,5,6,7行合并...我在怎样让合并单元格里的字居中,怎样改变字体. 请不吝赐教... ============== ...
- abap al设置单元格可编辑 oo_excel表格操作: 图形和图表编辑技巧汇总(二)
1. 快速选取图表元素 图表创建好以后,我们还需要对某些图表元素进行编辑和格式化.图表区包括整个图表和它的全部元素,当你选取图表区后,你就可以看到8个黑色小方块.要想调整单个的图表对象,首先必须选取该 ...
- html怎么把excel表格合并单元格,巧用格式刷实现Excel合并后保留原单元格数据
合并单元格是用户在制作表格时常用的命令,它可以把多个单元格显示成一个单元格,起到美化的作用. 通常情况下,如果把几个含有数据的单元格进行合并,Excel会提示"在合并单元格时,如果选择的单元 ...
- Excel一键求得单元格内数值个数的操作!
今天要和大家分享的是,Excel一键求得单元格内数值个数的操作!比如说下图中的城市内容全部集中在一个单元格,现在想要知道各自省份对应的城市数量-- (方方格子插件) 1.先看动图演示吧 2.操作之 ...
最新文章
- jgit查询远程仓库_JAVA 使用jgit管理git仓库
- 读书笔记:《Aspx开发200问》——如何实现Repeater控件的分页
- 数据库创建表的时候长度的介绍
- How to publish in an open world?
- PVLAN技术应用,网络管理员的新宠
- 『数学』--数论--组合数+卢卡斯定理+扩展卢卡斯定理
- 【火炉炼AI】机器学习032-用户之间相似度的计算
- jaeger client java_Uber工程团队的开源分布式追踪系统Jaeger(java实现)
- w10自动删除文件怎么关了_回收站删除的文件怎么恢复?
- IT企业是如何选择容器管理平台的
- 口布杯花的60种叠法_10种餐巾折花杯花的步骤用文字解说怎么折
- 16种常见的竞品分析方法,建议收藏!
- r语言基本操作及数据处理(超详细)
- HTML——HTML中的特殊符号
- 实验六 视图的创建与管理
- vue瀑布流插件vue-waterfall-easy 2.x
- python获取字典末端value值的取值方式
- mysql awr v1.0.2发布
- 学习Chrome Devtools 调试
- csdn的markdown编辑器如何保持图片原始大小?