打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
从Excel表转移数据到VFP表的编程实现方法
摘  要:把整个一个Excel表数据转换为VFP表并不难,难就难在把Excel表中某些行某些列的数据转移到已有数据的某个VFP表中,而且可能还会遇到两表间相应数据列的名称、数据类型、排列顺序不同的问题。作者用VFP编程,轻松实现了这一数据转移工作。本文将就这一程序的设计思想和实现方法做简要介绍。
关键词:Excel表,VFP表,转移数据,编程实现
一、问题的提出
VFP(Visual Foxpro)是一种关系型数据库管理系统,其强大的数据处理能力及其面向对象的编程能力,使其得到数据库应用程序开发人员的广泛使用。 而Excel则是一个优秀的电子表格处理软件,在兼容性、操作界面、公式运算、图表表现等方面有着独到的优势,成为广大办公应用人员常用的工具。因为两种软件各有短长,所以在实际应用中常会遇到两者之间数据的转移问题。
把整个VFP表转换为Excel表或者把整个Excel表转换为VFP表的工作,两种软件都提供了相应的转换功能,一般用户很容易操作。但是把Excel表中部分数据转移到已存在的VFP表中的情况就要复杂得多。两种表的数据转移可能存在以下三个方面的问题:一是Excel表中可能存在某些行的数据不需要或不能被转移,需要转移或者可以转移的仅是其中较规范的某些行;二是Excel表并非所有列的数据,而只是某些列的数据需要被转移到VFP表的相应数据列中,两表中相应列的名称和顺序可能不一致;三是Excel表中与VFP表对应数据列的数据类型可能不一致。因此,对业已存在的这两类数据表间数据转移工作,用手工完成非常麻烦和费时。
在工作实践中,作者运用VFP编程驱动Excel的能力,设计完成了从Excel到VFP的数据转移程序,成功地解决了这一问题。
二、设计思路
综合考虑上述三个问题,程序设计宜采用的方法是把Excel表中数据按单元格逐一转移到VFP表中,所以,需要完成下列三项任务:
(1)建立Excel表中要转移数据的列与VFP表中要接受数据的字段之间一一对应的关系,这项工作等于给两表之间的数据转移牵线搭桥,是非常关键的一项任务(如图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表中对应的字段中,复制过程还可能要转换数据类型以及对数值型数据做小数位数的调整工作。
四、主要代码
1、打开Excel表的代码:
excel_name=getfile('xls','Excel文件')
if empt(excel_name)
  retu
endif
#define True 1
XLApp = createobject("Excel.Application")
XLApp.visible = True
XLApp.Workbooks.Open(excel_name)
thisform.refresh
2、建立XL表数据与VFP表数据关联关系的代码:
if type('xlapp') = 'U' ;
or empt(thisform.VfpGrid. recordsource)
  retu
endif
this.forecolor = rgb(255,0,0)
nXlColumn = xlapp.activecell.column
nXlColumn1 = int(nXlColumn/26)
nXlColumn2 = mod(nXlColumn,26)
sAZ= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
do case
case nXlColumn1 > 26
  messagebox('xl列值太大!')
  retu
case nXlColumn1= 0
  nXlColumn1 = ''
  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'
endcase
sele xltovfp
loca for vfp字段 = cFieldname
if !found()
  loca for empt(alltrim(vfp字段))
  if !found()
    appe blank
  endif
endif
sele(tabname)
repl xltovfp.vfp字段 with cFieldname,;
xltovfp.值类型 with type(cFieldname),;
xltovfp.xl列 with nXlColumn1 + nXlColumn2 
do case
case xltovfp.值类型 = 'C'
  repl xltovfp.常量值 with &cFieldname
case xltovfp.值类型 = 'N'
  repl xltovfp.常量值 with;
 str(&cFieldname,18,6)
case xltovfp.值类型 = 'D'
  repl xltovfp.常量值 with DtoC(&cFieldname)
endcase
thisform.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.value
  nXLrow = i
  sele(tabname)
  appe blank
  sele xltovfp
  scan
    if empt(vfp字段)
      loop
    endif
    cXlcolumn = alltrim(xl列)
    do case
    case len(cXlcolumn) = 0
      nXlcolumn = 0
    case len(cXlcolumn) = 1
      nXlcolumn = at(cXlcolumn,sAZ)
    case len(cXlcolumn) = 2
      nXlcolumn=26*at(left(cXlcolumn,1),sAZ);
 + at(right(cXlcolumn,1),sAZ)
    endcase
    cVfpcolumn = alltrim(vfp字段)
    cConstant = alltrim(常量值)
    cDataType = alltrim(值类型)
    sele(tabname)
    if empt(cXlcolumn)
      if !empt(cConstant)
       do case
       case cDataType = 'C'
          repl &cVfpcolumn with cConstant
       case cDataType = 'N'
         repl &cVfpcolumn with val(cConstant)
       case cDataType = 'D'
          repl &cVfpcolumn with CtoD(cConstant)
        endcase
      endif
    else
      xlCellValue = XlApp.ActiveSheet.Cells[nXlrow,nXlcolumn].value
     if type('xlCellValue') <> cDataType
         do case
         case type('xlCellValue') = 'N';
 and cDataType = 'C'
         cDecimal = alltrim(str((xlCellvalue - int(xlCellValue))*10000))
       do while right(cDecimal,1) = '0'
         cDecimal = left(cDecimal,len(cDecimal)-1)
        enddo
        nDecimal = len(cDecimal)
        nInteger = len(alltrim(str(int(xlCellValue))))
        repl &cVfpcolumn with str(xlCellValue,nInteger+nDecimal+1,nDecimal)
        case type('xlCellValue') = 'N' and cDataType = 'D'
      xlCellValue = str(xlCellValue,8)
 repl &cVfpcolumn with CtoD(subs(xlCellValue,1,4);
+'/'+subs(xlCellValue,5,2)+'/'+subs(xlCellValue,7,2))
case type('xlCellValue') = 'C' and cDataType = 'N'
 repl &cVfpcolumn with val(alltrim(xlCellValue))
 case type('xlCellValue') = 'C' and cDataType = 'D'
repl &cVfpcolumn with CtoD(alltrim(xlCellValue))
case type('xlCellValue') = 'D' and cDataType = 'C'
repl &cVfpcolumn with DtoC(xlCellValue)
endcase
else
if cDataType = 'C'
repl &cVfpcolumn with alltrim(xlCellValue)
else
repl &cVfpcolumn with xlCellValue
endif
endif
endif
 sele xltovfp
endscan
endfor
=inkey(0.2)
this.forecolor = rgb(0,128,128)
thisform.vfpgrid.setfocus
4、记录起止行号的文本框控件代码(两个文本框代码相同):
this.value=iif(!type('xlapp')='U',xlapp.selection.row,1)
thisform.refresh
五、结束语
本程序经过两年多的使用,证明其操作简便、易学易用,在处理从Excel表到VFP表的数据转移工作方面灵活、快捷、高效。作为VFP应用系统很实用的一个组成部分,给日常的数据管理工作带来了很大的便利。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VFP批量读取EXCEL数据
EXCEL中常见问题问答
Excel之VBA常用功能应用篇:设置单元格条件格式方法介绍,FormatCondition对象
vfp中怎么向表单的数据环境中添加自由表?
VFP使用表缓冲
5秒完成两个excel表格的核对,想不到会这么快!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服