注册 登录
编程论坛 VFP论坛

如何将多个EXCEL文件 读入DBF中

王咸美 发布于 2021-12-14 13:12, 5107 次点击
同一文件夹下有多个EXCEL文件,格式相同,字段相同,如何将它们读入到DBF汇总表中?请高手帮忙,万分感谢!!!
只有本站会员才能查看附件,请 登录
24 回复
#2
吹水佬2021-12-14 15:01
只有本站会员才能查看附件,请 登录

程序代码:
cDefPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefPath)
CREATE CURSOR tt (编号 c(10),姓名 c(10),出生年月 c(10),语文 I, 数学 I,英语 I)
oExcel = CREATEOBJECT('Excel.Application')
oExcel.DisplayAlerts = 0
FOR i=1 TO ADIR(aXLS,"*.xls")
    sh = oExcel.WorkBooks.Open(cDefPath + aXLS[i,1]).ActiveSheet
    sh.Rows("1:2").Delete
    row1 = oExcel.CountA(sh.Columns(1))
    row2 = oExcel.CountA(sh.Columns(7))
    arr1 = sh.Cells(1,1).Resize(row1,6).Value  
    arr2 = sh.Cells(1,7).Resize(row2,6).Value  
    INSERT INTO tt FROM ARRAY arr1
    INSERT INTO tt FROM ARRAY arr2
    oExcel.WorkBooks.Close
ENDFOR
oExcel.Quit
SELECT * FROM tt
#3
gs25367856782021-12-14 15:43
先在EXCEL中拼好,然后再另存为DBF文件
这是一种朴素的做法
我一直是这样弄的。
#4
王咸美2021-12-14 15:50
@吹水佬 非常感谢!如果分数为小数:87.5、77.5、90.5 代码应如何写
#5
ls_y0412021-12-14 16:26
CREATE CURSOR tt (编号 c(10),姓名 c(10),出生年月 c(10),语文 n(6,2), 数学 n(6,2),英语 n(6,2))
oExcel = CREATEOBJECT('Excel.Application')
#6
easyppt2021-12-14 16:30
吹版的VFP-VBA 太牛了,点赞!
#7
王咸美2021-12-14 16:57
非常感谢各位的热心指点!如果将 出生年月 字段设置为日期型,代码如何写呢?
#8
ls_y0412021-12-14 17:12
查帮助CREATE  TABLE
#9
ls_y0412021-12-14 17:15
出生日期 D
#10
吹水佬2021-12-14 18:20
以下是引用gs2536785678在2021-12-14 15:43:55的发言:

先在EXCEL中拼好,然后再另存为DBF文件
这是一种朴素的做法
我一直是这样弄的。

有直路行就不绕路走
#11
吹水佬2021-12-14 18:24
回复 4楼 王咸美
DBF改为适用的数据类型
有必要的话也可以取EXCEL表的数据类型创建DBF表
#12
schtg2021-12-15 05:35
学习啦!
#13
ls_y0412021-12-15 06:22
vfp结合EXCEL太方便工作了,如何实现取工作表字段的数据类型,谢谢

[此贴子已经被作者于2021-12-15 06:24编辑过]

#14
wengjl2021-12-15 08:48
亦问:如何实现取工作表字段的数据类型?
#15
吹水佬2021-12-15 11:50
以下是引用wengjl在2021-12-15 08:48:32的发言:

亦问:如何实现取工作表字段的数据类型?

