Leer archivo Excel / lectura lenta
Posted: Thu Dec 19, 2019 7:17 pm
Hola,
Tengo un comportamiento extraño al leer un archivo Excel, las primeras 999 filas el programa las lee a una velocidad "normal"/rápida, cuando llega a la fila 1000 comienza a leer muy lento.
Este es el código que estoy utilizando, a ver si alguien puede ver algo "raro" y comentas.
Agradezco su ayuda.
Saludos,
Javier
Tengo un comportamiento extraño al leer un archivo Excel, las primeras 999 filas el programa las lee a una velocidad "normal"/rápida, cuando llega a la fila 1000 comienza a leer muy lento.
Este es el código que estoy utilizando, a ver si alguien puede ver algo "raro" y comentas.
Code: Select all
#include "hmg.ch"
#xcommand TRY => BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
#xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr->
#xcommand FINALLY => ALWAYS
FUNCTION Main()
LOCAL lastRow
LOCAL oErr, oErrRS
LOCAL oCnn, oRs
LOCAL oExcel, cQry
LOCAL oWorkBook, oHoja, nFilas
LOCAL i
LOCAL codigo, descripcion, costo, precio
LOCAL cTime := Time()
IF ( oCnn := win_OleCreateObject( "ADODB.Connection" ) ) == NIL
? 'No es posible crear objeto conexión, ' + win_OleErrorText()
RETURN NIL
ENDIF
TRY
oCnn:Open( "Provider=SQLNCLI11;Server=IP\INSTANCIA;Database=database;Uid=user;Pwd=pwd;" )
CATCH oErr
? "Error al intentar conectar a la base de datos " + e"\n" + hb_StrToUtf8(oErr:Description)
RETURN NIL
END
//RecordSet
//oRs := win_OleCreateObject( "ADODB.Recordset" )
//
IF ( oExcel := win_oleCreateObject( "Excel.Application" ) ) == NIL
? 'Error: Microsoft Excel no está disponible, ', win_OleErrorText()
RETURN NIL
ENDIF
oExcel:Visible := .F.
oExcel:DisplayAlerts := .F.
oWorkBook := oExcel:WorkBooks:Open( "C:\actualizar_precios\hmg\lista_precios_2020.xlsx" )
oExcel:Sheets(1):Select()
oHoja := oExcel:ActiveSheet
nFilas := oHoja:UsedRange:Rows:Count()
QOut( "Número total de filas: " + Alltrim( hb_NtoS( nFilas ) ) )
FOR i := 2 TO nFilas
codigo := Cell2Chr( oHoja:Cells(i,1):Value )
descripcion := Cell2Chr( oHoja:Cells(i,2):Value )
costo := Cell2Val( oHoja:Cells(i,3):Value )
precio := Cell2Val( oHoja:Cells(i,4):Value )
QOut( " " + CRLF )
QOut( 'Registro ' + Alltrim( hb_NtoS(i) ) )
QOut( hb_utf8ToStr('Código: ') + codigo )
QOut( hb_utf8ToStr('Descripción: ') + descripcion )
QOut( "Costo: " + Alltrim( hb_NtoS( costo ) ) )
QOut( "Precio: " + Alltrim( hb_NtoS( precio ) ) )
cQry := "UPDATE admProductos SET " + ;
"precio1 = " + DataToSQL(precio) + ", " + ;
"precio2 = " + DataToSQL(precio) + ", " + ;
"precio3 = " + DataToSQL(precio) + ", " + ;
"precio4 = " + DataToSQL(precio) + ", " + ;
"precio5 = " + DataToSQL(costo) + ", " + ;
"precio6 = " + DataToSQL(precio) + ", " + ;
"precio7 = " + DataToSQL(precio) + ", " + ;
"precio8 = " + DataToSQL(precio) + ", " + ;
"precio9 = " + DataToSQL(precio) + ", " + ;
"precio10 = " + DataToSQL(precio)
QOut( cQry )
//Inkey(0)
/*
TRY
oCnn:Execute( cQry )
CATCH oErrRS
? "Error al actualizar datos en la tabla" + e"\n" + hb_StrToUtf8(oErrRS:Description)
RETURN .F.
END
*/
NEXT
oExcel:WorkBooks:Close() // CIERRA LIBRO ACTIVO
oExcel:Quit() // CIERRA EXCEL
?
? "Todo OK, Tiempo transcurrido : " + ElapTime( cTime, time() )
?
//cerrar conexión y recordset (si es que utilizamos RecordSet)
oCnn:Close()
oCnn := NIL
// RecordSet
//oRS:Close()
//oRS := NIL
RETURN NIL
/*******/
/*
* Cell2Val
*/
FUNCTION Cell2Val( xCadena )
LOCAL nNumero := 0
LOCAL cTipo := VALTYPE(xCadena)
DO CASE
CASE cTipo = 'C'
nNumero := VAL( xCadena )
CASE cTipo = 'N'
nNumero := xCadena
CASE cTipo = 'U'
nNumero := 0
OTHERWISE
MsgInfo('Error : '+cTipo)
ENDCASE
RETURN( nNumero )
/*******/
/*
* Cell2Chr
*/
FUNCTION Cell2Chr( xCadena )
LOCAL cCadena := ' '
IF ! VALTYPE( xCadena ) = 'U'
DO CASE
CASE VALTYPE(xCadena) = 'C'
cCadena := xCadena
CASE VALTYPE(xCadena) = 'N'
cCadena := VAL(STR(INT(xCadena)))
CASE VALTYPE(xCadena) = 'D'
cCadena := DTOC(xCadena)
ENDCASE
ENDIF
RETURN( cCadena )
/*******/
/*
* DataToSQL
*/
FUNCTION DataToSQL( xField )
LOCAL cType, result := 'NULL'
cType := ValType( xField )
IF cType == "C" .OR. cType == "M"
IF !Empty( xField )
result := "'" + xField + "'"
ENDIF
IF xField == "NIL"
result := 'NULL'
ENDIF
ELSEIF cType == "D" .AND. !Empty( xField )
// formato fecha ISO 8601 YYYYMMDD
result := "'" + StrZero( Year( xField ), 4 )
result += StrZero( Month( xField ), 2 )
result += StrZero( Day( xField ), 2 ) + "'"
ELSEIF cType == "N"
result := hb_ntos( xField )
result := "'" + result + "'"
ELSEIF cType == "L"
result := IIF( xField, "'t'", "'f'" )
ENDIF
RETURN result
/*******/Saludos,
Javier