FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Leer Excel XLSX grande a un array o DBF
Posts: 582
Joined: Fri Oct 07, 2005 02:17 PM
Leer Excel XLSX grande a un array o DBF
Posted: Fri Feb 04, 2022 11:18 PM

Buenas tardes

Tengo FWH 20.04 y necesito leer un excel de 1,000,000 de lineas y casi 30 columnas que manda un cliente y solo lo puede/quiere mandar en Excel, uso la TExcel y claro funciona, pero demora casi 15 horas, algo mas rapido para poder leer registro x registro y guardarlo despues como datos, levantarlo en un array o en un DBF, alguien algun ejemplo funcional, GRACIAS

Enrrique Vertiz Pitta

Lima-Peru

xHb 1.23.1026X, Fwh 25.01, BCC74, MySQL 8.0.X, SQLLIB 1.9m
Posts: 1818
Joined: Wed Oct 26, 2005 02:49 PM
Re: Leer Excel XLSX grande a un array o DBF
Posted: Sat Feb 05, 2022 10:47 AM

Enrique buenos d铆as

Pues desde nuestra experiencia un mill贸n de registros, le cuesta mucho tiempo de proceso, a cualquier procesador (valga la redundancia), hasta un CORE I7, es mucha informaci贸n, no se si sea bueno que la separes en varios archivos antes de validarla, como experiencia nosotros importamos desde excel un archivo de 10.000 registros, pero no tardo tanto tiempo, aproximadamente seis minutos.

