注册 登录
编程论坛 VFP论坛

VFP如何读取OFFICE 2010版本里的excel表格里的数据

HUXINGKE 发布于 2020-03-07 16:04, 6722 次点击
VFP如何读取OFFICE 2010版本里的excel表格里的数据
在OFFICE低版本里,可以打开 ,但是在2010以后,就无法使用了,谁有经验,分享一下

     oleapp=CREATEOBJECT("Excel.application")
     oleapp.workbooks.open("C:\库存资料.XLS")
     I=2   
     II=1
       WAIT "正在导入数据:"+ALLT(STR(II)) WINDOWS NOWAIT
      **************编码 ***************************
       BM=oleapp.cells(I,1).VALUE

现在用不了,请高手指导下
23 回复
#2
吹水佬2020-03-07 17:09
给个XLS文件看看

#3
HUXINGKE2020-03-07 19:29
回复 2楼 吹水佬
只有本站会员才能查看附件,请 登录

TKS
#4
吹水佬2020-03-07 21:22
回复 3楼 HUXINGKE
Win10 + EXCEL2007 未见异常
只有本站会员才能查看附件,请 登录

oleapp=CREATEOBJECT("Excel.application")
oleapp.workbooks.open("C:\TEMP\库存资料\库存资料.xls")
FOR i=1 TO oleapp.ActiveSheet.UsedRange.Rows.Count
    ?
    FOR ii=1 TO oleapp.ActiveSheet.UsedRange.Columns.Count
        WAIT "正在导入数据:"+ALLT(STR(II)) WINDOWS NOWAIT
        IF VARTYPE(oleapp.Cells[i,ii].Value)=="N"
            ?? " ",PADR(TRANSFORM(oleapp.Cells[i,ii].Value,"###.##"),6," ")
        ELSE
            ?? " ",PADR(oleapp.Cells[i,ii].Value,6," ")
        ENDIF
    ENDFOR
ENDFOR
oleapp.WorkBooks.Close
oleapp.Quit
CLEAR ALL
#5
HUXINGKE2020-03-08 09:55
回复 4楼 吹水佬
谢谢,是用2010打开的吗,PADR是个什么函数,没用过。非常感谢
#6
吹水佬2020-03-08 11:01
以下是引用HUXINGKE在2020-3-8 09:55:29的发言:

谢谢,是用2010打开的吗,PADR是个什么函数,没用过。非常感谢

测试用EXCEL2007,PADR()是显示格式用的。
如果是EXCEL版本问题,可试试用ADO获取EXCEL表数据,如:
只有本站会员才能查看附件,请 登录

SET DEFAULT TO ADDBS(JUSTPATH(SYS(16)))                 
CLEAR
SET SAFETY OFF
cExcel = "C:\TEMP\库存资料\库存资料.xls"
cHDR = "YES"   
cSheet = "[Sheet1$A:R]"
cSQL = "SELECT * FROM " + cSheet
cConn = "Provider=Microsoft.ACE.OLEDB.12.0;";
        + "Extended Properties='Excel 12.0;HDR="+cHDR+";IMEX=1';";
        + "Data Source=" + cExcel
**    * EXCEL2003及之前版本
**    cConn = "Provider=Microsoft.Jet.OLEDB.4.0;";
**           + "Extended Properties='Excel 8.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
CREATE CURSOR tt (编码 C(6),名称 C(10),车型 C(10),数量 I,单位 C(2),成本价 N(6,2),;
    销售价 N(6,2),批发价 N(6,2),产地 C(4),备注 C(6),免税价 N(6,2),仓位 C(2),;
    编码一 C(4),编码二 C(4),分类 C(4),规格 C(4),供应商 C(4),最低库存 N(6,2))
cStr = oRs.GetString()
STRTOFILE(cStr, "tmp.txt")
SELECT tt
APPEND FROM tmp.txt DELIMITED WITH TAB
SELECT * FROM tt
oRs.Close
oConn.Close
CLEAR ALL
RETURN


[此贴子已经被作者于2020-3-8 11:08编辑过]

