回 帖 发 新 帖 刷新版面

主题:[原创]一个把EXCEL转换为DBF的表单

最近用VFP9.0编了一个把EXCEL转换为DBF的表单,供初学者及VFP爱好者借鉴和参考。只经过简单的测试,有不当之处,请反馈信息或修改建议。

回复列表 (共21个回复)

沙发

好贴,慢慢学习。

板凳

顶一个!

3 楼

ok ok ok !!!!!!!!!!!!!!!!!

4 楼


正需要这个,感谢分享!

5 楼

楼主我想您还是看看本坛的高老师的方法,尽管告老师对本坛已心灰意冷,但我还是想把他公开发表的杰作重新回贴到本坛,以感谢高老师对我的启发,也非常支持楼主对初学者及VFP爱好者的热诚和无私的奉献..

从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表中要接受数据的字段之间一一对应的关系,这项工作等于给两表之间的数据转移牵线搭桥,是非常关键的一项任务(如图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表中对应的字段中,复制过程还可能要转换数据类型以及对数值型数据做小数位数的调整工作。
四、主要代码

6 楼

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应用系统很实用的一个组成部分,给日常的数据管理工作带来了很大的便利。
参考文献:
[1] 李加福等. Visual FoxPro6.0中文版入门与提高[M]. 北京. 清华大学出版社. 1999年6月. 
[2] 焦赞康. 在VFP中全面控制Excel. 中国计算机报[J]. 1999.7. 
[3] 何咏明. VFP与Excel交互编程. 计算机世界报 第01期 C14、C15.
[4] 张夏林,汪新庆,王兴. 编程实现VFP6.0操纵Word灵活打印特殊格式的报表. 电脑编程技巧与维护[J]. 2001年2月. 第2期.

 

The method of achieved by programming to transfer data from Excel-table to VFP-table
Gao Jinlong,Cui Shangsen,Wang Wenlin
(Chang’an University,Xi’an China 710054)
Abstract:It’s not difficult to wholly transfer data to a VFP-table from a Excel-table, the difficult point is to transfer some rows of data or some columns in a row of data from a Excel-table to a existing VFP-table. And that it’s possible to appear such as the name of the columns, the type of the data, the order of the columns is different in the two class tables. The author of this paper easily achieved this work by VFP programming. 
KeyWords:Excel-table, VFP-table, transfer of data, achieved by programming

7 楼


高老师的作品给了我很大的启示,exceltodbf 这个表单我大概是在两年前就看到了,且一直在用。确实不错。[em2]

8 楼

这个事例的图在哪里啊?

9 楼

你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846

10 楼


正需要这个,感谢分享!

我来回复

您尚未登录,请登录后再回复。点此登录或注册