Te paso una función que hace lo que quieres.
La tabla o cursor a convertir tiene que estar seleccionada.
Le debes pasar el nombre y ruta del archivo "html" que se generará.
Puedes pasarle, opcionalmente, un segundo parámetro, con el titulo para el listado.
Function dbftohtml
Lparameters tcFilename,tcTitulo
*****************************************************
* Toma la tabla en uso en este momento y pone su
* contenido en formato html en le archivo 'tcFilename'
* Si se paso 'tcTitulo', este será el encabezado del listado
*****************************************************
#Define MAX_TABLE 40
*
cColorTitle='#000080'
cColorBody='#FFFFFF'
cColorColum='#DDDFF'
cColorTable='#FFFFEE'
*****************************************************
* Maximo de items en una pagina html
* usado para especificar cuantas lineas son por pagina
* El resultado seran n paginas de MAX_TABLE lineas
*****************************************************
cNomFont=['Times New Roman']
cLinFont=[<FONT SIZE=-1>]
*****************************************************
* cNomFont -> nombre fuente utilizada
* cLinFont -> fuente para lineas detalle
*****************************************************
* Tomar el nombre de la tabla en uso
lcTable=Alias()
If Empty(lcTable)
Messagebox([No existe ninguna tabla abierta en este momento!],64,[Message])
Return
Endif
If Vartype(tcTitulo)='L'
If tcTitulo=.F.
tcTitulo=lcTable
Endif
Else
If Empty(Alltrim(tcTitulo))
tcTitulo=lcTable
Endif
Endif
tcTitulo=Proper(tcTitulo)
* Obtiene los nombres de los campos
nbFields=Afields(laFields)
* Cuenta el numero de campos 'general'
nbGenFields=0
For i = 1 To nbFields
If laFields[i,2]='G'
nbGenFields=nbGenFields+1
Endif
Endfor
* Chequeo el nombre del archivo y la creación de este
If Empty(tcFilename)
Messagebox([No se pudo crear el archivo, el parametro 'tcfilename' esta vacio!],64,[Message])
Return
Endif
fHandle=Fcreate(tcFilename)
If fHandle < 1
Messagebox([Un error a ocurrido, no se pudo crear el archivo!],64,[Message])
Return
Endif
** Fputs the html header to the file
** you can customize this header to fit your need ********************
Fputs(fHandle,[<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN">])
Fputs(fHandle,[<HTML>])
Fputs(fHandle,[<HEAD>])
Fputs(fHandle,'')
Fputs(fHandle,[<TITLE>]+tcTitulo+[</TITLE>])
Fputs(fHandle,'')
Fputs(fHandle,[<META NAME="author" content="">])
Fputs(fHandle,[<META name="generator" content="VFP Table Export">])
Fputs(fHandle,[<META name="keywords" content="">])
Fputs(fHandle,[<META name="description" content="">])
Fputs(fHandle,'')
Fputs(fHandle,[<STYLE>])
Fputs(fHandle,[ H1.SaltoDePagina])
Fputs(fHandle,[ {PAGE-BREAK-AFTER: always}])
Fputs(fHandle,[</STYLE>])
Fputs(fHandle,[</HEAD>])
Fputs(fHandle,'')
Fputs(fHandle,[<BODY BGCOLOR=]+cColorBody+[>])
Fputs(fHandle,[<BASEFONT COLOR=BLACK FACE=]+cNomFont+[ SIZE=1>])
Fputs(fHandle,'')
Fputs(fHandle,'')
***********************************************************************
*** construir la hoja
Select &lcTable
Locate
iii=0
Scan
iii=iii+1
If iii%MAX_TABLE=1
*** Cuando el contador de lineas llega igual a MAX_TABLE
*** se cierra la pagina actual y crea una nueva
If iii > 1
Fputs(fHandle,[</TABLE>])
Fputs(fHandle,'')
Fputs(fHandle,'')
Fputs(fHandle,'')
Fputs(fHandle,[<H1 class=SaltoDePagina> </H1>])
*
Fputs(fHandle,[<FONT SIZE=+4 COLOR=]+cColorTitle+[ ><i>]+tcTitulo+[</i></FONT>])
Fputs(fHandle,[<TABLE BORDER='1' WIDTH=100% CELLPADDING='2' CELLSPACING='0' BGCOLOR="#FFFFFF">])
Else
** Primera hoja
Fputs(fHandle,[<FONT SIZE=+4 COLOR=]+cColorTitle+[ ><i>]+tcTitulo+[</i></FONT>])
Fputs(fHandle,[<TABLE BORDER='1' WIDTH=100% CELLPADDING='2' CELLSPACING='0' BGCOLOR="#FFFFFF">])
Endif
*
Fputs(fHandle,[ <TR>])
For ii = 1 To nbFields
Do Case
Case laFields[ii,2]='G'
**Forget it!
Otherwise
**Any type...
Fputs(fHandle,[ <TD BGCOLOR=]+cColorColum+[ ><center><B> ]+laFields[ii,1]+[</B></center></TD>])
Endcase
Endfor
** cierra la linea
Fputs(fHandle,[ </TR>])
Endif
** inicia la linea
Fputs(fHandle,[ <TR>])
** busca a traves de los archivos ...
For i = 1 To nbFields
Do Case
Case Isnull(&laFields[i,1])
**Trap the .NULL.
Fputs(fHandle,[ <TD BGCOLOR=]+cColorTable+[ >]+cLinFont+[.NULL.</FONT></TD>])
Case laFields[i,2]='G'
**forget it!
Case laFields[i,2]='L'
**transform logical field to text
If &laFields[i,1]
Fputs(fHandle,[ <TD BGCOLOR=]+cColorTable+[ >]+cLinFont+[True</FONT></TD>])
Else
Fputs(fHandle,[ <TD BGCOLOR=]+cColorTable+[ >]+cLinFont+[False</FONT></TD>])
Endif
Case laFields[i,2]='N'
lclong=laFields[i,3]
lcdeci=laFields[i,4]
If Len(laFields[i,1])>lclong
lclong=Len(laFields[i,1])
Endif
lclong2=Alltrim(Str(lclong*(Fontmetric(6,cNomFont,10,'B')+1)))
lctext=Rtrim(Padl(&laFields[i,1],lclong))
*
Fputs(fHandle,[ <TD BGCOLOR=]+cColorTable+[ WIDTH=]+lclong2+[ ALIGN=RIGHT>]+cLinFont+lctext+[</FONT></TD>])
Otherwise
** PADR() is in charge to transform anything to char!
lctext=Alltrim(Padr(&laFields[i,1],2400))
** convert the string...
lctext=ConvertToHTML(lctext)
** Add the non breaking space to be sure that the column
** display was large enough to show correctly and
** avoid
** this
** kind of
** display
** in the
** columns
If Len(lctext)=0
lctext=Space(24)
Endif
If Len(lctext)<25
lctext=Strtran(lctext,' ',' ')
Else
lctext=Strtran(Substr(lctext,1,24),' ',' ')+Substr(lctext,25)
Endif
** put to file
Fputs(fHandle,[ <TD BGCOLOR=]+cColorTable+[ >]+cLinFont+lctext+[</FONT></TD>])
Endcase
Endfor
**close the row
Fputs(fHandle,[ </TR>])
Endscan
**close the last table
Fputs(fHandle,[</TABLE>])
** FPuts the 'footer' of the html file *******************
Fputs(fHandle,[</BODY>])
Fputs(fHandle,[</HTML>])
**
** Close the file
Fclose(fHandle)
Return
*********
* Convert some special char to HTML
**************
Function ConvertToHTML
Lparameters tcString
tcString=Strtran(tcString,'&','&')
tcString=Strtran(tcString,'à','à')
tcString=Strtran(tcString,'â','â')
tcString=Strtran(tcString,'ç','ç')
tcString=Strtran(tcString,'é','é')
tcString=Strtran(tcString,'è','è')
tcString=Strtran(tcString,'ë','ë')
tcString=Strtran(tcString,'ê','ê')
tcString=Strtran(tcString,'ï','ï')
tcString=Strtran(tcString,'ö','ö')
tcString=Strtran(tcString,'ô','ô')
tcString=Strtran(tcString,'ù','ù')
tcString=Strtran(tcString,'û','û')
tcString=Strtran(tcString,'À','À')
tcString=Strtran(tcString,'Â','Â')
tcString=Strtran(tcString,'Ç','Ç')
tcString=Strtran(tcString,'É','É')
tcString=Strtran(tcString,'È','È')
tcString=Strtran(tcString,'Ë','Ë')
tcString=Strtran(tcString,'Ê','Ê')
tcString=Strtran(tcString,'Ï','Ï')
tcString=Strtran(tcString,'Ö','Ö')
tcString=Strtran(tcString,'Ô','Ô')
tcString=Strtran(tcString,'Ù','Ù')
tcString=Strtran(tcString,'Û','Û')
tcString=Strtran(tcString,'<','<')
tcString=Strtran(tcString,'>','>')
tcString=Strtran(tcString,'"','"')
tcString=Strtran(tcString,'®','®') &&Registered TradeMark
tcString=Strtran(tcString,'©','©') &&Copyright
tcString=Strtran(tcString,Chr(13)+Chr(10),'<P>')
tcString=Strtran(tcString,Chr(10),'<BR>')
Return tcString
************************************************************
Un saludo.
--
Jose A. Blasco
Zaragoza - España