Saludos
LEANDRO AREVALO
Bogot谩 (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 582
Joined: Fri Oct 07, 2005 02:17 PM
Re: Leer Excel XLSX grande a un array o DBF
Posted: Sat Feb 05, 2022 03:39 PM

Gracias Leandro

Lo que pasa es que el cliente lo recibe asi de otro sistema y no quiere meter mano, quiere que se importe "tal cual" ...
Una idea es grabarlo como CSV y de ahi hacerle un APPEND FROM, por el volumen puede que tome varios minutos, por eso me gustaria ponerle un "progress bar", alguien tendra un ejemplo deAPPEND FROM con PROGRESS BAR, vi uno aqui en el foro pero no logro hacerlo funcionar :

MsgRun("Espere importando", "Importacion de Movimientos desde un archivo Excel CSV", { || muestraprogreso(nPercent1,oMtr1) })

FUNCTION muestraprogreso(nPercent1, oMtr1)
APPEND FROM &cFile WHILE (nPercent1++, oMtr1:Set(nPercent1), IIF( (nPercent1/1000 - int(nPercent1/1000)) = 0 , SysRefresh(), ), TRUE ) DELIMITED WITH ({,";"})
RETURN (.T.)

Enrrique Vertiz Pitta

Lima-Peru

xHb 1.23.1026X, Fwh 25.01, BCC74, MySQL 8.0.X, SQLLIB 1.9m
Posts: 729
Joined: Tue Oct 18, 2005 06:49 PM
Re: Leer Excel XLSX grande a un array o DBF
Posted: Sat Feb 05, 2022 04:31 PM

Podrias probar pasando primero el archivo CSV a un array ya que esto lo hace bien rapido.

include "FIVEWIN.CH"

FUNCTION Main()
LOCAL cMsgRun := "Procedure in execution; please Wait...", cMsgArrayData := "Creating CSV array data; please wait..."
LOCAL nStart := Seconds(), nEnd, aData := {}, cText := "", cMsgMemo := "Reading CSV data source; please wait..."

//===================================================================================================================
// STEP ONE: Read CSV File
//===================================================================================================================
cFileCSV = "your_file.csv"
MsgRun(cMsgMemo, "Main",  { | | cText := fCSVMemo(cFileCSV) })
Sysrefresh()

//===================================================================================================================
// STEP TWO:  Read each line and save the result in array aData
//===================================================================================================================
MsgRun(cMsgArrayData, "Main",  { | | aData := HB_ATokens( cText, Chr(1), .t., .t. ) })
syswait(.05)
Sysrefresh()

? "Total rows: ", len(aData), " ", "Delay (secs): ", (Seconds() - nStart)
Posts: 729
Joined: Tue Oct 18, 2005 06:49 PM
Re: Leer Excel XLSX grande a un array o DBF
Posted: Sat Feb 05, 2022 04:33 PM

Falt贸 es peque帽a funci贸n

FUNCTION fCSVMemo(cFileCSV)
cText := StrTran( MemoRead( cFileCSV ), CRLF, Chr(1) )
RETURN (cText)

Posts: 1818
Joined: Wed Oct 26, 2005 02:49 PM
Re: Leer Excel XLSX grande a un array o DBF
Posted: Sat Feb 05, 2022 06:01 PM
Amigo puedes hacerlo directamente desde Excel, esta funci贸n convierte el Excel a un array de tipo hash

Code (fw): Select all Collapse
Function recupera(cRtaXls)
Local hLinea := {=>}
Local aDatos := {}
Local oExcel,oBook,oHoja
Local nTotRowCount := 0
Local nTotColCount := 0
Local nContador := 1

oExcel:= TOleAuto():New("Excel.Application")
oBook := oExcel:Workbooks:Open(cRtaXls)
oHoja := oExcel:Get( "ActiveSheet" )

nTotRowCount:= oHoja:UsedRange:Rows:Count()
nTotColCount:= oHoja:UsedRange:Columns:Count()

//oMeter:nTotal = nTotRowCount
//oMeter:Set( 0 )

FOR Q=1 TO nTotRowCount

    FOR b:=1 TO nTotColCount
        cNmcol := "COL"+cvaltochar(b)   
        hLinea[cNmcol] := oHoja:Cells( Q, b ):Value
    NEXT    
    AADD(aDatos,hLinea)
    hLinea := {=>}

    nContador++ 
    //oMeter:Set( nContador )   

NEXT
oExcel:WorkBooks:Close()
oExcel:Application:Quit()
oExcel:Quit()
oExcel := NIL

xbrowse(aDatos)

Return nil
Saludos
LEANDRO AREVALO
Bogot谩 (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 582
Joined: Fri Oct 07, 2005 02:17 PM
Re: Leer Excel XLSX grande a un array o DBF
Posted: Sat Feb 05, 2022 06:11 PM

George, Leandro

Muchas gracias por sus respuestas, probare cada caso a ver cual mejor me resulta, GRACIAS !!!

Enrrique Vertiz Pitta

Lima-Peru

xHb 1.23.1026X, Fwh 25.01, BCC74, MySQL 8.0.X, SQLLIB 1.9m
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Leer Excel XLSX grande a un array o DBF
Posted: Thu Aug 10, 2023 03:35 AM
leandro wrote:Amigo puedes hacerlo directamente desde Excel, esta funci贸n convierte el Excel a un array de tipo hash
Code (fw): Select all Collapse
Function recupera(cRtaXls)
Local hLinea := {=>}
Local aDatos := {}
Local oExcel,oBook,oHoja
Local nTotRowCount := 0
Local nTotColCount := 0
Local nContador := 1

oExcel:= TOleAuto():New("Excel.Application")
oBook := oExcel:Workbooks:Open(cRtaXls)
oHoja := oExcel:Get( "ActiveSheet" )

nTotRowCount:= oHoja:UsedRange:Rows:Count()
nTotColCount:= oHoja:UsedRange:Columns:Count()

//oMeter:nTotal = nTotRowCount
//oMeter:Set( 0 )

FOR Q=1 TO nTotRowCount

聽 聽 FOR b:=1 TO nTotColCount
聽 聽 聽 聽 cNmcol := "COL"+cvaltochar(b) 聽 
聽 聽 聽 聽 hLinea[cNmcol] := oHoja:Cells( Q, b ):Value
聽 聽 NEXT聽 聽 
聽 聽 AADD(aDatos,hLinea)
聽 聽 hLinea := {=>}

聽 聽 nContador++聽
聽 聽 //oMeter:Set( nContador )聽 聽

NEXT
oExcel:WorkBooks:Close()
oExcel:Application:Quit()
oExcel:Quit()
oExcel := NIL

xbrowse(aDatos)

Return nil
This can also be written as:
Code (fw): Select all Collapse
oRange := GetExcelRange( cExelFileWithFullPath )
aData := xlRangeValue( oRange )
XBROWSER aData
Regards



G. N. Rao.

Hyderabad, India
Posts: 1772
Joined: Thu Sep 05, 2019 05:32 AM
Re: Leer Excel XLSX grande a un array o DBF
Posted: Thu Aug 10, 2023 06:17 AM
hi,

if you use FWH 64 Bit it is no Problem to use 1.000.000 Row of Excel Sheet with ADO without Array
Code (fw): Select all Collapse
FUNCTION ADOsheet( cPathcFile )
LOCAL objRS, oBrw
LOCAL cSheet, cRange, lHeaders := .T.

聽 聽objRS := FW_OpenADOExcelSheet( cPathcFile, cSheet, cRange, lHeaders )
聽
聽 聽@ nBhight, 聽2 XBROWSE oBrw SIZE nWidth - 20, nHeight - 90 PIXEL OF oWnd ;
聽 聽 聽 聽 聽 聽 聽 RECORDSET objRS FASTEDIT ;
聽 聽 聽 聽 聽 聽 聽 AUTOCOLS ;
聽 聽 聽 聽 聽 聽 聽 CELL LINES NOBORDER UPDATE ;
聽 聽 聽 聽 聽 聽 聽 FONT oFontDefault COLOR BFcolor, BGcolor
this CODE work also under 32 Bit but over 500.000 Row it might crash when MEMORY is low of 32 Bit App

---

instead of XBROWSE you can use Record-Set to create a DBF or SQL-Table
greeting,

Jimmy
Posts: 582
Joined: Fri Oct 07, 2005 02:17 PM
Re: Leer Excel XLSX grande a un array o DBF
Posted: Thu Aug 10, 2023 05:44 PM

Hi Mr. Rao

Unresolved external _HB_FUN_FW_GetExcelRange

Unresolved external _HB_FUN_xlValue

I use FWH 23.07, Thanks

Enrrique Vertiz Pitta

Lima-Peru

xHb 1.23.1026X, Fwh 25.01, BCC74, MySQL 8.0.X, SQLLIB 1.9m
Posts: 8523
Joined: Tue Dec 20, 2005 07:36 PM
Re: Leer Excel XLSX grande a un array o DBF
Posted: Thu Aug 10, 2023 06:01 PM
Jo茫o Santos - S茫o Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Leer Excel XLSX grande a un array o DBF
Posted: Thu Aug 10, 2023 08:27 PM
Enrrique Vertiz wrote:Hi Mr. Rao

Unresolved external _HB_FUN_FW_GetExcelRange
Unresolved external _HB_FUN_xlValue

I use FWH 23.07, Thanks
Very sorry, I corrected the mistakes.
Please see my edited posting again.
the functions are:
GetExcelRange .. not FW_GetExcelRange
and
xlRangeValue ... not xlValue
Code (fw): Select all Collapse
oRange := GetExcelRange( cExelFileWithFullPath )
aData := xlRangeValue( oRange )
XBROWSER aData
Regards



G. N. Rao.

Hyderabad, India
Posts: 582
Joined: Fri Oct 07, 2005 02:17 PM
Re: Leer Excel XLSX grande a un array o DBF
Posted: Fri Aug 11, 2023 05:24 PM

GRACIAS Karinha, Rao !!!

Enrrique Vertiz Pitta

Lima-Peru

xHb 1.23.1026X, Fwh 25.01, BCC74, MySQL 8.0.X, SQLLIB 1.9m

Continue the discussion