注册 登录
编程论坛 VFP论坛

VFP怎样自动读取多张样式相同的个人信息采集表(Excel格式)到dbf汇总表中

王咸美 发布于 2021-04-12 14:47, 2706 次点击
现有多张样式相同的个人信息采集表(Excel格式)如何利用VFP程序自动读取到dbf汇总表中,望高手赐教,万分感谢!!!
只有本站会员才能查看附件,请 登录
17 回复
#2
zhousr2021-04-12 15:06
把这些表放在一个文件夹中,遍历,依次打开EXCEL,将内容读入数组,插入汇总表中。遍历代码自己写,读入、插入代码供参考:
Create table zsjh (yxdm c(10),yxmc c(70), zydm c(10),zymc c(200), xz c(16), bzk c(15), sf c(10),cs c(10),shouf c(20), zsjh n(10,0), jh17 n(10,0), jh18 n(10,0), jh19 n(10,0), jh20 n(10,0),fs17 n(10,0), fs18 n(10,0), fs19 n(10,0), fs20 n(10,0),wc17 n(15,0), wc18 n(15,0), wc19 n(15,0), wc20 n(15,0),zhbfd n(12,7), xkkm c(60),bz m,ckxx m)
ox = CREATEOBJECT("Excel.Application")  &&已有汇总表的话,此句可省略。
ox.workbooks.open(GETFILE("xlsx"))  &&改为遍历
lnrow = ox.activesheet.usedrange.rows.count
lncol = ox.activesheet.usedrange.columns.count
DIMENSION laxls(lnrow,lncol)
laxls = ox.activesheet.usedrange.value
ox.quit
insert into zsjh from array laxls
brow
#3
王咸美2021-04-12 15:50
个人信息采集表的样式是这样的:
只有本站会员才能查看附件,请 登录


下列代码有两处错误(红色显示),请各位大侠赐教,万分感谢!!!
Close Databases
Use Grxx && 表结构 字段内容 C(10) 类型 C(1) 位置 C(4)
Local Axx[Reccount()] && 无效的下标引用
Eole=CREATEOBJECT('Excel.Application')
With Eole
    For lnI=1 To Adir(Axls,"*.Xls")
        .Workbooks.Open(Sys(5)+Sys(2003)+"\"+Axls[lnI,1])
        Select Grxx
        Scan
            Do Case
               Case Inlist(Alltrim(类型),"C","M")
                    Axx[Recno()]=ALLTRIM(.Range(位置).Text)
               Case Alltrim(类型)=="D"
                    Axx[Recno()]=Ctod(Transform(.Range(位置).Text,"@R 9999-99-99"))
               Case Alltrim(类型)=="N"
                    Axx[Recno()]=Val(.Range(位置).Text)
            Endcase
        Endscan
        Insert Into 信息汇总表 From Array Axx && 找不到变量“Axx”
    Endfor
    .quit
Endwith
RELEASE Eole
Select 信息汇总表
Browse
Use In 信息汇总表
Use In Grxx

[此贴子已经被作者于2021-4-13 08:45编辑过]

#4
radiofan2021-04-12 20:08
说明
局部内存变量和变量数组只能在创建它们的过程或函数中使用和更改,不能被高层或低层程序访问。一旦包含局部内存变量和数组的过程或函数执行完毕,则这些局部内存变量和数组将被释放。

用 LOCAL 创建的变量和数组初始化为假(.F.)。

必须在赋值之前把内存变量或数组声明为局部。如果在用 LOCAL 声明内存变量或数组为局部之前,在程序中对它们进行赋值,则 Visual FoxPro 产生一条语法错误。

可以按引用传递局部变量。
#5
王咸美2021-04-13 08:34
代码如何改,望赐教!!!
#6
gs25367856782021-04-13 10:03
没有办法,表格太复杂了,还是发动群众,增加人手,每个十张表格,手工录入吧。
#7
sdta2021-04-13 10:24
回复 5楼 王咸美
Grxx.DBF 创建了吗
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-4-13 10:38编辑过]

#8
王咸美2021-04-13 11:09
@sdta 非常感谢指导!!!Grxx.dbf已创建,仍提示 Local Axx[Reccount()] “ 无效的下标引用”,望指教!
#9
sdta2021-04-13 11:37
以下是引用王咸美在2021-4-13 11:09:17的发言:

@sdta 非常感谢指导!!!Grxx.dbf已创建,仍提示 Local Axx[Reccount()] “ 无效的下标引用”,望指教!

