Bueno, definitivamente no hay manera de hacer un reporte con SAY(), para luego volcarlo a Excel (a través del Preview). La unica forma que encontre es declarando una variable, desde el principio, que me indique a la REPEXCEL, que se quiere llevar la salida a Excel. Asi, que las cosas quedan como sigue:
1.- Declarar lExcel := .T.
2.- Crear el reporte como sigue:
- Code: Select all Expand view RUN
REPORT oReport ;
TITLE ..... ;
FONT ..... ;
PEN ....... ;
HEADER .....;
FOOTER .....;
DEVICE ....
COLUMN .....
COLUMN .....
COLUMN .....
[mas definiciones de columnas]
END REPORT
ACTIVATE REPORT oReport ON INIT SayRpt( oReport )
// ------------
static Function SayRpt( oReport )
wPlsSalida(.T., oReport, lExcel )
oArchivo:GOTOP()
DO WHILE oArchivo:EOF()
oReport:StartLine()
oReport:Say(1, oArchivo:Campo1)
oReport:Say(2, oArchivo:Campo2)
[Otras columnas a imprimir]
oReport:EndLine()
oArchivo:Skip()
ENDDO
wPlsSalida(.F., oReport, lExcel )
RETURN NIL
La funcion wPlsSalida es la siguiente:
- Code: Select all Expand view RUN
FUNCTION wPlsSalida(lBoxOn, oRpt, lExcel )
IF lBoxOn
DO CASE
CASE lExcel
wPlsWait(.T.,"Generando Archivo Excel.... espere ")
oRpt:lSalida := .T.
oRpt:oSalida := TSalXls():New( oRpt, AllTrim( Left( oRpt:cName, 8 ) ) + '.xls' )
oRpt:oSalida:Stabilize()
oRpt:oSalida:FormatColumns()
oRpt:oSalida:StartPage()
ENDCASE
ELSE
DO CASE
CASE lExcel
wPlsWait( .F. )
oRpt:oSalida:oXLS:SetDisplay(,,,,.F.,.F.,.T.,.T.,.F.)
oRpt:oSalida:oXLS:End()
ENDCASE
ENDIF
RETURN( NIL )
La funcion wPlsWait() es un tipo de WaitOn() WaitOff() que muestra un mensaje por pantalla.
Funciona de maravillas.... PERO: me envia la "cabecera" del reporte a la impresora (OJO: Solo la cabecera, nada mas...), y eso no lo quiero !!! Quisiera que no imprimiera nada.
No se como decirle a la clase que NO IMPRIMA, que solo se enviará a un Libro de Excel !
Pienzo que podría enviarlo a una impresora "nula", pero no se como hacerlo.....
¿Alguien le a metido mano a esto? ¿o soy el único "loco" en la comunidad?
Gracias anticipadas...