#7
星光悠蓝2020-03-08 12:28
好久没用VFP操作EXCEL
#8
HUXINGKE2020-03-08 14:41
回复 6楼 吹水佬
非常感谢,我试试,多学了好多东西
#9
xs5912222020-05-10 07:35
有可能是你的office2010安装有问题,重新完全安装一下。我曾遇到过
#10
asdf_1230002020-05-11 12:53
重装一下,有些能解决
#11
josenko2020-05-11 14:00
非常感谢,多学了好多东西
#12
zhken2020-05-11 21:40
其实很多时侯不同版本的EXCEL 都会出现异常,但有一点是只要将原文档 另存为 95的EXCEL格式,一般都可以通过
#13
wengjl2020-11-20 10:21
我的数据有数十万条,所以只能用高版本。
#14
sdta2020-11-20 10:45
以下是引用wengjl在2020-11-20 10:21:55的发言:

我的数据有数十万条,所以只能用高版本。

在EXCEL中查看十万条记录的数据也是头痛的事情
#15
wangzhiyi2020-11-20 11:05
win7+vfp9 正常。
只有本站会员才能查看附件,请 登录
#16
杂七杂八2020-11-21 21:21
win10+EXCEL2007,不能正常运行,卡住了。
只有本站会员才能查看附件,请 登录

#17
杂七杂八2020-11-21 21:21
win10+EXCEL2007,不能正常运行,卡住了。
只有本站会员才能查看附件,请 登录

#18
吹水佬2020-11-21 21:42
回复 17楼 杂七杂八
语句写错了吧
只有本站会员才能查看附件,请 登录

应该是:
oConn.Open(cConn)
#19
杂七杂八2020-11-21 21:48
只有本站会员才能查看附件,请 登录
#20
杂七杂八2020-11-21 21:48
只有本站会员才能查看附件,请 登录
#21
吹水佬2020-11-21 22:52
回复 20楼 杂七杂八
去6楼找
是参考6楼的代码吧
#22
杂七杂八2020-11-22 10:46
回复 21楼 吹水佬
谢谢!成了。
#23
zdylxh2021-02-16 16:14
以下是引用吹水佬在2020-3-8 11:01:13的发言:


测试用EXCEL2007,PADR()是显示格式用的。
如果是EXCEL版本问题,可试试用ADO获取EXCEL表数据,如:

SET DEFAULT TO ADDBS(JUSTPATH(SYS(16)))                 
CLEAR
SET SAFETY OFF
cExcel = "C:\TEMP\库存资料\库存资料.xls"
cHDR = "YES"   
cSheet = "[Sheet1$A:R]"
cSQL = "SELECT * FROM " + cSheet
cConn = "Provider=Microsoft.ACE.OLEDB.12.0;";
        + "Extended Properties='Excel 12.0;HDR="+cHDR+";IMEX=1';";
        + "Data Source=" + cExcel
**    * EXCEL2003及之前版本
**    cConn = "Provider=Microsoft.Jet.OLEDB.4.0;";
**           + "Extended Properties='Excel 8.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
CREATE CURSOR tt (编码 C(6),名称 C(10),车型 C(10),数量 I,单位 C(2),成本价 N(6,2),;
    销售价 N(6,2),批发价 N(6,2),产地 C(4),备注 C(6),免税价 N(6,2),仓位 C(2),;
    编码一 C(4),编码二 C(4),分类 C(4),规格 C(4),供应商 C(4),最低库存 N(6,2))
cStr = oRs.GetString()
STRTOFILE(cStr, "tmp.txt")
SELECT tt
APPEND FROM tmp.txt DELIMITED WITH TAB
SELECT * FROM tt
oRs.Close
oConn.Close
CLEAR ALL
RETURN



-----------------------------------------
当数据有40万条,运行至cStr = oRs.GetString(),报错“OLE IDispatch异常代码О出自Provider:内存资源不足,无法完成此操作。”,该怎么解决啊,请教高人。

#24
sdta2021-02-16 16:38
回复 23楼 zdylxh
上传数据看看
或者另外发帖
1