FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour APORTE - Refundici贸n de libros excel: clase TExcelPaste
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
APORTE - Refundici贸n de libros excel: clase TExcelPaste
Posted: Wed Apr 06, 2016 10:17 AM
Hola,

Os presento una clase que refunde libros excel en un solo libro excel.
Caracter铆sticas:
- Infinitos libros a refundir
- Posibilidad de renombrar nombres hojas origen

Espero que os sirva.

Code (fw): Select all Collapse
////////////
// ExcelPaste.Prg 聽 - Copia hojas y pega sobre un libro.
//
//
//
// Clases para Copiar de una o varias hojas excel a otra hoja excel
// destino
////////////////////////////////////////////////////////////////////////

#Include "FiveWin.Ch"
#Include "\prg\genlib\debug.ch"
#Include "\prg\genlib\xtry.ch"



STATIC aExcelAbierto:= {}
//-------------------------------------------------------------------------//
FUNCTION SampleExcelPaste()

Sample2()

RETURN NIL

//-------------------------------------------------------------------------//
STATIC FUNCTION Sample2()
Local oPaste, oOri
Local cPath:= "C:\plantillas\datos"

oPaste:= TExcelPaste():New()
oPaste:lVisible 聽 聽:= .f.
oPaste:cFileDestino:= PathCompleto("Destino-bis.xlsx")



// Nota: El orden final de aparicion de las hojas sera el mismo
// que se establezca aqui.

// PRIMER WORKBOOK ORIGEN
oOri:= TExcelPasteOrigen():New()
oOri:cFileOrigen := cPath+ "\Detalle factura de pruebas.xls"

oOri:cHojaOrigen := "Hoja1"
oOri:cHojaDestino:= "1Hoja1" 聽 聽 聽 聽// Hoja destino
oOri:Add()
oPaste:Add(oOri)


oOri:= TExcelPasteOrigen():New()
oOri:cFileOrigen := cPath+ "\Tarifa Referencias.xlsx" 聽 聽 聽 聽 聽// Solo hoja origen. La hoja destino tendra el mismo nombre
oOri:cHojaOrigen := "Hoja1"
oOri:cHojaDestino:= "2Hoja1" 聽 聽 聽 聽// Hoja destino
oOri:Add()
oPaste:Add(oOri)

oOri:= TExcelPasteOrigen():New()
oOri:cFileOrigen := cPath+ "\Lista de los Productos.xlsx" 聽 聽 聽 聽 聽// Solo hoja origen. La hoja destino tendra el mismo nombre
oOri:cHojaOrigen := "Hoja1"
oOri:cHojaDestino:= "3Hoja1" 聽 聽 聽 聽// Hoja destino
oOri:Add()
oPaste:Add(oOri)


oPaste:Activate()


RETURN NIL


//-------------------------------------------------------------------------//
STATIC FUNCTION Sample1()
Local oPaste, oOri

oPaste:= TExcelPaste():New()
oPaste:lVisible 聽 聽:= .f.
oPaste:cFileDestino:= PathCompleto("Destino.xlsx")



// Nota: El orden final de aparicion de las hojas sera el mismo
// que se establezca aqui.

// PRIMER WORKBOOK ORIGEN
oOri:= TExcelPasteOrigen():New()
oOri:cFileOrigen := "Origen1.xlsx"


oOri:cHojaOrigen := "HojaOrigen1" 聽 聽 聽 聽 // Hoja origen
oOri:cHojaDestino:= "HojaDestino1" 聽 聽 聽 聽// Hoja destino
oOri:Add()


oOri:cHojaOrigen:= "HojaOrigen2" 聽 聽 聽 聽 聽// Solo hoja origen. La hoja destino tendra el mismo nombre
oOri:Add()



oPaste:Add(oOri)



// SEGUNDO WORKBOOK ORIGEN
// Todas las hojas
oOri:= TExcelPasteOrigen():New()
oOri:cFileOrigen := "Origen2.xlsx"

oPaste:Add(oOri)



