控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

如何用C#制作Excel AddIn的方法介绍(1)

作者:佚名 出处:CTOCIO 2010年03月25日 阅读:

这个需求源自于一个朋友的要求,他向我陈述了产生需求的原因。

  朋友所在工厂的质量部每天需要检测大量的产品零部件,并且要把检测的数据制作成报表,这是QC测量员的日常工作。由于最近公司的订单增多,生产任务的增多也导致测量员每天需要检测大量的产品零件,产生大量的测量数据。QC测量员还需要把这些数据整理成规定格式的报表,提交给组长审核。订单的增多,会导致QC 测量员工作量增加。他询问我,是否有办法可以减少QC测量员的工作量,提高工作效率。

  从他的描述中看出,有两件工作是不断重复进行的:测量零件和制作报表。对于测量零件,我也没有办法去提高效率,除非规定只检测部分零件,而不是全部检测。在工厂规定必须全部检测的情况下,第一道工序很难优化。对于第二道工序,把测量的数据制作成报表。这一步似乎可以用程序来提高效率。因为要求制作的报表的格式是规定的,只需要把测量的结果数据导入到规定格式的报表中去,第二步就顺利完成。

  报表采用Excel格式,每行每列的版面已经确定。只需要把指定的数据放到相应的列位置即可。如图

  

  Item列是零件名称,Mean列是对应零件的测量数据。

  测量机器导出的零件的数据格式支持常用的CSV,XML和TXT格式,导出的数据用EXCEL看起来是这样的

  

  我选择把测量数据导出为csv格式,这种格式容易查看,也容易分析。如果选用XML格式,大多数据员工都看不懂,而且查看起来不方便。对于这类的平面结构(相对于层次结构)的数据,导出为CSV是首选。

  接下来就是分析一下,如何快速的把测量数据制作成报表。

  大部分Excel用户对公式比较熟悉,制作报表也相当专业和快速。我先尝试直接用公式解决。

  这个需求用公式描述是,在指定的区域中找值,然后返回指定的值到相应的数据列中。

  EXCEL的VLOOKUP函数可以达到我的目的。如下的解释:VLOOKUP(C1,A:B,2,) 这个公式,意思是要在A列到B列查找C1这个数据,并显示与其对应的B列的数据

  但是有个问题,报表和测量数据是分别放在两在文件中的,而且测量数据是不允许被放到报表所在的文件中。用户需要先把测量数据添加到报表文件中,然后使用上面的公式,去找到匹配值,做完之后再把测量数据所在的worksheet删掉。如果有很多这样的报表要做,用户要反复的添加和删除worksheet,虽然可以解决问题,有点不完美,用户操作起来不方便。这个方案可以解决问题,但不完美,

  尝试用VBA的方法,网上关于VBA的资料相当多。VBA就相当于程序的方式。我的思路是先读取测量数据文件,把它放到一个类似于字典的结构中(Hashtable,Dictionary),然后循环读取报表中需要数据的零件,取出它对应的测量数据并赋给相应的单元格。没研究过VBA,不知道怎样入手。用关键词“VBA如何读取一个文件”在网上找了搜索了很久也没有找到相关内容,这个方案不会编程实现,只好放弃。

  考虑用VSTO。VS 2005/2008默认都会安装这个组件,它相当于托管版本的VBA。而且VSTO支持C#语言,可以用最熟悉的技术解决这个问题。在C#里面,读取一个文件相当容易,一个StreamReader就可以搞定读取文件的问题。打开VS2008,新建一个Excel 2003的Workbook项目。

  

  向导会创建一个类,它的主体代码如下


 public partial class ThisAddIn
  {
  private void ThisAddIn_Startup(object sender, System.EventArgs e){       }
  private void ThisAddIn_Shutdown(object sender, System.EventArgs e)   {       }
  }

  看不懂可以猜测,根据名字,猜测Startup和Shutdown是插件被加载和关闭时执行的事件

  在ThisAddIn_Startup中,加载界面。

  可以添加一个菜单,也可以添加一个工具按钮。添加菜单的效果如下

  

  具体代码的写法是


  private void ThisAddIn_Startup(object sender, System.EventArgs e)
  {
  #region VSTO generated code
  this.Application = (Excel.Application)Microsoft.Office.Tools.Excel.ExcelLocale1033Proxy.Wrap(typeof(Excel.Application), this.Application);
  #endregion
  this.AddMenu();
  }
  Office.CommandBarControl menuTop;
  Office.CommandBarControl menuCreateMail = null;
  private void AddMenu()
  {
  Office.CommandBar bar = this.Application.CommandBars.ActiveMenuBar;
  menuTop.Caption = "YiHu Tools";
  Office.CommandBarPopup commandBarPopupTmp = menuTop.Control as Office.CommandBarPopup;
  menuCreateMail.Caption = "Import Data";
  Office.CommandBarButton buttonMenu = menuCreateMail as Office.CommandBarButton;
  buttonMenu.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(buttonMenu_Click);
  }

 

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统