注册 登录
编程论坛 VFP论坛

将excel逐个转为dbf,代码未运行成功,请问错在哪里了?能帮我指出来吗?谢谢!

杂七杂八 发布于 2020-12-04 21:52, 3294 次点击
程序代码:
SET DEFAULT TO ADDBS(JUSTPATH(SYS(16)))                 
CLEAR  
CLOSE  all
SET SAFETY OFF

iCount=ADIR(xlsList,"xls")
FOR i=1 to iCount
    xlsName=xlsList(i,1)
    ff=JUSTSTEM(xlsName)
      
cExcel =SYS(5)+SYS(2003)+"\"+ff+'.xls'   
cHDR = "YES"   
cSheet = "[sheet1$A2:d]"
cSQL = "SELECT * FROM " + cSheet
    cConn = "Provider=Microsoft.ACE.OLEDB.12.0;";
            + "Extended Properties='Excel 12.0;HDR="+cHDR+";IMEX=1';";
            + "Data Source=" + cExcel
oConn = CREATEOBJECT("ADODB.Connection")
oConn.Open(cConn)
oRs = CREATEOBJECT("ADODB.Recordset")
oRs.Open(cSQL, oConn, 1, 3, 1)
oRs.MoveFirst
cstr = ""

CREATE CURSOR tt (编号 I, 姓名 C(10), 联系电话 C(20), 部门 C(10))
cStr = oRs.GetString()
STRTOFILE(cStr, "tmp.txt")
SELECT tt
APPEND FROM tmp.txt DELIMITED WITH TAB  FOR 编号<>0

 COPY TO &ff
oRs.Close
oConn.Close
CLEAR ALL
*RETURN
ENDFOR

****以上代码未运行成功,请问错在哪里了?能帮我指出来吗?谢谢!
只有本站会员才能查看附件,请 登录

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


[此贴子已经被作者于2020-12-5 06:21编辑过]

13 回复
#2
qingss2020-12-05 09:11
我的做法和你的思路不一样,一般XLS文件要转为DBF,应该保证XLS文件有固定的结构。
1、创建DBF文件
2、读取XLS的每一行并插入至DBF文件

如果你需要,可发一个程序段给你,告诉我你的邮箱。
#3
吹水佬2020-12-05 19:33
用 Excel.Application 也可以
只有本站会员才能查看附件,请 登录

程序代码:
cDefaultPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefaultPath)
SET SAFETY OFF
CREATE CURSOR tt (编号 I, 姓名 C(10), 联系电话 C(20), 部门 C(10))
xls_dbf(cDefaultPath + "通讯录校长室.xls")
xls_dbf(cDefaultPath + "通讯录教导处.xls")
BROWSE
RETURN

FUNCTION xls_dbf(cInXLS)
    cOutTXT = cDefaultPath + "tmp.txt"
    oExcel = CREATEOBJECT("Excel.Application")
    oExcel.DisplayAlerts = .F.
    oExcel.WorkBooks.Open(cInXLS)
    oExcel.ActiveWorkBook.SaveAs(cOutTXT, -4158)
    oExcel.WorkBooks.Close
    oExcel.Quit
    SELECT tt
    APPEND FROM (cOutTXT) DELIMITED WITH TAB FOR 编号<>0
    DELETE FILE (cOutTXT)
ENDFUNC
#4
吹水佬2020-12-05 21:04
回复 楼主 杂七杂八
改几处看看
1、iCount=ADIR(xlsList,"xls")
  改为 iCount=ADIR(xlsList,"*.xls")
2、cSheet = "[sheet1$A2:d]"
  改为:cSheet = "[sheet1$A:d]"
3、
CLEAR ALL
ENDFOR
改为:
ENDFOR
CLEAR ALL

[此贴子已经被作者于2020-12-5 21:08编辑过]

#5
schtg2020-12-06 05:30
@杂七杂八,根据你的,结合吹水版主的改动,整理了一下,请试一试.

[此贴子已经被作者于2020-12-6 05:42编辑过]

#6
schtg2020-12-06 05:30
@杂七杂八,根据你的,结合吹水版主的改动,整理了一下(VFP 9.0),请试一试:
程序代码:
SET DEFAULT TO ADDBS(JUSTPATH(SYS(16)))                 
CLEAR  
CLOSE  all
SET SAFETY OFF

iCount = ADIR(xlsList,"*.xls")
FOR i = 1 to iCount
    xlsName = xlsList(i,1)
    ff = JUSTSTEM(xlsName)
    cExcel = SYS(5) + CURDIR() + ff + '.xls'   
    cSheet = "[sheet1$A:d]"
    cSQL = "SELECT * FROM " + cSheet
    cConn = "DBQ=" + cExcel + ";DefaultDir=C:\;Driver={Microsoft Excel Driver (*.xls)};FIL=excel 4.0;ReadOnly=0;UID=admin;pwd=;"
    m_conn = sqlstringconnect(cConn)         
    if m_conn > 0
       *  messagebox("连接成功",64,"数据源")
       oConn = CREATEOBJECT("ADODB.Connection")
       oConn.Open(cConn)
      
       oRs = CREATEOBJECT("ADODB.Recordset")
       oRs.Open(cSQL, oConn, 1, 3, 1)
       oRs.MoveFirst
       cstr = ""
      
       CREATE CURSOR tt (编号 I, 姓名 C(10), 联系电话 C(20), 部门 C(10))
       cStr = oRs.GetString()
      
       STRTOFILE(cStr, "tmp.txt")
       SELECT tt
       APPEND FROM tmp.txt DELIMITED WITH TAB FOR 编号<>0

       COPY TO (ff)
       oRs.Close
       oConn.Close
    else
       messagebox("连接不成功",64,"数据源")  
    endif
