背景:

最近用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拾遗相关推荐

  1. 计算机单元格的引用计算,计算机应用 单元格的引用 单元格的引用.pptx

    单元格的引用 主讲人:李军 <计算机应用 > 单元格的引用 在制作前要分析表格及插入函数与公式的要点,然后再进行相应的操作.本案例的制作要点包括插入列.插入公式.复制公式.插入函数.复制函 ...

  2. Excel技能培训-INDIRECT实现拼接动态引用单元格,trl+pageDown速切换工作簿,多工作表求和,多个工作簿合并和拆分

    1. 使用INDIRECT实现拼接动态引用单元格内容 =INDIRECT("E"&COUNTA(G14:G17)) 2. 使用ctrl+pageUp ,ctrl+pageD ...

  3. VBA中引用单元格与区域

    在Visual Basic中,Range对象既可表示单个单元格,也可表示单元格区域. 引用   含义 Range("A1")        单元格A1 Range("A1 ...

  4. EXCEL引用单元格的几种格式

    XCEL最强大的功能便是公式,使用公式必须用到引用单元格,EXCEL单元格的引用分为A1引用.R1C1引用,R1C1引用一般很少使用,我们通常更喜欢A1引用,今天小编分享A1引用单元格的几种格式: 工 ...

  5. C# Microsoft.Office.Interop.Owc11 导出excel文件

    C# Microsoft.Office.Interop.Owc11 导出excel文件 1.新建项SupremeWindowsForms窗体应用项目(项目平台设置称X86) 注意:因为大多数第三方写的 ...

  6. 如何通过VB合并Excel单元格以及设置Excel行高?VB创建Excel表格,合并单元格,生成图形等操作

    如何通过VB合并Excel单元格以及设置Excel行高? 例如:我想把第一列的第4,5,6,7行合并...我在怎样让合并单元格里的字居中,怎样改变字体. 请不吝赐教... ============== ...

  7. abap al设置单元格可编辑 oo_excel表格操作: 图形和图表编辑技巧汇总(二)

    1. 快速选取图表元素 图表创建好以后,我们还需要对某些图表元素进行编辑和格式化.图表区包括整个图表和它的全部元素,当你选取图表区后,你就可以看到8个黑色小方块.要想调整单个的图表对象,首先必须选取该 ...

  8. html怎么把excel表格合并单元格,巧用格式刷实现Excel合并后保留原单元格数据

    合并单元格是用户在制作表格时常用的命令,它可以把多个单元格显示成一个单元格,起到美化的作用. 通常情况下,如果把几个含有数据的单元格进行合并,Excel会提示"在合并单元格时,如果选择的单元 ...

  9. Excel一键求得单元格内数值个数的操作!

    今天要和大家分享的是,Excel一键求得单元格内数值个数的操作!比如说下图中的城市内容全部集中在一个单元格,现在想要知道各自省份对应的城市数量-- (方方格子插件) ​ 1.先看动图演示吧 2.操作之 ...

最新文章

  1. jgit查询远程仓库_JAVA 使用jgit管理git仓库
  2. 读书笔记:《Aspx开发200问》——如何实现Repeater控件的分页
  3. 数据库创建表的时候长度的介绍
  4. How to publish in an open world?
  5. PVLAN技术应用,网络管理员的新宠
  6. 『数学』--数论--组合数+卢卡斯定理+扩展卢卡斯定理
  7. 【火炉炼AI】机器学习032-用户之间相似度的计算
  8. jaeger client java_Uber工程团队的开源分布式追踪系统Jaeger(java实现)
  9. w10自动删除文件怎么关了_回收站删除的文件怎么恢复?
  10. IT企业是如何选择容器管理平台的
  11. 口布杯花的60种叠法_10种餐巾折花杯花的步骤用文字解说怎么折
  12. 16种常见的竞品分析方法,建议收藏!
  13. r语言基本操作及数据处理(超详细)
  14. HTML——HTML中的特殊符号
  15. 实验六 视图的创建与管理
  16. vue瀑布流插件vue-waterfall-easy 2.x
  17. python获取字典末端value值的取值方式
  18. mysql awr v1.0.2发布
  19. 学习Chrome Devtools 调试
  20. csdn的markdown编辑器如何保持图片原始大小?

热门文章

  1. usr bin java快捷方式_/ usr / bin / sudo必须由uid 0拥有并设置setuid位
  2. mysql 用户密码md5_使用MD5编码实现数据库用户密码字段的加密
  3. java spi技术,Java SPI机制
  4. Python python 五种数据类型--字符串
  5. HTML---初识HTML
  6. Java对象转换成Map
  7. 关闭被占用的tomcat端口
  8. setTimeOut传参数
  9. MySQL无法创建外键、查询外键的属性
  10. 探讨对理想团队模式构建的设想及软件流程的理解