Leer Excel XLSX grande a un array o DBF

Leer Excel XLSX grande a un array o DBF

Postby Enrrique Vertiz » 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 24.09, BCC74, MySQL 8.0.X, SQLLIB 1.9m
Enrrique Vertiz
 
Posts: 541
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru

Re: Leer Excel XLSX grande a un array o DBF

Postby leandro » 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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Leer Excel XLSX grande a un array o DBF

Postby Enrrique Vertiz » Sat Feb 05, 2022 3: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 24.09, BCC74, MySQL 8.0.X, SQLLIB 1.9m
Enrrique Vertiz
 
Posts: 541
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru

Re: Leer Excel XLSX grande a un array o DBF

Postby George » Sat Feb 05, 2022 4: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)
George
 
Posts: 725
Joined: Tue Oct 18, 2005 6:49 pm

Re: Leer Excel XLSX grande a un array o DBF

Postby George » Sat Feb 05, 2022 4:33 pm

Faltó es pequeña función

FUNCTION fCSVMemo(cFileCSV)
cText := StrTran( MemoRead( cFileCSV ), CRLF, Chr(1) )
RETURN (cText)
George
 
Posts: 725
Joined: Tue Oct 18, 2005 6:49 pm

Re: Leer Excel XLSX grande a un array o DBF

Postby leandro » Sat Feb 05, 2022 6:01 pm

Amigo puedes hacerlo directamente desde Excel, esta función convierte el Excel a un array de tipo hash

Code: Select all  Expand view


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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Leer Excel XLSX grande a un array o DBF

Postby Enrrique Vertiz » Sat Feb 05, 2022 6: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 24.09, BCC74, MySQL 8.0.X, SQLLIB 1.9m
Enrrique Vertiz
 
Posts: 541
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru

Re: Leer Excel XLSX grande a un array o DBF

Postby nageswaragunupudi » Thu Aug 10, 2023 3:35 am

leandro wrote:Amigo puedes hacerlo directamente desde Excel, esta función convierte el Excel a un array de tipo hash

Code: Select all  Expand view


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: Select all  Expand view
oRange := GetExcelRange( cExelFileWithFullPath )
aData := xlRangeValue( oRange )
XBROWSER aData
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10634
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: Leer Excel XLSX grande a un array o DBF

Postby Jimmy » Thu Aug 10, 2023 6: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: Select all  Expand view
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
User avatar
Jimmy
 
Posts: 1732
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany

Re: Leer Excel XLSX grande a un array o DBF

Postby Enrrique Vertiz » Thu Aug 10, 2023 5: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 24.09, BCC74, MySQL 8.0.X, SQLLIB 1.9m
Enrrique Vertiz
 
Posts: 541
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru

Re: Leer Excel XLSX grande a un array o DBF

Postby karinha » Thu Aug 10, 2023 6:01 pm

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7822
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Leer Excel XLSX grande a un array o DBF

Postby nageswaragunupudi » Thu Aug 10, 2023 8: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: Select all  Expand view
oRange := GetExcelRange( cExelFileWithFullPath )
aData := xlRangeValue( oRange )
XBROWSER aData
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10634
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: Leer Excel XLSX grande a un array o DBF

Postby Enrrique Vertiz » Fri Aug 11, 2023 5:24 pm

GRACIAS Karinha, Rao !!!
Enrrique Vertiz Pitta
Lima-Peru
xHb 1.23.1026X, Fwh 24.09, BCC74, MySQL 8.0.X, SQLLIB 1.9m
Enrrique Vertiz
 
Posts: 541
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 65 guests