贴上完整代码
#10
王咸美2021-04-13 11:52
完整代码如下:
Close Databases
use 信息汇总表 in 0
zap
Use Grxx in 0 && 表结构 字段内容 C(10) 类型 C(1) 位置 C(4)
Local Axx[Reccount()] && 无效的下标引用
Eole=CREATEOBJECT('Excel.Application')
With Eole
    For lnI=1 To Adir(Axls,"*.Xls")
        .Workbooks.Open(Sys(5)+Sys(2003)+"\"+Axls[lnI,1])
        Select Grxx
        Scan
            Do Case
               Case Inlist(Alltrim(类型),"C","M")
                    Axx[Recno()]=ALLTRIM(.Range(位置).Text)
               Case Alltrim(类型)=="D"
                    Axx[Recno()]=Ctod(Transform(.Range(位置).Text,"@R 9999-99-99"))
               Case Alltrim(类型)=="N"
                    Axx[Recno()]=Val(.Range(位置).Text)
            Endcase
        Endscan
       Insert Into 信息汇总表 From Array Axx && 找不到变量“Axx”
    Endfor
    .quit
Endwith
RELEASE Eole
Select 信息汇总表
Browse
Use In 信息汇总表

#11
sdta2021-04-13 12:26
Use Grxx in 0 && 表结构 字段内容 C(10) 类型 C(1) 位置 C(4)
SELECT grxx
Local Axx[Reccount()] && 无效的下标引用

或者
Use Grxx in 0 && 表结构 字段内容 C(10) 类型 C(1) 位置 C(4)
Local Axx[Reccount("Grxx")] && 无效的下标引用

楼主的基础实在是太弱了

[此贴子已经被作者于2021-4-13 12:31编辑过]

#12
王咸美2021-04-13 12:53
@sdta 非常感谢!!!完美解决问题。
#13
radiofan2021-04-13 13:08
以下是引用sdta在2021-4-13 12:26:54的发言:

Use Grxx in 0 && 表结构 字段内容 C(10) 类型 C(1) 位置 C(4)
SELECT grxx
Local Axx[Reccount()] && 无效的下标引用

或者
Use Grxx in 0 && 表结构 字段内容 C(10) 类型 C(1) 位置 C(4)
Local Axx[Reccount("Grxx")] && 无效的下标引用

楼主的基础实在是太弱了

#14
ycvf2021-04-15 16:47
回复 10楼 王咸美
能否补齐每行代码的注释
只有本站会员才能查看附件,请 登录
#15
wengjl2021-04-16 08:09
这里的位置,是叫你换成数据在EXCEL中的单元格坐标
#16
ycvf2021-04-16 08:38
回复 15楼 wengjl
只有本站会员才能查看附件,请 登录

尽管查了很多资料,也看不懂这几行的代码?能否帮加个注释
#17
wengjl2021-04-16 12:25
程序代码:
    *************************************
    * 名称:读取E表中的个人信息
    * 思路:
    *************************************
    SET ENGINEBEHAVIOR 70
    SET SAFETY OFF
    SET TALK OFF
    *---
    PUBLIC mypath
    cCurrentProcedure = SYS(16,1)
    nPathStart = AT(":",cCurrentProcedure)- 1
    nLenOfPath = RAT("\", cCurrentProcedure) - (nPathStart)
    mypath=SUBSTR(cCurrentProcedure, nPathStart, nLenofPath)
    SET DEFAULT TO (mypath)
    t=SECONDS()
    CLOSE DATABASES   
    SELECT 0
    USE 信息汇总表 ALIAS bmk
    ZAP
    SELECT 0
    USE grxx ALIAS kg
    MyExcel=createobject('excel.application')          &&创建一个对象
    IF !VARTYPE(myexcel)$"O.o"      &&& 如果用户的电脑上未装EXCEL软件,则结束运行。
     MESSAGEBOX("建立EXCEL文件失败,请检查OFFICE是否正常!",48,"提醒:")
     RETURN
    ENDIF
    MyExcel.visible=.T.                    &&& 对象不可见
    MyExcel.DisplayAlerts = .F.            &&& 关闭EXCEL的系统对话框
    FOR i=1 TO 9   
      filemc="个人信息采集表00"+STR(i,1)+".xls"
      Mb_excel=myexcel.workbooks.open(mypath+"\"+filemc)     && 打开指定文件
      SELECT bmk
      APPEND BLANK
      SELECT kg
      GO TOP
      SCAN   
        c_fnam=ALLTRIM(kg.字段内容)
        c_wz=ALLTRIM(kg.位置)
        SELECT bmk
        REPLACE ('bmk.'+c_fnam) WITH Mb_excel.activesheet.cells(&c_wz.).text
        SELECT kg
      ENDSCAN  
      MyExcel.ActiveWorkbook.close     
    ENDFOR  
    *-------   
    MyExcel.DisplayAlerts = .T.   &&& 恢复EXCEL的系统对话框
    MyExcel.WorkBooks.close       &&& 关闭工作区  
    MyExcel.QUIT                  &&& 关闭excel
    RELEASE MyExcel               &&& 释放对象变量,以完全结束EXCEL的进程
    CLOSE DATABASES
    ? SECONDS()-t
    MESSAGEBOX('读取结束!',64,'提示:',1000)
    QUIT   
#18
wengjl2021-04-16 13:15
range("A3") 可识别。RANGE(3,1) 无法识别
1