oPaste:Activate()


RETURN NIL




//--------------------------------------------------------------------------//
CLASS TExcelPaste


聽 聽METHOD New()

聽 聽METHOD Activate()


聽 聽METHOD Add(oOri)


聽 聽DATA aOrigen HIDDEN


聽 聽DATA cFileDestino

聽 聽DATA lVisible

聽 聽DATA oExcel, oBook 聽 聽 HIDDEN 聽 // Destino
聽 聽DATA lSaveAs 聽 聽 聽 聽 聽 HIDDEN

聽 聽METHOD lCrealoAbrelo() HIDDEN
聽 聽METHOD Save() 聽 聽 聽 聽 聽HIDDEN
聽 聽METHOD End() 聽 聽 聽 聽 聽 HIDDEN
聽 聽METHOD PasteCuore() 聽 聽HIDDEN
聽 聽METHOD CopyUno 聽 聽 聽 聽 HIDDEN

聽 聽// lNuevo indica si es nuevo: si existe, lo sobreescribe. Lo contrario
聽 聽// de lNuevo sera a陇adir a las hojas existentes
聽 聽DATA lNuevo INIT .T. 聽 聽 聽 聽 

ENDCLASS


//-------------------------------------------------------------------------//
METHOD New() 聽 聽 聽 聽 聽 聽 聽 聽 CLASS TExcelPaste

::aOrigen:= {}
RETURN Self

//-------------------------------------------------------------------------//
METHOD Activate() 聽 聽 聽 聽 聽 聽CLASS TExcelPaste
Local nI, nCountBorrar:= 0, oHoja
Local lAnterior, nVueltas:= 0, nUltima
Local nCount, oPage
::cFileDestino:= FileCarValidos(::cFileDestino)
IF !::lCrealoAbrelo()
聽 聽RETURN NIL
ENDIF
*
IF ::lNuevo
聽 聽// Renombro hojas existentes, que borrare al final, para que no
聽 聽// choquen con otras que se copien.
聽 聽#Define INI_BORRAR 聽 聽 "NOVALID_"
聽 聽#Define NAME_BORRAR(n) INI_BORRAR+ StrZero(n, 3)


聽 聽nCountBorrar:= ::oBook:WorkSheets:Count


聽 聽FOR nI:= 1 TO nCountBorrar
聽 聽 聽 oHoja:= ::oBook:WorkSheets(nI)


聽 聽 聽 // Como todas no se pueden borrar, dejo la ultima, pero
聽 聽 聽 // renombrada
聽 聽 聽 oHoja:Set("Name", NAME_BORRAR(nI)) // Para que no interfiera con hojas que se copiaran

聽 聽NEXT
聽 聽oHoja:= NIL
ENDIF
*

*
::PasteCuore()
*
IF nCountBorrar > 0
聽 聽// Borra las hojas existentes... al menos las Hoja1, Hoja2, Hoja3
聽 聽// que siempre estan aunque recien creado.
聽 聽// Se borra al final porque no se pueden borrar todas, asi que las borro
聽 聽// al final.


聽 聽lAnterior:= ::oExcel:DisplayAlerts
聽 聽::oExcel:DisplayAlerts:= .f. 聽 聽 聽 聽 聽 // IMPORTANTISIMO !!


聽 聽// Borrado por nombre porque la segunda vez, entrando y saliendo
聽 聽// del programa.
聽 聽DO WHILE .T.
聽 聽 聽 oHoja:= RetHoja(::oExcel, ::oBook, NIL, INI_BORRAR)
聽 聽 聽 IF oHoja == NIL
聽 聽 聽 聽 聽EXIT
聽 聽 聽 ENDIF
聽 聽 聽 oHoja:Delete()
聽 聽 聽 *
聽 聽 聽 *
聽 聽 聽 // Control de cuelgue
聽 聽 聽 nVueltas++
聽 聽 聽 IF nVueltas > 50
聽 聽 聽 聽 聽MERROR_("No se puede borrar hoja !!", oHoja, oHoja:Name)
聽 聽 聽 聽 聽EXIT
聽 聽 聽 ENDIF
聽 聽 聽 *
聽 聽ENDDO


