标题:VFP如何获取一张EXCEL表中每一列的数据格式
只看楼主
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:108
帖 子:2175
专家分:3785
注 册:2007-4-27
结帖率:95.71%
已结贴  问题点数:20 回复次数:6 
VFP如何获取一张EXCEL表中每一列的数据格式
我想做到:用VFP打开一张EXCEL表(不显示EXCEL窗口),把表中的每一列数据的格式类型,显示在表单上。

不知道如何用代码得到EXCEL表中每一列数据的格式类型、宽度?请高手赐教!谢谢!
搜索更多相关主题的帖子: EXCEL 表中 数据格式 一列 VFP 
2020-12-22 08:10
gs2536785678
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:45
帖 子:565
专家分:1668
注 册:2017-7-16
得分:7 
我只能是在VF中读出EXCEL单元格的数据,然后判别它是什么类型
判别有TYPE函数
2020-12-22 08:49
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:7 
EXCEL表的列中可能有多种格式类型
2020-12-22 12:55
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
得分:7 
如果你的excel数据比较“规范”,那么可以遍历获取表头下的第一行,以此行各列的类型,作为整列的类型。
何谓“规范”? 每列有且只有一个表头,每列数据格式统一。
即:一个标准的二维表。
但是,实际上,这个要求并不总是能得到满足。
Excel并不是严格的二维表,他更像是一个xml格式的表,只不过以大家更习惯的表格方式展现出来而已.
2020-12-22 16:48
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:108
帖 子:2175
专家分:3785
注 册:2007-4-27
得分:0 
以下是引用厨师王德榜在2020-12-22 16:48:51的发言:

如果你的excel数据比较“规范”,那么可以遍历获取表头下的第一行,以此行各列的类型,作为整列的类型。
何谓“规范”? 每列有且只有一个表头,每列数据格式统一。
即:一个标准的二维表。
但是,实际上,这个要求并不总是能得到满足。
Excel并不是严格的二维表,他更像是一个xml格式的表,只不过以大家更习惯的表格方式展现出来而已.


您说的很对。
按标准的二维表,代码该如何写呢?

只求每天有一丁点儿的进步就可以了
2020-12-23 10:43
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
得分:0 
摘自以前写的一个excel to dbf的程序,内容有删节:
请侧重理解,而不是照抄...其中的注释部分,可能才是你需要注意的地方.

     EOLE.WORKSHEETS(shtName).ACTIVATE  && 以下获取用户数据区的行数、列数。
    LNROW=EOLE.SHEETS(shtName).USEDRANGE.ROWS.COUNT
    LNCOL=EOLE.SHEETS(shtName).USEDRANGE.COLUMNS.COUNT

NOTE 这里要考虑一个极端的情况:DBF最多只允许255列,而EXCEL中的数据很可能超出这个限制,这里应该设置检测,
* 排除极端情况。这也是一个健壮程序必须的要求。
IF LNCOL>254 THEN
    EOLE.QUIT
    RELEASE EOLE
    MESSAGEBOX("程序检测到EXCEL文件中的数据共有[" + LTRIM(STR(LNCOL)) + ;
        "]列之多," +CHR(10) + "这已经超出了DBF本身的承载能力!" +CHR(10) + ;
        "====================================" + CHR(10) + ;
        "建议用户考虑其它方式,并打开“指定起止列”选项,程序将返回。",16,'提示:源数据过大,程序无法继续!')
    RETURN
ENDIF


* 因除了检测列名称是否符合规范外,还要顾及列名称不能重复,故还是考虑用一个游标来存贮列名称和列属性、长度,
* 显然,用游标的好处是可以迅速用SQL语句查询有无重复值,并方便修改重复列名称。用户的表各种奇葩,而在EXCEL中,
* 是不检测列名称是否重复的,但是,当把EXCEL数据转换为严格意义的二维表时,这个问题必须要考虑进来,否则程序的健壮性太差。
* 并且,这个游标的格式,应该和AFIELDS()所形成的格式一致,这样还有的好处是最后在Create table 形成空白DBF时,
* 可以直接从游标装入一个临时数组,再从数组创建空白DBF,不必再浪费气力去拼凑SQL字符串……例如:
* SELECT * FROM strudbf INTO ARRAY af  && 从游标到数组
* CREATE CURSOR temp from ARRAY af  && 从数组创建新DBF ,不必去拼凑SQL字符串。
for lnI = 1 to lncol
coltype = VARTYPE(EOLE.ActiveSheet.CELLS(iRow_Col[1]+1,lnI).VALUE)

* 部分Excel中的类似于22:38:56 这样的时间值,如果任由VARTYPE()判断,得到的类型是数值型,转换后显然不能满足需要。20161228
    IF (AT("h",EOLE.ActiveSheet.CELLS(iRow_Col[1],lnI).NumberFormatLocal  )>0 AND ;
        AT("m",EOLE.ActiveSheet.CELLS(iRow_Col[1],lnI).NumberFormatLocal  )>0 AND ;
        AT("s",EOLE.ActiveSheet.CELLS(iRow_Col[1],lnI).NumberFormatLocal  )>0 ) THEN
        coltype = 'C'
    endif

* 先排除极端情况,如果第一行数据行,恰好有异常值,导致Vartype()刚好取到不属于字段类型:c, d,t, l, n, y 中的任何一个,
* 则以C型,作为该字段的默认类型。

略...
endfor

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

2020-12-23 13:05
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:108
帖 子:2175
专家分:3785
注 册:2007-4-27
得分:0 
谢谢,非常感谢!

只求每天有一丁点儿的进步就可以了
2020-12-23 13:15



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-504336-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.098130 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved