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.
Saludos
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.
////////////
// 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