聽 聽::oExcel:DisplayAlerts:= lAnterior


聽 聽oHoja:= NIL
ENDIF
*
// Pone tipo de papel. Por defecto: estrecho.
nCount:= ::oBook:WorkSheets:Count
FOR nI:= 1 TO nCount
聽 聽oHoja:= ::oBook:WorkSheets(nI)
聽 聽oPage:= oHoja:PageSetup


聽 聽// Configuracion de margenes igual que ESTRECHO
聽 聽oPage:LeftMargin 聽:= 0.64
聽 聽oPage:RightMargin := 0.64
聽 聽oPage:TopMargin 聽 := 1.91
聽 聽oPage:BottomMargin:= 1.91
聽 聽oPage:HeaderMargin:= 0.76
聽 聽oPage:FooterMargin:= 0.76


NEXT
*
::Save()
*

*
::End()
*
oHoja:= NIL
oPage:= NIL
*
RETURN NIL

//-------------------------------------------------------------------------//
METHOD End() 聽 聽 聽 聽 聽 聽 聽 聽 CLASS TExcelPaste

聽 聽::oBook:Close()
聽 聽::oBook:= NIL

聽 聽::oExcel:Quit()
聽 聽::oExcel:= NIL

RETURN NIL

//-------------------------------------------------------------------------//
METHOD PasteCuore() 聽 聽 聽 聽 聽CLASS TExcelPaste
Local nI
Local oOri
Local oExcelOrigen, oBookOrigen
Local cHojaOrigen, cHojaDestino
Local nHojas, nHoja, oHojaTmp
Local oTry
Local cFileOrigen


*

oExcelOrigen:= CreateObjectExcel()
IF oExcelOrigen == NIL
聽 聽RETURN NIL
ENDIF



FOR nI:= Len(::aOrigen) TO 1 STEP -1 聽 // Al reves para que el orden quede correcto

聽 聽oOri:= ::aOrigen[nI]
聽 聽*

聽 聽IF !File(oOri:cFileOrigen)
聽 聽 聽 MERROR_("No existe file excel origen !!", oOri:cFileOrigen)
聽 聽 聽 RETURN NIL
聽 聽ENDIF
聽 聽*
聽 聽cFileOrigen:= PathCompleto(oOri:cFileOrigen)
聽 聽*
聽 聽xTRY INI TO oTry
聽 聽 聽 oBookOrigen:= oExcelOrigen:WorkBooks:Open(cFileOrigen)
聽 聽xTRY END
聽 聽IF oTry:lError
聽 聽 聽 oTry:MsgError(oExcelOrigen, nI, oOri, oOri:cFileOrigen, cFileOrigen)
聽 聽ENDIF
聽 聽*
聽 聽*
聽 聽IF !Empty(oOri:aOrigen)
聽 聽 聽 // Se copia UNA o VARIAS hojas de este libro excel origen

聽 聽 聽 #Define POS_HOJA_ORIGEN 聽1
聽 聽 聽 #Define POS_HOJA_DESTINO 2
聽 聽 聽 FOR nHoja:= Len(oOri:aOrigen) TO 1 STEP -1 // Al reves para que el orden quede correcto

聽 聽 聽 聽 聽oBookOrigen:Activate() 聽// importantisimo


聽 聽 聽 聽 聽cHojaOrigen := oOri:aOrigen[nHoja, POS_HOJA_ORIGEN]
聽 聽 聽 聽 聽cHojaDestino:= oOri:aOrigen[nHoja, POS_HOJA_DESTINO]

聽 聽 聽 聽 聽IF Empty(cHojaDestino)
聽 聽 聽 聽 聽 聽 cHojaDestino:= cHojaOrigen
聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽cHojaDestino:= FileCarValidos(cHojaDestino)