ENDFOR
CLEAR ALL
CLOSE ALL
QUIT


[此贴子已经被作者于2020-12-6 05:42编辑过]

#7
杂七杂八2020-12-07 05:56
谢谢吹水佬
谢谢schtg
在学习中……,不明白的地方再请教。
最终想实现:
1、程序放在哪儿都能运行;
2、excel有20~30个结构完全相同,只不过是excel表文件名不同;
3、excel逐个转换成同名dbf表后,合并生成一个总表dbf。

[此贴子已经被作者于2020-12-7 06:11编辑过]

#8
wangzhiyi2020-12-07 10:08
以下是引用杂七杂八在2020-12-7 05:56:20的发言:

谢谢吹水佬
谢谢schtg
在学习中……,不明白的地方再请教。
最终想实现:
1、程序放在哪儿都能运行;
2、excel有20~30个结构完全相同,只不过是excel表文件名不同;
3、excel逐个转换成同名dbf表后,合并生成一个总表dbf。

SET TALK OFF
SET SAFETY OFF
CLEAR ALL
CLEAR
dir1=GETDIR()
SET DEFAULT TO &dir1.
CREATE CURSOR tt (编号 I, 姓名 C(10), 联系电话 C(20), 部门 C(10))
myexcel=createobject('excel.application')
myexcel.visible=.t.
FOR i=1 TO ADIR(xfile,"*.xls*")
    bookexcel=myexcel.workbooks.open(dir1+xfile(i,1))
    o_SheetName=myexcel.application.ActiveSheet.Name
    sj=bookexcel.Worksheets(o_SHEETNAME).usedrange.value
    FOR j=2 TO ALEN(sj,1)
        APPEND BLANK
        REPLACE 编号 WITH sj(j,1),姓名 WITH sj(j,2),联系电话 WITH sj(j,3),部门 WITH sj(j,4)
    ENDFOR
ENDFOR
BROWSE
SET TALK ON
SET SAFETY ON
RETURN


[此贴子已经被作者于2020-12-7 15:17编辑过]

#9
shenkj0012020-12-07 11:03
回复 8楼 wangzhiyi
经测试:FOR j=2 TO ALEN(sj,2)改为 FOR j=2 TO ALEN(sj,1) &&1为行数
#10
杂七杂八2020-12-07 19:28
回复 9楼 shenkj001
运行到cStr = oRs.GetString()时出现
只有本站会员才能查看附件,请 登录

这个提示不明白。
#11
杂七杂八2020-12-07 19:28
回复 9楼 shenkj001
运行到cStr = oRs.GetString()时出现
只有本站会员才能查看附件,请 登录

这个提示不明白。
#12
shenkj0012020-12-07 23:03
回复 11楼 杂七杂八
SET TALK OFF
 SET SAFETY OFF
 CLEAR ALL
 CLEAR
 dir1=GETDIR()
 SET DEFAULT TO &dir1.
 CREATE CURSOR tt (编号 I, 姓名 C(10), 联系电话 C(20), 部门 C(10))
 myexcel=createobject('excel.application')
 myexcel.visible=.t.
 FOR i=1 TO ADIR(xfile,"*.xls*")
     bookexcel=myexcel.workbooks.open(dir1+xfile(i,1))
     o_SheetName=myexcel.application.ActiveSheet.Name
     sj=bookexcel.Worksheets(o_SHEETNAME).usedrange.value   
     FOR j=2 TO ALEN(sj,1)     
         APPEND BLANK
         REPLACE 编号 WITH sj(j,1),姓名 WITH sj(j,2),联系电话 WITH sj(j,3),部门 WITH sj(j,4)
     ENDFOR      
    myexcel.Activeworkbook.close(.F.)
    myexcel.quit
 ENDFOR
 BROWSE
 SET TALK ON
 SET SAFETY ON
 RETURN
以上代码测试可以通过

[此贴子已经被作者于2020-12-7 23:44编辑过]

#13
zjsrh2020-12-20 17:30
先定义好dbf的结构。然后存入数组,数组在存入dbf。
LNCOL=oExcel.ActiveSheet.USEDRANGE.COLUMNS.COUNT   &&表有几列
LNrow=oExcel.ActiveSheet.USEDRANGE.rowS.COUNT    &&表有几行

USE (xxx) IN 0 ALIAS dxtz
SELECT  dxtz
ZAP
FOR i=2 TO LNrow STEP 60000  &&数组最多可以65000
    rangefirstrow=MIN(i,LNrow)
    rangenextrow=Min(i+59999,LNrow)
    excelrange="A"+TRANSFORM(rangefirstrow)+":"+excelCOLU(LNCOL)+ TRANSFORM(rangenextrow)    &&选择导入范围
    arrTableInfo=oExcel.ActiveSheet.Range(excelrange).Value    &&工作表内容存入数组
    INSERT INTO dxtz FROM ARRAY arrTableInfo    &&数组存入dbf
    RELEASE  arrTableInfo
ENDFOR
#14
gs25367856782020-12-22 08:54
看过各位朋友的表达,我却有不同的思想与各位共享:
我的认识是这样的,
如果你只是偶尔使用EXCEL转化到
DBF表,请把EXCEL另存为SCV格式
如果你经常要做EXCEL转化到DBF,
请你安装EXCEL2003
因为EXCEL03可以直接转化成DBF简单又方便。
1