Excel智能导入Grid
*********************************
***Excel智能导入Grid
*!*Create By Alan Hung
*!*Create Date:2016-06-29
**********************************
FUNCTION myExcelToGrid
LPARAMETERS LoGrid
IF VARTYPE(LoGrid)<>'O'
RETURN
ENDIF
IF LOWER(LoGrid.BaseClass)<>'grid'
RETURN
ENDIF
IF !USED(LoGrid.recordsource)
RETURN
ENDIF
LcFile=GETFILE('XLS,XLSX,XLSB,XLSM','请选择您要导入的文档')
IF EMPTY(LcFile)
RETURN
ENDIF
oExcelApp=''
TRY
oExcelApp=Createobject("excel.application")
CATCH
FINALLY
ENDTRY
IF VARTYPE(oExcelApp)<>'O'
MESSAGEBOX('创建Excel对象失败,程序将中止!',64,'Error')
RETURN
ENDIF
nGridCount=LoGrid.ColumnCount
OldSelect=SELECT()
oExcelApp.Application.workbooks.Open(LcFile)
nExcelRows=oExcelApp.ActiveSheet.UsedRange.Rows.Count
nExcelCols=oExcelApp.ActiveSheet.UsedRange.Columns.Count
DIMENSION acol(nGridCount)
lcAlias=ALLTRIM(LoGrid.recordsource)
&&智能对列
Lok=.f.
FOR i=1 TO nGridCount
LcHeaderCaption=ALLTRIM(UPPER(LoGrid.columns(i).header1.caption))
FOR j=1 TO nExcelCols
IF ALLTRIM(UPPER(oExcelApp.cells(1,j).Value))==LcHeaderCaption
acol(i)=j
Lok=.t.
ENDIF
ENDFOR
ENDFOR
IF Lok=.f.
oExcelApp.Quit
RELEASE oExcelApp
SELECT (OldSelect)
RETURN
ENDIF
cMessageText ='系统正在导入数据...'
WAIT WINDOW cMessageText AT srow()/2-2,(scols()-len(cMessageText))/2 NOWAIT NOCLEAR
LcValue=''
ZAP IN (lcAlias)
FOR nRow= 2 TO nExcelRows
SELECT (lcAlias)
APPEND BLANK IN (lcAlias)
FOR i=1 TO nGridCount
IF EMPTY(acol(i))
LOOP
ELSE
LcField=GETWORDNUM(LoGrid.columns(i).controlsource,2,'.')
LcValue=ALLTRIM(TRANSFORM(IIF(ISNULL(oExcelApp.cells(nRow,acol(i)).Value),'',NVL(oExcelApp.cells(nRow,acol(i)).Value,''))))
LfType=TYPE(LcField)
DO CASE
CASE LfType='T'
replace &LcField WITH CTOT(LcValue) IN (lcAlias)
CASE LfType='D'
replace &LcField WITH CTOD(LcValue) IN (lcAlias)
CASE INLIST(LfType,'N','Y','B','I','F')
replace &LcField WITH Val(LcValue) IN (lcAlias)
CASE LfType='L'
replace &LcField WITH IIF(INLIST(UPPER(LcValue),'YES','1','T','.T.'),.t.,.f.) IN (lcAlias)
OTHERWISE
replace &LcField WITH LcValue IN (lcAlias)
ENDCASE
ENDIF
ENDFOR
ENDFOR
oExcelApp.Quit
RELEASE oExcelApp
SELECT (OldSelect)
GO TOP IN (lcAlias)
LoGrid.setfocus
Logrid.autofit
WAIT CLEAR
ENDFUNC