聽 聽 聽 聽 聽::CopyUno(cFileOrigen, oExcelOrigen, oBookOrigen, cHojaOrigen, cHojaDestino)

聽 聽 聽 NEXT
聽 聽ELSE
聽 聽 聽 // Se copia TODAS las hojas de este libro excel origen
聽 聽 聽 nHojas:= oBookOrigen:WorkSheets:Count
聽 聽 聽 FOR nHoja:= nHojas TO 1 STEP -1 聽 聽 聽 聽 聽 聽// Al reves para que el orden quede correcto

聽 聽 聽 聽 聽oBookOrigen:Activate() 聽// importantisimo
聽 聽 聽 聽 聽oHojaTmp:= oBookOrigen:WorkSheets( nHoja)
聽 聽 聽 聽 聽*
聽 聽 聽 聽 聽cHojaOrigen := oHojaTmp:Name
聽 聽 聽 聽 聽cHojaDestino:= cHojaOrigen
聽 聽 聽 聽 聽::CopyUno(cFileOrigen, oExcelOrigen, oBookOrigen, cHojaOrigen, cHojaDestino)

聽 聽 聽 聽 聽 oHojaTmp:= NIL
聽 聽 聽 NEXT
聽 聽ENDIF
聽 聽*
聽 聽*
聽 聽*
聽 聽oBookOrigen:Close()
聽 聽oBookOrigen:= NIL
聽 聽*

NEXT
*
*
oExcelOrigen:Quit()
oExcelOrigen:= NIL


RETURN NIL
*
//-------------------------------------------------------------------------//
METHOD CopyUno(cFileOrigen, oExcelOrigen, oBookOrigen, cHojaOrigen, cHojaDestino) CLASS TExcelPaste
Local oHojaOrigen, oHojaDestino, oSelect
Local oTry
Local oExcelDestino:= ::oExcel
Local oRango
Local nI
Local nCols, oCellOri, oCellDes
Local nRows, oRowOri, oRowDes
Local nPics, oPicOri, oPicDes
Local nShapes, oShapeOri, oShapeDes
Local nFilIni, nFilFin, cRango
Local nUltimo
Local oTry2
*
*
oHojaOrigen:= RetHoja(oExcelOrigen, oBookOrigen, cHojaOrigen)

IF oHojaOrigen == NIL
聽 聽MERROR_("Hoja no encontrada !!", cFileOrigen, oExcelOrigen, cHojaOrigen)
聽 聽RETURN NIL
ENDIF
*
*
oHojaDestino:= ::oBook:WorkSheets:Add()
oHojaDestino:Activate()

*
xTRY INI TO oTry
聽 聽oHojaDestino:Set("NAME", cHojaDestino)
聽 聽*

聽 聽oRango:= oHojaOrigen:Cells()
聽 聽oRango:Copy()


聽 聽::oBook:ActiveSheet:Paste()



聽 聽nCols:= oHojaOrigen:UsedRange:Columns:Count()

聽 聽FOR nI:= 1 TO nCols
聽 聽 聽 oCellOri:= oHojaOrigen:Cells(nI)

聽 聽 聽 oCellDes:= oHojaDestino:Cells(nI)
聽 聽 聽 oCellDes:ColumnWidth:= oCellOri:ColumnWidth
聽 聽NEXT


聽 聽// Tambien el height de las rows... porque no
聽 聽// sale perfecto con lo anterior. Esta operacion puede ser lenta.
聽 聽nRows:= oHojaOrigen:UsedRange:Rows:Count()

聽 聽FOR nI:= 1 TO nRows
聽 聽 聽 oRowOri:= oHojaOrigen:Rows(nI)

聽 聽 聽 oRowDes:= oHojaDestino:Rows(nI)
聽 聽 聽 oRowDes:RowHeight:= oRowOri:RowHeight
聽 聽NEXT



聽 聽#Define msoPicture 聽 13
聽 聽nShapes:= oHojaOrigen:Shapes:Count()
聽 聽FOR nI:= 1 TO nShapes

