一个 Excel 文件中日期及数值 转DBF数据的处理方法
在EXCEL 中不同人录入时会有不同的习惯,如空值时会打空格,日期时会录入 2019.5、20190506、2019.05.06 、2019.5.6、2019-5-6,或是2019年5月6日,还有就是显示2019年5月,实际上是2019-5-1,有的还有日期时间型等等等。
我一般是都转换成文本格式,设置日期为 年月日格式,长型,用 4 位数字表示年,先用VARTYPE()得到值的类型。日期格式的,用dtoc()转换取10位的,"2019-01-01",数值格式也按需要取小数位,转成文本,其他的一般空值(NULL)和文本值,直接去掉前后空格导入;
SET DATE YMD LONG
SET CENTURY ON
alltrim(dtoc(excel_value,1))
alltrim(str(excel_value,100,2)) &&根据情况取小数位
另:VARTYPE( ) 函数与 TYPE( ) 函数类似, 但 VARTYPE( ) 执行更快,并且不需要用引号 ("") 将指定表达式括起。
Excel 文件内容如下
序号 EXCEL值类型 值
1 日期时间型 2019/1/1 11:01
2 日期型 2019年1月1日, 星期二
3 数值型 20190101.00
4 货币型 ¥20,190,101.00
5 常规 20190101
程序代码如下:
SET DATE YMD LONG
SET CENTURY ON
SET TALK OFF
CLOSE DATABASES all
CREATE TABLE ll FREE (B001 C(100) null,B002 C(100) null) &&创建数据表
SELECT ll
M_File=GETFILE('xls,xlsx','请选择EXCEL文件')
IF M_File==""
=MESSAGEBOX("请选择待导入 ECCEL 文件!",0+48,"提示")
RETURN
ELSE
IF JUSTEXT(M_FILE)#"XLS" AND JUSTEXT(M_FILE)#"XLSX" &&获得文件扩展名
=MESSAGEBOX("您选择的不是EXCEL文档!",0+48,"提示")
RETURN
ENDIF
ENDIF
My_excel=createobject('excel.application') &&创建一个对象
My_excel.Workbooks.open(M_File) &&打开指定文件
i=1
FOR EACH oMyVar IN My_Excel.sheets &&当前工作簿中 各工作表的名称
M_sheet="M_sheet"+ALLTRIM(STR(I))
i=i+1
&M_sheet=oMyVar.name
NEXT oMyVar
My_excel.Worksheets(M_sheet1).Activate &&激活第一表
UsedRange =My_excel.worksheets(M_sheet1).UsedRange &&返回工作表中可使用的区域,UsedRange表的属性
o_rows=UsedRange.rows.count &&汇总行
o_cols=UsedRange.columns.count &&汇总列
i=2
J=3
DO while .t.
excel_value=my_excel.cells(i,j).value
DO CASE
CASE vartype(excel_value)="T" &&日期时间型
C_value =ALLTRIM(DTOC(excel_value,1))
CASE vartype(excel_value)="D" &&日期型
C_value =alltrim(dtoc(excel_value,1))
CASE vartype(excel_value)="N" &&数值型
C_value =alltrim(str(excel_value,100,2)) &&根据情况取小数位
CASE vartype(excel_value)="Y" &&货币型
C_value =alltrim(str(excel_value,100,2)) &&根据情况取小数位
OTHERWISE &&其他
C_value = alltrim(excel_value) &&其他 取原值去掉前后空格
ENDCASE
SELECT ll
APPEND BLANK
REPLACE B001 WITH C_value,B002 WITH ALLTRIM(my_excel.cells(i,2).value)
i=i+1
IF i>=o_rows
EXIT
ENDIF
ENDDO
SELECT ll
BROWSE LAST
My_excel.Application.Visible=.T. && 置EXCEL可见
My_excel.WORKBOOKS.CLOSE &&关闭工作簿
My_excel.QUIT &&退出Excel
CLOSE all
RETURN