读出工作表数据用 VARTYPE() 判断
#16
wengjl2021-12-15 13:32
谢谢!
#17
ls_y0412021-12-15 14:41
https://blog.
#18
xuminxz2021-12-15 17:36
回复 3楼 gs2536785678
我遇到过类似问题,有300多个这样的Excel文件,要手工合并太难了。估计楼主要合并的文件可能不过百,也会有几十个
#19
王咸美2021-12-16 08:03
下列代码合并两个EXCEL文件后,DBF表文件中增加了两条空白记录,不知问题出自哪里?请高手赐教。
*!* 合并同一文件夹下多个EXCEL文件到DBF表文件中
Set Safety Off
Close Databases
Clear All
tpath=Sys(5)+Sys(2003)+[\]  &&读取当前路径
Select 1
Create Table 成绩汇总表( 编号 C(8),姓名 C(10),出生年月 C(10),语文 C(5),数学 C(10),英语 C(5))
tn=Adir(ts,"&tpath.*.xls")&&创建一个数组ts,遍历当前路径下所有.XLS文件
tm=1
Do While tm<=tn
    tfile=tpath +ts(tm,1)
    eole=Createobject("excel.application")&&创建Excel对象
    eole.workbooks.Open("&tfile.")&&调用Excel应用程序:
    eole.worksheets("sheet1").Activate &&设置第1个工作表为激活工作表
    eole.Visible=.F. &&不显示Excel窗口
    eole.displayalerts=.F.
    For i=1 To 2
        k=3 &&从第三行取值
        Do While k<33 &&假定Excel文件最多30行数据,可根据需要设置
            If Isnull(eole.cells(k,1).Value)&&空值判断,如值为空则不继续读取
                Exit
            Endif
            Select 1
            Append Blank
            Replace 编号 With Iif(Isnull(eole.cells(k,(i-1)*6+1).Value),[],Iif(Type("(eole.cells(k,(i-1)*6+1).value)")=[N], Alltrim(Str(eole.cells(k,(i-1)*6+1).Value, 8,0)), Alltrim(eole.cells(k,(i-1)*6+1).Value)))
            Replace 姓名 With Iif(Isnull(eole.cells(k,(i-1)*6+2).Value),[],Alltrim(eole.cells(k,(i-1)*6+2).Value))
            Replace 出生年月 With Alltrim(eole.cells(k,(i-1)*6+3).Text)
            Replace 语文 With Alltrim(eole.cells(k,(i-1)*6+4).Text)
            Replace 数学 With Alltrim(eole.cells(k,(i-1)*6+5).Text)
            Replace 英语 With Alltrim(eole.cells(k,(i-1)*6+6).Text)
            k=k+1
        Enddo
        
    Endfor
    eole.workbooks.Close
    eole.Quit
    tm=tm+1
Enddo
Close Databases
Retu
#20
吹水佬2021-12-16 10:36
Isnull()观察一下这样函数返回结果,看到的“空”不一定NULL
#21
王咸美2021-12-17 07:30
改动下列代码,问题已解决。

If Isnull(eole.cells(k,(i-1)*6+1).Value)&&空值判断,如值为空则不继续读取
     Exit
 Endif
#22
ls_y0412021-12-26 15:56
回复 21楼 王咸美
@吹水佬 我的工作中也有现类似的工作表放在同一个目录下,每个表的表头的能不能帮助处理一下,谢谢!报表单的SHEET2是想要的结果。
就是说表头的数据要保存成DBF表前部的数据,这样处理会方便以后的数据处理,做成主从表会更方便,这个是方便统计订货到货的事,很简单希望吹版主帮助落实一下。对合并单元格的处理还是不会处理。

只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-12-26 16:08编辑过]

#23
吹水佬2021-12-26 18:29
只有本站会员才能查看附件,请 登录

程序代码:
cDefPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefPath)
USE bjd
ZAP
oExcel = CREATEOBJECT('Excel.Application')
oExcel.DisplayAlerts = 0
sh = oExcel.WorkBooks.Open(cDefPath+"报价单.xlsx").Worksheets(1)
c车型     = NVL(sh.Cells(2,2).Value,"")
c车牌号   = NVL(sh.Cells(2,4).Value,"")
c颜色代码 = NVL(sh.Cells(2,7).Value,"")
c架子号   = NVL(sh.Cells(3,2).Value,"")
c折扣     = NVL(sh.Cells(3,5).Value,"")
c内饰颜色 = NVL(sh.Cells(3,7).Value,"")
FOR i=5 TO sh.UsedRange.Rows.Count
    INSERT INTO bjd VALUES (c车型,c车牌号,c颜色代码,c架子号,c折扣,c内饰颜色,;
        sh.Cells(i,1).Value,;
        NVL(sh.Cells(i,2).Value,""),;
        NVL(sh.Cells(i,3).Value,""),;
        sh.Cells(i,4).Value,;
        sh.Cells(i,5).Value,;
        NVL(sh.Cells(i,6).Value,""),;
        NVL(sh.Cells(i,7).Value,""),;
        NVL(sh.Cells(i,8).Value,""))
ENDFOR
oExcel.WorkBooks.Close
oExcel.Quit
SELECT * FROM bjd
#24
ls_y0412021-12-27 17:45
太完美无瑕
#25
lnzxd20062022-11-20 18:27
厉害,学习,之前一直不会使用VFP操作Excel,这回终于学习了!
1