聽 聽 聽 oShapeOri:= oHojaOrigen:Shapes:Item(nI)


聽 聽 聽 oShapeOri:Copy()

聽 聽 聽 oHojaDestino:Paste()
聽 聽 聽 nUltimo:= oHojaOrigen:Shapes:Count()
聽 聽 聽 xTRY INI TO oTry2
聽 聽 聽 聽 聽oShapeDes:= oHojaDestino:Shapes:Item(nUltimo)
聽 聽 聽 xTRY END
聽 聽 聽 IF oTry2:lError
聽 聽 聽 聽 聽*
聽 聽 聽 聽 聽oTry2:SaveError(nI, nShapes, nUltimo, oShapeDes) 聽// Solo graba error... puede ser un error sin importancia
聽 聽 聽 聽 聽*
聽 聽 聽 聽 聽LOOP
聽 聽 聽 ENDIF

聽 聽 聽 oShapeDes:IncrementTop := - (oShapeDes:Top - oShapeOri:Top )
聽 聽 聽 oShapeDes:IncrementLeft:= - (oShapeDes:Left- oShapeOri:Left)

聽 聽NEXT




聽 聽
xTRY END

oHojaDestino:Cells(1,1):Select() 聽// Para que apague el seleccionado

IF oTry:lError
聽 聽oTry:MsgError(oExcelOrigen, cHojaOrigen, cHojaDestino,;
聽 聽 聽 聽 聽 聽 聽 聽 聽oHojaOrigen, oHojaDestino, nUltimo)
ENDIF
*
oHojaorigen := NIL
oHojaDestino:= NIL
oSelect 聽 聽 := NIL
oRango 聽 聽 聽:= NIL
oCellOri 聽 聽:= NIL
oCellDes 聽 聽:= NIL
oRowOri 聽 聽 := NIL
oRowDes 聽 聽 := NIL
oPicOri 聽 聽 := NIL
oPicDes 聽 聽 := NIL
oShapeOri 聽 := NIL
oShapeDes 聽 := NIL
*
RETURN NIL
*
//-------------------------------------------------------------------------//
METHOD Add(oOri) 聽 聽 聽 聽 聽 聽 CLASS TExcelPaste
Aadd(::aOrigen, oOri)
RETURN NIL
*
//-------------------------------------------------------------------------//
METHOD lCrealoAbrelo() 聽 聽 聽 CLASS TExcelPaste
Local cSaveAsFileName:= ::cFileDestino
Local oExcel, oBook, lSaveAs
Local bSaveHandler, oError

DO WHILE File(cSaveAsFileName) .AND. !lFiAccess(cSaveAsFileName)


聽 聽 聽 #Define MSG_EXCEL ;
聽 聽 聽 聽 "颅 Libro de Excel no disponible porque probablemente est聽 abierto!"+ CRLF+;
聽 聽 聽 聽 "Ci茅rrelo y reintente la operaci贸n"+ CRLF+;
聽 聽 聽 聽 "篓 Reintentar ?"
聽 聽 聽 IF !mMsgYesNo( MSG_EXCEL, FileNoPath(cSaveAsFileName))
聽 聽 聽 聽 RETURN .f.
聽 聽 聽 ENDIF

ENDDO

oExcel:= CreateObjectExcel()
IF oExcel == NIL
聽 聽RETURN .F.
ENDIF



IF !File(cSaveAsFileName)
聽 聽lSaveAs:= .t.
聽 聽*
聽 聽*
聽 聽*
聽 聽*
聽 聽*
聽 聽*
聽 聽bSaveHandler := errorblock( { |x| break(x) } )

聽 聽BEGIN SEQUENCE
聽 聽 聽 oBook:= oExcel:WorkBooks:Add()

