摘自以前写的一个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编辑过]