*!* VFPToExcel.prg *!* Author : Cetin Basoz * Parameters: * tcCursorName * toRange - target to place * tcHeaders: Optional. Defaults to field headers * tnPrefferredWidthForMemo: Optional. Default 80 Lparameters tcCursorName, toRange, tcHeaders, tnPrefferredWidthForMemo tcCursorName = Evl(m.tcCursorName,Alias()) tnPrefferredWidthForMemo = Evl(m.tnPrefferredWidthForMemo,80) Local loConn As AdoDB.Connection, loRS As AdoDB.Recordset,; lcTemp,lcTempDb, oExcel,ix, lcFieldName, lcHeaders lnSelect = Select() lcTemp = Forcepath(Sys(2015)+'.dbf',Sys(2023)) lcTempDb = Forcepath(Sys(2015)+'.dbc',Sys(2023)) Create Database (m.lcTempDb) Select * From (m.tcCursorName) Into Table (m.lcTemp) Database (m.lcTempDb) Local Array aMemo[1] Local nMemoCount nMemoCount = 0 lcHeaders = '' For ix = 1 To Fcount() lcFieldName = Field(m.ix) If Type(Field(m.ix))='M' nMemoCount = m.nMemoCount + 1 Dimension aMemo[m.nMemoCount] aMemo[m.nMemoCount] = m.ix Replace All &lcFieldName With Chrtran(&lcFieldName,Chr(13)+Chr(10),Chr(10)) Endif lcHeaders = m.lcHeaders + Iif(Empty(m.lcHeaders),'',',')+Proper(m.lcFieldName) Endfor tcHeaders = Evl(m.tcHeaders,m.lcHeaders) Use In (Juststem(m.lcTemp)) Close Databases Set Database To loConn = Createobject('ADODB.Connection') loRS = Createobject("ADODB.Recordset") loConn.ConnectionString = "Provider=VFPOLEDB;Data Source="+m.lcTempDb loConn.Open() loRS = loConn.Execute("select * from "+m.lcTemp) * Use first row for headers Local Array aHeader[1] toRange.Offset(1,0).CopyFromRecordSet( loRS ) && Copy data starting from headerrow + 1 loRS.Close loConn.Close Set Safety Off Delete Database (m.lcTempDb) Deletetables Select (m.lnSelect) For ix=1 To Iif( !Empty(m.tcHeaders), ; ALINES(aHeader, m.tcHeaders,1,','), ; loRS.Fields.Count ) toRange.Offset(0,m.ix-1).Value = ; Iif( !Empty(m.tcHeaders), ; aHeader[m.ix], ; Proper(loRS.Fields(m.ix-1).Name) ) toRange.Offset(0,m.ix-1).Font.Bold = .T. Endfor #Define xlJustify -4130 #Define xlTop -4160 * This part is cosmetic toRange.WorkSheet.Activate With toRange.WorkSheet.UsedRange .VerticalAlignment = xlTop && set all to top For ix=1 To m.nMemoCount With .Columns(aMemo[m.ix]) .ColumnWidth = m.tnPrefferredWidthForMemo && 80 chars width .WrapText = .T. Endwith Endfor .Columns.AutoFit .Rows.AutoFit EndwithSample call:
select First_name, last_name,notes from employee into cursor myCursor nofilter Local oExcel oExcel = Createobject("Excel.Application") With oExcel .Workbooks.Add .Visible = .T. VFPToExcel('myCursor', ; .ActiveWorkBook.ActiveSheet.Range("A1") ) && To sheet1, start at A1 EndwithCetin