聽 聽RECOVER USING oError
聽 聽 聽 MERROR_( "颅 Se produjo un error !",;
聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽cSaveAsFileName,;
聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽File(cSaveAsFileName),;
聽 聽 聽 聽 聽 聽 聽 聽IsDirectory(PathFile(cSaveAsFileName)),;
聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽oBook,;
聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽oError,;
聽 聽 聽 聽 聽 聽 聽 聽oError:SubSystem(),;
聽 聽 聽 聽 聽 聽 聽 聽oError:Description,;
聽 聽 聽 聽 聽 聽 聽 聽oError:Operation,;
聽 聽 聽 聽 聽 聽 聽 聽oError:SubCode,;
聽 聽 聽 聽 聽 聽 聽 聽oError:FileName,;
聽 聽 聽 聽 聽 聽 聽 聽DosError(),;
聽 聽 聽 聽 聽 聽 聽 聽FError(),;
聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽Ole2TxtError(),;
聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽GetEnv("TMP"),;
聽 聽 聽 聽 聽 聽 聽 聽GetEnv("TEMP"),;
聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽oExcel,;
聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽lFiAccess(cSaveAsFileName),;
聽 聽 聽 聽 聽 聽 聽 聽DosError(),;
聽 聽 聽 聽 聽 聽 聽 聽FError(); 聽 聽 聽 // File Error de lFiAccess()
聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 )

聽 聽END
聽 聽// Restore the default error handler
聽 聽errorblock( bSaveHandler )
聽 聽*
聽 聽*
聽 聽*
聽 聽*
聽 聽*
聽 聽*
聽 聽*
聽 聽*
ELSE
聽 聽lSaveAs:= .f.
聽 聽oBook:= oExcel:WorkBooks:Open(cSaveAsFileName)
ENDIF
*
oExcel:Visible:= ::lVisible
*
::oExcel:= oExcel
::oBook := oBook
::lSaveAs:= lSaveAs
RETURN .T.

//-------------------------------------------------------------------------//
METHOD Save() 聽 聽 聽 聽 聽 聽 聽 聽CLASS TExcelPaste
Local cSaveAsFileName:= ::cFileDestino
Local oBook:= ::oBook
Local bSaveHandler, oError
Local lSaveAs:= ::lSaveAs
Local oExcel:= 聽::oExcel

IF !lSaveAs
聽 聽// Lo borro antes de grabarlo para que no pregunte
聽 聽// si lo deseo sobreescribir
聽 聽 聽*
聽 聽 聽*
聽 聽 聽*
聽 聽 聽*
聽 聽 聽*
聽 聽 聽*
聽 聽 聽*
聽 聽 聽bSaveHandler := errorblock( { |x| break(x) } )

聽 聽 聽BEGIN SEQUENCE
聽 聽 聽 聽 oBook:Save()

