您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > Excel自动化生成代码
Excel自动化生成代码开发部寇增伟2015年1月31日【摘要】随着社会的进步和发展,各种工具出现对代码进行封装,使得开发工作变得越来越简单,正在逐渐向自动化、流水线的方向过渡。对于公司软件项目而言,一般是针对企业级应用进行系统开发,而对企业而言,其管理模式和软件需求都大同小异,很多功能和实现都比较类似。所以,开发工作主要的工作量就放在一些数据库表的定义和相关字段在前后台的显示和处理上。所以,如何最大化的提高工作效率,降低工作时间,成为设计此工具的出发点。【关键词】Excel代码模块程序一、问题的提出随着社会的进步和发展,各种工具出现对代码进行封装,使得开发工作变得越来越简单,正在逐渐向自动化、流水线的方向过渡。对于公司软件项目而言,一般是针对企业级应用进行系统开发,而对企业而言,其管理模式和软件需求都大同小异,很多功能和实现都比较类似。所以,开发工作主要的工作量就放在一些数据库表的定义和相关字段在前后台的显示和处理上。所以,如何最大化的提高工作效率,降低工作时间,成为设计此工具的出发点。二、解决思路以及实践我们在设计数据库文档时,设计了数据库表,编程人员就开始根据数据库文档进行实现,需要在数据库建表和字段,以及程序里面实现字段相关代码。下面拿一个简单的表格来说明问题。对于商圈调查表t_business_circles,数据库定义的几个字段如下(只为说明问题,所以力求简化)。序号字段名称字段描述字段类型长度允许空缺省值1busi_circles_no商圈调研varchar19,02city地市int5,0√我们程序实现里需要添加的字段相关的代码如下所示:TBusinessCirclesMapper.xml数据库和实体对应的相关代码有四个地方:1.resultproperty=busiCirclesNocolumn=busi_circles_no/resultproperty=citycolumn=city/2.trimprefix=insertintot_business_circles(suffixOverrides=,BUSI_CIRCLES_NO,CITY,3.#{busiCirclesNo,jdbcType=VARCHAR},#{city,jdbcType=INTEGER},4.BUSI_CIRCLES_NO=#{busiCirclesNo,jdbcType=VARCHAR},CITY=#{city,jdbcType=INTEGER},TBusinessCircles.java实体定义相关代码:privateStringbusiCirclesNo;privateIntegercity;publicStringgetBusiCirclesNo(){returnbusiCirclesNo;}publicvoidsetBusiCirclesNo(StringbusiCirclesNo){this.busiCirclesNo=busiCirclesNo;}publicIntegergetCity(){returncity;}publicvoidsetCity(Integercity){this.city=city;}界面增删改查相关代码,分别定义在不同文件中,这里统一描述:1.增加inputtype=textid=busiCirclesNoname=busiCirclesNostyle=width:90px/tdinputtype=textid=cityname=citystyle=width:90px/td2.修改inputid=busiCirclesNoname=busiCirclesNovalue=${bus.busiCirclesNo}inputtype=textid=cityname=cityvalue=${bus.city}3.列表thid=biaotouwidth=80px商圈调查编号/ththid=biaotouwidth=80px城市名称/thtdstyle=text-align:centernoWrap=noWrap${bus.busiCirclesNo}/tdtdstyle=text-align:centernoWrap=noWrap${bus.city}/td4.查看tdalign=right商圈调查编号:/tdtdalign=center${bus.busiCirclesNo}/tdtdalign=right城市名称:/tdtdalign=center${bus.city}/td从上面程序来看,系统里面字段相关的程序代码有十来处(这里只描述基本需求,若加入一些特殊需求如导入导出等会更多)。上面只列举了一张表,如果一个系统表格很多,并且每个表字段很多,动辄上百个。那么机械的手工敲入代码,或单字段拷贝,将是非常机械、繁琐的体力劳动。会花费大量时间来做这项工作。因为工作的机械和繁琐,开发人员的注意力不能一直高度集中。所以往往会出现表字段的拼写错误、大小写不一致、标点符号的半角全角录入问题,而这一类问题往往非常难以排查,常常花上十倍甚至以上的时间最终定位到是某字段的拼写错误。如果使用单个字段拷贝粘贴,可以避免拼写错误,但是也不能排除拷贝过程中的选择疏忽,少或多拷贝某个字母或空格。而且一个字段一个字段的拷贝粘贴也是非常繁琐的。如何解决这个问题?能否一劳永逸,一张数据库表字段在设计阶段(设计文档编写)录入以后,能够自动生成所有以表格为颗粒度的程序代码?我们一次拷贝生成整张表格所有字段的相关代码,从而将工作核心集中到设计和逻辑优化上,形成更好的良性循环。经过探索和实践,完全可行。首先我们在代码生成器里面,开始定义数据库表名称和字段,具体字段定义包括三项:类型、中文和文档定义。默认类型V表示字符串类型,在数据库相关XML文件里翻译为VARCHAR类型,在程序里面翻译为“String”默认类型N表示数值类型,在数据库相关XML文件里翻译为INTEGER类型,在程序里面翻译为“Integer”文档定义“busi_cirecles_no”为详细设计文档里面的字段定义,在数据库为全大写,但是文档里面便于标识采用全小写。首先,简单实现由文档定义的“busi_cirecles_no”变为数据库字段“BUSI_CIRCLES_NO”。这在EXCLE里面一个函数“UPPER()”就可以实现,所以我们在E3列直接输入代码“=UPPER(D3)”,就会自动生成数据库字段全大写的形式,下面同一表格中的所有数据库字段生成,只需要点击E3右下角,当显示的“箭头的十字星”变为“十字星”后,直接向下拖动,生成所有字段的数据库字段。其他语句的实现方式和上面类似,只是输入的程序代码略有不同。这时,我们可能会有疑问,我只需要产生字段相关的几行代码,而现在需要程序代码那么复杂,我怎么知道如何写EXCEL里面的程序代码?这个最简单的方式是直接百度,会找到适合你的程序代码段,考贝后略微改动即可以使用。不过自己直接实现代码也非常简单。下面简单介绍一行语句的实现步骤。例如:我们要实现一行代码“resultproperty=busiCirclesNocolumn=busi_circles_no/”1.首先我们在程序中写好这行代码,并保证代码正确无误。2.提取里面字段相关的名称用在EXCEL表里位置替换,例如busiCirclesNo在F3位置,改写代码为:“resultproperty=F3column=D3/”3.因为程序里面“””在EXCEL是关键字,所以要把程序里面的双引号替换为CHAR(34),我们这里替换为&CHAR(34)&,前后加了两个连接符,改写代码为:“resultproperty=&CHAR(34)&F3&CHAR(34)&column=&CHAR(34)&D3&CHAR(34)&/”4.把没有改写的部分作为字符串加双引号,并在最前面加“=”,完成代码编写。如果代码中没有“””,将字段中间的字符串用“&”链接即可。更近一步,如何实现多行语句的EXCEL编程?比如我们要一步实现下面函数:publicStringgetCity(){returnbusiCirclesNo;}publicvoidsetCity(StringbusiCirclesNo){this.busiCirclesNo=busiCirclesNo;}采用方法类似,首先将程序语句由多行变为一行,然后进行上面的替换步骤生成程序代码,具体程序代码如下:=public&IF(B3=V,String,IF(B3=N,Integer))&get&UPPER(LEFT(F3,1))&RIGHT(F3,LEN(F3)-1)&(){return&F3&;}&publicvoidset&UPPER(LEFT(F3,1))&RIGHT(F3,LEN(F3)-1)&(&IF(B3=V,String,IF(B3=N,Integer))&&F3&){this.&F3&=&F3&;}生成的实际可执行的程序代码如表格中的P3单元格,将此行代码考入程序中,然后选择右键-”Source”-”Format”。将拷贝的一行代码格式化为上面多行代码形式。当然,在Eclipse里面GET/SET可以根据私有变量定义自动生成,这里仅仅以此作为例子表现多行代码的实现过程。文章一开始提到的我们要实现的各个模块的语句和方法如下所示:字段定义和数据库相关操作语句界面定义和实体定义在实际编写代码过程中,因一些大小写的问题使得要编写的程序代码比较复杂,最简单的方式仍然是采用上面的逐渐替换法。然后将最后需要特殊处理的大小写的字段找到相应代码后自己替换即可。这些相应代码可以在网上百度直接获得。比如:我们要将“busiCirclesNo”,实现成“setBusiCirclesNo”的形式表示这个函数,那么主要目标就是如何将“busiCirclesNo”替换为“BusiCirclesNo”,这个直接在百度输入“excel其他字母不变首字母大写”马上找到答案,如下所示,直接替换即可。首字母变大写:=upper(left(a3,1))&right(a3,len(a3)-1)程序中所有字段相关的代码,都可以用上面方式实现,如果表比较复杂,有上百个字段,我们设计好一个字段相关的程序代码后,直接一次拖动产生所有字段的各个程序模块中的相关程序代码,然后从EXCEL竖向拷贝所有该表的代码到程序中,完成一张表的所有字段处理语句的代码编写。机器的准确性规避了前期手工敲入导致拼写错误存在的问题,并且减少了拷贝粘贴的次数。另外,如果需求有变更,文档和程序都需要更新时,仅需要维护这份Excel,将工具中的文档定义字段进行更新,其余部分的语句都是自动更新生成,完成所有语句的修改操作,将修改后的代码直接拷贝到程序中即可。三、注意事项在实际应用中,有两类问题需要注意:1.实际程序开发过程中,所有数据库表的字段变动,比如增加、删除和改名。都需要维护此EXCEL表,保证此EXCEL表字段定义是最新的,避免用旧的字段代码覆盖前期改动。2.EXCEL拷贝字段到数据库时,需要直接进入EXCEL单元格拷贝字段。否则可能因EXCEL格式问题在数据库中添加双引号或空格。四、效果评价在实际开发工作中,我们逐渐完善和修改这个EXCEL表格,在数据库表字段比较多的情况下,能够非常有效的提高我们的工作效率。并以此思路,其他类似的程序代码实现中也开始采用这种方法实现,效果不错。五、推广建议虽然文章中是以JAVA和Oracle为例子来阐述问题,但是在程序开发过程中,其他程序设计语言和数据库仍然可以按照这种思路快捷实现数据库表字段相关的程序语句的编写,可以有效提高工作效率,节省工作时间,将精力集中到设计和界面优化及程序实现逻辑中。进而形成良性循环,提高最终软件项目的质量。
本文标题:Excel自动化生成代码
链接地址:https://www.777doc.com/doc-2870931 .html