Here's a complete Excel to DBF prg I wrote which can switch between method "1" and "2"...
"1" Uses COM and "2" uses a "save as" CSV method. Both make some basic assumptions about the target data that you might have to tweak. I do assume that everything is text to start out so that data isn't dropped.
The prg goes on to assume that there is only one data type (see the error coding used in the COM method to see how to deal with mixed data types).
I don't know if Lotus is a COM server or not so I don't know if this will be adapable...
CLOSE DATA ALL
SET SAFE OFF
SET TALK OFF
timer1=time()
&&start form variables
methodtouse=2 && 1=via com which is robust but slow or 2 which is saving as a comma delimfile which is fast
excelfile="c:\data.xls"
sheetnumber=1 && val from form default=1
startrow=2 && val from form default=2
headrow=startrow-1 && val from form
headersexists=1
linesofdata=3 && val from form, if null assume 100 (number to include headers)
firstcolumn=1 && val from form, if null assume A (1)
firstcolumnletter="A"
lastcolumn=10 && val from form, if null assume Z (26)
lastcolumnletter="O"
mapusing=1 &&val from form (1=headers in row before start row; 2= map by column order)
&&end form variables
&&Start Excel Import
#DEFINE False .F.
#DEFINE True .T.
*-- First, Create a Layout fro the data
for x=firstcolumn to lastcolumn
if x=firstcolumn
maketable="create table xlimport ("
endif
maketable=maketable+"col"+allt(str(x))+" c(32)"
if x<lastcolumn
maketable=maketable+","
endif
if x=lastcolumn
maketable=maketable+"

"
endif
endfor
&maketable
if methodtouse=1
for counter=headrow to headrow+linesofdata
append blank
endfor
endif
WAIT WINDOW NOWAIT "Opening Excel Connection..."
LOCAL loExcel, lcOldError, lcRange, lnSheets, lnCounter
lcOldError = ON("ERROR"

ON ERROR loExcel = .NULL.
loExcel = GetObject(, "Excel.Application"

ON ERROR &lcOldError
IF ISNULL(loExcel)
loExcel = CreateObject( "Excel.Application" )
ENDIF
if methodtouse=1
loExcel.Workbooks.Open(excelfile) && excelfile is form variable
*loexcel.visible=.t.
WAIT WINDOW NOWAIT "Starting Excel Import..."
if methodtouse=1
*-- Now, scan through the spreadsheet and put all
*-- the information into the table
lnRow = headrow
go top
scan
WAIT WINDOW NOWAIT "Populating cells: Record " + ALLTRIM(STR(RECNO()))+" of " + ALLTRIM(STR(linesofdata))
*-- Write the record into the table
for x=firstcolumn to lastcolumn
strcmd="repl col"+allt(str(x))+" with allt(loExcel.Activesheet.Cells(lnRow,"+allt(str(x))+"

.Value)"
numcmd="repl col"+allt(str(x))+" with allt(str(loExcel.Activesheet.Cells(lnRow,"+allt(str(x))+"

.Value,20,5))"
datecmd="repl col"+allt(str(x))+" with chrtran(allt(str(year(loExcel.Activesheet.Cells(lnRow,8).Value)))+(str(month(loExcel.Activesheet.Cells(lnRow,8).Value),2))+(str(day(loExcel.Activesheet.Cells(lnRow,8).Value),2)),' ','0')"
try=1 && assumes numbers work most often
if try=1
on error try=try+1
&numcmd
endif
if try=2 && assumes character is second most often
on error try=try+1
&strcmd
endif
if try=3 && assumes character is second most often
on error
&datecmd
endif
endfor
lnRow = lnRow + 1
endscan
Release loExcel
endif
set talk on
timer2=time()
?"this run took"
?timer1
?timer2
endif
if methodtouse=2
on error WAIT WINDOW NOWAIT "file in use..."
on error
wait window "Formatting and exporting data...." nowait
copy file &excelfile to c:\temp\temp4import.xls
excelfile="c:\temp\temp4import.xls"
loExcel.Workbooks.Open(excelfile) && excelfile is form variable
loExcel.DisplayAlerts = False
*loExcel.Visible = .T.
XLRange=firstcolumnletter+alltr(str(headrow))+":"+lastcolumnletter+alltr(str(linesofdata))
loExcel.Activesheet.Range(xlrange).NumberFormat="0.00000"
loExcel.Activesheet.Range(xlrange).Replace(Chr(34), ""

loExcel.Activesheet.Range(xlrange).Replace(",", ""

loExcel.Activesheet.Range(xlrange).Replace(Chr(39), ""

loExcel.Activesheet.Cells.Select
loExcel.Activesheet.Range(xlrange).ColumnWidth = 200
erase c:\temp\bobscsv.csv
loExcel.ActiveSheet.SaveAs("c:\temp\bobscsv.csv",6) &&6=XLcsv
loExcel.Workbooks.Close()
Release loExcel
use xlimport
append from c:\temp\bobscsv.csv type delim
delete for recno()>linesofdata
pack
endif
if headersexists=1
create table headers (fieldnum n(3), headername c(20),mapped c(3))
for tmpx=firstcolumn to lastcolumn
select xlimport
go 1
tmpvar="col"+alltr(str(tmpx))
tmpans=&tmpvar
select headers
append blank
repl headername with alltrim(tmpans)
endfor
repl all fieldnum with recno()
endif
WAIT WINDOW NOWAIT "Finished" timeout 1