聽 聽 聽RECOVER USING oError
聽 聽 聽 聽 MERROR_( "颅 Se produjo un error !",;
聽 聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽cSaveAsFileName,;
聽 聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽File(cSaveAsFileName),;
聽 聽 聽 聽 聽 聽 聽 聽 聽IsDirectory(PathFile(cSaveAsFileName)),;
聽 聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽oBook,;
聽 聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽oError,;
聽 聽 聽 聽 聽 聽 聽 聽 聽oError:SubSystem(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽oError:Description,;
聽 聽 聽 聽 聽 聽 聽 聽 聽oError:Operation,;
聽 聽 聽 聽 聽 聽 聽 聽 聽oError:SubCode,;
聽 聽 聽 聽 聽 聽 聽 聽 聽oError:FileName,;
聽 聽 聽 聽 聽 聽 聽 聽 聽DosError(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽FError(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽Ole2TxtError(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽GetEnv("TMP"),;
聽 聽 聽 聽 聽 聽 聽 聽 聽GetEnv("TEMP"),;
聽 聽 聽 聽 聽 聽 聽 聽 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽oExcel,;
聽 聽 聽 聽 聽 聽 ;
聽 聽 聽 聽 聽 聽 lFiAccess(cSaveAsFileName),;
聽 聽 聽 聽 聽 聽 DosError(),;
聽 聽 聽 聽 聽 聽 FError(); 聽 聽 聽 // File Error de lFiAccess()
聽 聽 聽 聽 聽 聽 ;
聽 聽 聽 聽 聽 聽 聽 聽 聽)

聽 聽 聽END
聽 聽 聽// Restore the default error handler
聽 聽 聽errorblock( bSaveHandler )
聽 聽 聽*

ELSE
聽 聽TRY
聽 聽 聽 oBook:SaveAs(cSaveAsFileName) // Esto muy lento sobre todo cuando se generan varias hojas de calculo !!!!
聽 聽CATCH oError

聽 聽 聽 聽MERROR_( "颅 Se produjo un error !",;
聽 聽 聽 聽 聽 聽 聽 聽 ;
聽 聽 聽 聽 聽 聽 聽 聽 cSaveAsFileName,;
聽 聽 聽 聽 聽 聽 聽 聽 ;
聽 聽 聽 聽 聽 聽 聽 聽 ;
聽 聽 聽 聽 聽 聽 聽 聽 File(cSaveAsFileName),;
聽 聽 聽 聽 聽 聽 聽 聽 IsDirectory(PathFile(cSaveAsFileName)),;
聽 聽 聽 聽 聽 聽 聽 聽 ;
聽 聽 聽 聽 聽 聽 聽 聽 ;
聽 聽 聽 聽 聽 聽 聽 聽 ;
聽 聽 聽 聽 聽 聽 聽 聽 ;
聽 聽 聽 聽 聽 聽 聽 聽 oBook,;
聽 聽 聽 聽 聽 聽 聽 聽 ;
聽 聽 聽 聽 聽 聽 聽 聽 oError,;
聽 聽 聽 聽 聽 聽 聽 聽 oError:SubSystem(),;
聽 聽 聽 聽 聽 聽 聽 聽 oError:Description,;
聽 聽 聽 聽 聽 聽 聽 聽 oError:Operation,;
聽 聽 聽 聽 聽 聽 聽 聽 oError:SubCode,;
聽 聽 聽 聽 聽 聽 聽 聽 oError:FileName,;
聽 聽 聽 聽 聽 聽 聽 聽 DosError(),;
聽 聽 聽 聽 聽 聽 聽 聽 FError(),;
聽 聽 聽 聽 聽 聽 聽 聽 ;
聽 聽 聽 聽 聽 聽 聽 聽 Ole2TxtError(),;
聽 聽 聽 聽 聽 聽 聽 聽 ;
聽 聽 聽 聽 聽 聽 聽 聽 ;
聽 聽 聽 聽 聽 聽 聽 聽 GetEnv("TMP"),;
聽 聽 聽 聽 聽 聽 聽 聽 GetEnv("TEMP"),;
聽 聽 聽 聽 聽 聽 聽 聽 ;
聽 聽 聽 聽 聽 聽 聽 聽 oExcel,;
聽 聽 聽 聽 聽 聽 ;
聽 聽 聽 聽 聽 聽 lFiAccess(cSaveAsFileName),;
聽 聽 聽 聽 聽 聽 DosError(),;
聽 聽 聽 聽 聽 聽 FError(); 聽 聽 聽 // File Error de lFiAccess()
聽 聽 聽 聽 聽 聽 ;
聽 聽 聽 聽 聽 聽 聽 聽)


聽 聽END

ENDIF


RETURN NIL
*
//-------------------------------------------------------------------------//
// Agrupa Hojas de un mismo libro (cFileOrigen)
CLASS TExcelPasteOrigen

聽 聽METHOD New()
聽 聽METHOD Activate()
聽 聽METHOD Add()

聽 聽DATA cFileOrigen

聽 聽// MUCHO OJO !!! SOLO para parametros para :Add()
聽 聽DATA cHojaOrigen
聽 聽DATA cHojaDestino



聽 聽DATA aOrigen HIDDEN

ENDCLASS

//--------------------------------------------------------------------------//
METHOD New() 聽 聽 聽 聽 聽 聽 聽 聽 CLASS TExcelPasteOrigen

::aOrigen:= {}
RETURN Self

//--------------------------------------------------------------------------//
METHOD Activate() 聽 聽 聽 聽 聽 聽CLASS TExcelPasteOrigen

RETURN NIL

//--------------------------------------------------------------------------//
METHOD Add() 聽 聽 聽 聽 聽 聽 聽 聽 CLASS TExcelPasteOrigen
Local aOri

// Control de errores mios para que solo se a帽ada TODAS o una hoja
// en concreto UNA SOLA VEZ
IF AScanea(::aOrigen, {|x| x[1] == ::cHojaOrigen} ) > 0
聽 聽MERROR_("Este libro u hoja (NIL/hoja) ya ha sido a帽adido !!",;
聽 聽 聽 聽 聽 聽::cHojaOrigen, ::aOrigen, aDebug(::aOrigen) )
聽 聽RETURN NIL
ENDIF

aOri:= {::cHojaOrigen, ::cHojaDestino}
Aadd(::aOrigen, aOri)

::cHojaOrigen := NIL
::cHojaDestino:= NIL

RETURN NIL

//-------------------------------------------------------------------------//
陇STATIC FUNCTION CreateObjectExcel()
Local oExcel
*
oExcel := TOleAuto():New( "Excel.Application" )

If Ole2TxtError() != "S_OK"
聽 聽MsgStop( "Error al intentar acceder a Excel","Error de conexi贸n")
聽 聽oExcel:Quit()
聽 聽oExcel:= NIL
Endif
*
Aadd(aExcelAbierto, oExcel)
RETURN oExcel
*
//--------------------------------------------------------------------------//
STATIC FUNCTION RetHoja(oExcel, oBookOrigen, cNombreHoja, cIniNombreHoja)
Local nHojas, nI, oHojatmp, oHojaRet:= NIL
nHojas:= oBookOrigen:WorkSheets:Count // cuantas hojas tiene el libro de excel

FOR nI:= 1 TO nHojas //- 1

聽 聽oHojaTmp:= oBookOrigen:WorkSheets( nI )
聽 聽IF If(cNombreHoja != NIL, oHojaTmp:Name == cNombreHoja,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽cLeft(oHojaTmp:Name, cIniNombreHoja) )
聽 聽 聽 oHojaRet:= oHojaTmp
聽 聽 聽 EXIT
聽 聽ENDIF
NEXT
RETURN oHojaRet
*

*
*
//-------------------------------------------------------------------------//
EXIT PROCEDURE LimpiaMemoriaExcelPas()
Local nI
FOR nI:= 1 TO Len(aExcelAbierto)
聽 聽IF aExcelAbierto[nI] != nil
聽 聽 聽 aExcelAbierto[nI]:Quit()
聽 聽ENDIF
NEXT
RETURN NIL
*

Saludos
Posts: 632
Joined: Tue Dec 12, 2006 07:34 PM
Re: APORTE - Refundici贸n de libros excel: clase TExcelPaste
Posted: Thu Apr 07, 2016 05:43 PM

Gracias Ing. buen aporte.

Saludos

Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: APORTE - Refundici贸n de libros excel: clase TExcelPaste
Posted: Thu Apr 07, 2016 09:55 PM

hmpaquito:

Aunque de momento no la voy a utilizar, indudablemente es un
excelente aporte, c贸mo siempre!.

Gracias, Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 512
Joined: Mon Oct 17, 2005 10:38 AM
Re: APORTE - Refundici贸n de libros excel: clase TExcelPaste
Posted: Sun Apr 10, 2016 07:49 PM

Very, very nice.
Compliments !!!

Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: APORTE - Refundici贸n de libros excel: clase TExcelPaste
Posted: Sun Apr 10, 2016 09:35 PM

Muy interesante

Gracias

Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noci贸n del tiempo

El secreto de la felicidad no est谩 en hacer lo que te gusta, sino en que te guste lo que haces

Continue the discussion