从Excel表转移数据到VFP表的编程实现方法
- 格式:doc
- 大小:439.00 KB
- 文档页数:5
从Excel表转移数据到VFP表的编程实现方法高进龙,崔尚森,王文林(长安大学,陕西西安710054)摘要:把整个一个Excel表数据转换为VFP表并不难,难就难在把Excel表中某些行某些列的数据转移到已有数据的某个VFP表中,而且可能还会遇到两表间相应数据列的名称、数据类型、排列顺序不同的问题。
作者用VFP编程,轻松实现了这一数据转移工作。
本文将就这一程序的设计思想和实现方法做简要介绍。
关键词:Excel表,VFP表,转移数据,编程实现作者简介:高进龙(1964-),男,陕西华阴市人,长安大学地测学院教务办公室主任,讲师。
一、问题的提出VFP(Visual Foxpro)是一种关系型数据库管理系统,其强大的数据处理能力及其面向对象的编程能力,使其得到数据库应用程序开发人员的广泛使用。
而Excel则是一个优秀的电子表格处理软件,在兼容性、操作界面、公式运算、图表表现等方面有着独到的优势,成为广大办公应用人员常用的工具。
因为两种软件各有短长,所以在实际应用中常会遇到两者之间数据的转移问题。
把整个VFP表转换为Excel表或者把整个Excel表转换为VFP表的工作,两种软件都提供了相应的转换功能,一般用户很容易操作。
但是把Excel表中部分数据转移到已存在的VFP表中的情况就要复杂得多。
两种表的数据转移可能存在以下三个方面的问题:一是Excel表中可能存在某些行的数据不需要或不能被转移,需要转移或者可以转移的仅是其中较规范的某些行;二是Excel表并非所有列的数据,而只是某些列的数据需要被转移到VFP表的相应数据列中,两表中相应列的名称和顺序可能不一致;三是Excel表中与VFP表对应数据列的数据类型可能不一致。
因此,对业已存在的这两类数据表间数据转移工作,用手工完成非常麻烦和费时。
在工作实践中,作者运用VFP编程驱动Excel的能力,设计完成了从Excel到VFP的数据转移程序,成功地解决了这一问题。
二、设计思路综合考虑上述三个问题,程序设计宜采用的方法是把Excel表中数据按单元格逐一转移到VFP表中,所以,需要完成下列三项任务:(1)建立Excel表中要转移数据的列与VFP表中要接受数据的字段之间一一对应的关系,这项工作等于给两表之间的数据转移牵图1程序构件展示线搭桥,是非常关键的一项任务(如图2所示)。
(2)读取Excel表中要转移数据的起止行行号,从横向上确定要转移数据的范围。
Excel表中一行数据(也可能是一行中的某些列)对应VFP表中的一条记录。
(3)转移数据时要处理两表中数据类型不一致的问题,以及数值型数据小数位数不一致而必须考虑的数据四舍五入问题。
在考虑上述三项任务的实现方法时,还要考虑用户操作的便捷性,直观性。
本程序的所有操作对象都展现在图1所示的桌面上,所有操作无需键盘输入,只需点击鼠标。
三、实现方法本程序设计了一张表单,在表单顶部设置了五个按钮、两个文本框,下部设置了一个表格控件(如图1下半部所示`),它们将完成下列五个步骤的工作:1、打开数据表指打开已存在的VFP数据表,打开的VFP 表会显示在表单下部的表格控件中。
此表被打开,一是为了直观地向用户展示表的结构及数据,二是为了在建立与Excel表关联关系时供用户用鼠标选择相关的列。
2、打开Excel表指打开要转移数据的Excel表。
首先利用VFP系统自带的函数创建一个Excel应用对象,并借助该对象的方法打开Excel表,以后VFP程序还要调用该对象的方法和属性完成对Excel表的各种操作。
3、XL—VFP勾通即建立Excel表中列与VFP表中对应字段之间的关联关系。
用户在操作此项功能前,先要把Excel表和VFP表平铺在桌面上(如图1所示),并分别点击鼠标到要建立关联的Excel 表列和VFP表字段列中使其被选中,然后再点击“XL—VFP勾通”按钮,程序便会自动在关联数据表中增加一条记录,保存两表间数据的关联关系,依次建立两表中所有数据项之间的关联关系,所有操作均在图1展示的界面中完成,直观便捷。
上述方法建立的两表间关联关系存储在一个磁盘数据表中,可以被多次重复使用。
此关联表的内容与结构用图3所示的表单展示给用户,其右上角的“?”按钮提供一个功能菜单帮助用户操作此表,如用户不再重用此表中关联数据时可以清除其中记录。
当用户不需要查看关联表的内容时,图3所示表单可以减缩为一个命令按钮排列在打开“Excel表”按钮之右。
4、确定起止行号读取Excel表中需要转移数据的起、止行行号,并记入表单顶部的两个文本框中。
行号的读取可以用鼠标先点击Excel表中起始行的任意一个列的单元格使其得到焦点,然后再点击存放起始行号的文本框,程序通过调用Excel应用对象的相关属性读取起始行号并存入文本框中。
终止行的读取方法与之相同。
当然也可以直接在文本框中输入起止行号。
5、数据转移上述四个步骤完成后,便可点击表单右上部的“Xl→Vfp”按钮,进行数据的转移工作。
“Xl→Vfp”按钮的click事件代码按照关图3 Excel-VFP关联表图2 Excel-VFP数据转移示意图联表(图3所示)中记录的两表间数据项的关联关系,按照一行一个记录的方式,将Excel 表每一行中相关单元格的数据逐一复制到VFP表中对应的字段中,复制过程还可能要转换数据类型以及对数值型数据做小数位数的调整工作。
四、主要代码1、打开Excel表的代码:excel_name=getfile('xls','Excel文件')if empt(excel_name)retuendif#define True 1XLApp = createobject("Excel.Application")XLApp.visible = TrueXLApp.Workbooks.Open(excel_name)thisform.refresh2、建立XL表数据与VFP表数据关联关系的代码:if type('xlapp') = 'U' ;or empt(thisform.VfpGrid. recordsource)retuendifthis.forecolor = rgb(255,0,0)nXlColumn = xlapp.activecell.columnnXlColumn1 = int(nXlColumn/26)nXlColumn2 = mod(nXlColumn,26)sAZ= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'do casecase nXlColumn1 > 26messagebox('xl列值太大!')retucase nXlColumn1= 0nXlColumn1 = ''nXlColumn2 = subs(sAZ, nXlColumn2,1)case nXlColumn1>0 and nXlColumn2>0 nXlColumn1 = subs(sAZ,nXlColumn1,1) nXlColumn2 = subs(sAZ,nXlColumn2,1)case nXlColumn1>0 and nXlColumn2 = 0 nXlColumn1 = subs(sAZ,nXlColumn1-1,1) nXlColumn2 = 'Z'endcasesele xltovfploca for vfp字段= cFieldnameif !found()loca for empt(alltrim(vfp字段))if !found()appe blankendifendifsele(tabname)repl xltovfp.vfp字段with cFieldname,; xltovfp.值类型with type(cFieldname),; xltovfp.xl列with nXlColumn1 + nXlColumn2 do casecase xltovfp.值类型= 'C'repl xltovfp.常量值with &cFieldnamecase xltovfp.值类型= 'N'repl xltovfp.常量值with;str(&cFieldname,18,6)case xltovfp.值类型= 'D'repl xltovfp.常量值with DtoC(&cFieldname) endcasethisform.gridcontainer.xlvfpgrid.setfocus=inkey(0.1)this.forecolor = rgb(0,128,128)3、由XL表向VFP表导入数据的代码:this.forecolor = rgb(255,0,0)sAZ= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' for i = thisform.txtrow1.value;to thisform.txtrow2.valuenXLrow = isele(tabname)appe blanksele xltovfpscanif empt(vfp字段)loopendifcXlcolumn = alltrim(xl列)do casecase len(cXlcolumn) = 0nXlcolumn = 0case len(cXlcolumn) = 1nXlcolumn = at(cXlcolumn,sAZ)case len(cXlcolumn) = 2nXlcolumn=26*at(left(cXlcolumn,1),sAZ); + at(right(cXlcolumn,1),sAZ)endcasecVfpcolumn = alltrim(vfp字段)cConstant = alltrim(常量值)cDataType = alltrim(值类型)sele(tabname)if empt(cXlcolumn)if !empt(cConstant)do casecase cDataType = 'C'repl &cVfpcolumn with cConstantcase cDataType = 'N'repl &cVfpcolumn with val(cConstant)case cDataType = 'D'repl &cVfpcolumn with CtoD(cConstant)endcaseendifelsexlCellV alue = XlApp.ActiveSheet.Cells[nXlrow,nXlcolumn].value if type('xlCellV alue') <> cDataTypedo casecase type('xlCellV alue') = 'N';and cDataType = 'C'cDecimal = alltrim(str((xlCellvalue - int(xlCellV alue))*10000))do while right(cDecimal,1) = '0'cDecimal = left(cDecimal,len(cDecimal)-1)enddonDecimal = len(cDecimal)nInteger = len(alltrim(str(int(xlCellV alue))))repl &cVfpcolumn with str(xlCellV alue,nInteger+nDecimal+1,nDecimal)case type('xlCellV alue') = 'N' and cDataType = 'D'xlCellV alue = str(xlCellV alue,8)repl &cVfpcolumn with CtoD(subs(xlCellV alue,1,4); +'/'+subs(xlCellV alue,5,2)+'/'+subs(xlCellV alue,7,2)) case type('xlCellV alue') = 'C' and cDataType = 'N'repl &cVfpcolumn with val(alltrim(xlCellV alue)) case type('xlCellV alue') = 'C' and cDataType = 'D' repl &cVfpcolumn with CtoD(alltrim(xlCellV alue)) case type('xlCellV alue') = 'D' and cDataType = 'C' repl &cVfpcolumn with DtoC(xlCellV alue)endcaseelse if cDataType = 'C'repl &cVfpcolumn with alltrim(xlCellV alue)elserepl &cVfpcolumn with xlCellV alueendifendifendifsele xltovfpendscanendfor=inkey(0.2)this.forecolor = rgb(0,128,128)thisform.vfpgrid.setfocus4、记录起止行号的文本框控件代码(两个文本框代码相同):this.value=iif(!type('xlapp')='U',xlapp.selection.row,1) thisform.refresh五、结束语本程序经过两年多的使用,证明其操作简便、易学易用,在处理从Excel表到VFP表的数据转移工作方面灵活、快捷、高效。