Importación Excel - v7


([N4] apinna.winmotor) #1

Hola foro,

después de llevarme un buen rato currándome una importación de una tarifa desde Excel he conocido una limitación : sólo puedo leer 32.000 y pico filas del Excel, hay la dll se para devolviendo el control correctamente.

Necesitamos una herramienta de este tipo y para archivos enormes en nuestra aplicación y por otro lado he detectado que al guardar el Excel como csv pasan cosas extrañas en algunas filas ( inexplicablemente se insertan " e intros en medio de descripciónes).

¿ Alguien se ha montado con javascript un importador de Excel ? Estamos dispuestos a comprarlo

¿ Existe una versión de v2Excel más actualizada que no tenga la limitación de las 32.000 filas ?

Saludos a todos


([N3] pacosatu) #2

Hola apinna.winmotor.

Me imagino que la dll v2Excel se escribió hace tiempo cuando Excel estaba muy limitado en número de filas (32.000).

De todas formas, lo mejor en estos casos es exportar la tarifa a formato CSV, con lo que ya no tendrás límite de líneas. La importación se podrá hacer con Velneo directamente sin depender de librerías con poco o nulo soporte.

La exportación a CSV se puede hacer manualmente o mediante una macro VBA.

Saludos
Paco Satué


([N4] apinna.winmotor) #3

Hola Paco,

ante todo muchas gracias por la atención. El caso es que al exportar el excel a csv hace cosas rarísimas: a algunas descripciones les inserta comillas e intros inexplicablemente. Hace lo mismo si copio a pelo el contenido completo del excel y lo pego en un archivo plano. Por más vueltas que le he dado la única explicación que le encuentro es que el archivo ha sido creado en china pero convirtiendo la fuente tampoco funciona bien.

Te lo adjunto por si lo quieres ver : si pruebas a "guardar como " csv verás lo que te hace.

Saludos

MUESTRA_TARIFA.xlsx (9.45 KB)


([N1] wikan) #4

Buenas @apinna.winmotor

Las comillas no me salen al guardar en csv. Pero si tienes saltos de línea por que en tu muestra en la fila 5 si te fijas, el contenido está en dos líneas.


([N4] apinna.winmotor) #5

Hola @Wikan

la cosa es más complicada: no es que el contenido esté en dos líneas sino que algunas líneas tienen un intro (0D en hexadecimal) al final del nombre. Además para filparlo si pinchas en una de estas líneas , por ejemplo la de la referencia 1231A-L4A-000 verás que en la rejilla se ve un espacio entre “COVER” y “ASSY” y este espacio desaparece en la presentación del contenido de la cabecera.

El problema es que el archivo origen tiene 51.000 y pico de referencias y no veo la forma de automatizar un proceso limpio para importarlo puesto que esto pasa en bastantes líneas.

De ahí lo que planteaba en el primer hilo: ¿ alguien habrá desarrollado un lector javascript de archivos Excel ?

Saludos y muchas gracias


([N4] PedroN) #6

Hola apinna.
Visto el fichero, las líneas que tienen comillas creo obedece a que en el literal aparece en Excel “COVER ASSY” pero esta separación no es el espacio de la barra espaciadora sino un carácter “extraño” que engaña a la vista. Verás que en el “.csv” se juntan ambas palabras y aparece “COVERASSY”. Lo mismo sucede con el “intro”. Si te fijas con detalle en Excel la separación es mayor entre estas palabras que en las líneas que salen sin comillas.
Un saludo,


([N1] wikan) #7

Dejame jugar un poco a ver que sale.


([N4] PedroN) #8

Siguiendo con el tema.
Las líneas con comillas tienen caracteres no imprimibles.
La función “LIMPIAR” de Excel te elimina los caracteres no imprimibles.
Luego puedes usar sustituir para escribir correctamente la palaba afectada.
Cito ayuda Microsoft:
“En el juego de caracteres Unicode, hay un carácter adicional llamado espacio de no separación, que tiene un valor decimal de 160. Este carácter se usa normalmente en las páginas web como la entidad HTML  .”
Saludos,


([N3] pacosatu) #9

Hola apinna.winmotor.

Dices: “El caso es que al exportar el excel a csv hace cosas rarísimas …”

Hombre, esto es algo típico y ha pasado siempre en la importación de datos. Con los productos de Office (word y excel) se acrecenta mucho porque tienen la manía de empozoñarse fácilmente con caracteres procedentes de otros entornos.
Importar directamente de una hoja excel o documento word que no hayas generado tú está condenado al fracaso.

Por eso siempre hay que “depurar” los datos antes de importarlos, y no tiene nada que ver con tener una librería dll estupenda o una rutina javascript superápida.

Es una labor manual y dependerá de cada caso.

En tu caso:

  • Selecciona toda la Hoja y fija la fuente a Arial, 10 puntos (una fuente que tengas instalada en el equipo)
  • Copia toda la Hoja y en un Libro nuevo Pega Valores. Con esta acción desaparecen las fórmulas, vínculos, etc… y nos quedamos con datos puros que es lo que le interesa a Velneo.
  • Si detectas columnas con datos “No imprimibles” tal como indican Manuel y Pedro, usa la función Limpiar(texto) de Excel.
    Para ello, crea una columna nueva a la derecha de la que quieres limpiar. Pon la fórmula Limpiar(B5) y cópiala a toda la columna. Verás que desaparecen los caracteres no imprimibles. Selecciona la columna nueva y vuelve a Copiar y Pegar Valores para quedarte con los datos bien formados. Ya puedes borrar la columna original con los caracteres extraños.
  • Con esto ya puedes exportar a CSV y comprueba que no aparecen Comillas ni saltos extra.

Un buen editor para comprobar y depurar texto es Notepad++. No tiene problemas con textos largos de cualquier formato y es rapidísimo.

Ya la importación nativa con Velneo es cosa de niños. Únicamente controla las transacciones en la importación de muchas filas o tirarás el vServer.

Saludos
Paco Satué


([N4] apinna.winmotor) #10

@paco, @wikan, @pedron muchas gracias por la colaboración.

Utilizando la función limpiar he conseguido crear un csv sin errores. Volviendo al principio de este hilo el caso es que esto es un proceso periódico que tienen que ejecutar los usuarios que para este caso son mecánicos o recambistas y como entenderéis no se le puede contar esta película.

Si v2Excell no tuviera la limitación de las 32.000 líneas yo podría depurar el contenido de la celda desde V7 y no habría que exportar a csv ni nada de esto, todo sería más simple. Animo desde aquí al que en su día creo v2Excell o a algún otro valiente a actualizar esta herramienta o a crear una nueva.

Saludos y gracias de nuevo a todos


([N4] gontorre) #11

Coincido con apinna.winmotor en que sería interesante mejorar el componente v2Excel. Con las últimas versiones de Excel hay ciertas cosas que no funcionan, aparte de la limitación de filas. Por ejemplo, yo no he conseguido poner una celda en negrita cuando genero una hoja.

En mi caso he tenido que implementar bastantes importaciones de hojas de excel porque necesito cargar tarifas, pedidos, cotizaciones que me envían determinados clientes o proveedores. Si es una carga esporádica la puedo pasar a CSV y cargarla, pero en la rutina diaria no puedo pedirle a los comerciales que anden con esas cosas. Algunos creerán que CSV es un equipo de fútbol.

Un saludo

Gonzalo Torre


([N3] pacosatu) #12

Hola.

Para exportar datos a Excel lo mejor es usar las macros de VBScript (Necesitamos Excel instalado) o crear directamente el fichero XML usando simples comandos de gestión de cadenas (en este caso no precisamos tener Excel instalado).

Para importar datos de Excel, si no os gusta la opción CSV, existe otra posibilidad que es usar el driver ODBC para acceder a la Hoja de cálculo como si fuera una tabla.

Para ello descargar el AccessDatabaseEngine que instala en el equipo los drivers ODBC necesarios para acceder, entre otros, a los ficheros Excel en formato xls y xlsx.

Se puede instalar de forma silenciosa en el usuario final mediante el comando -> AccessDatabaseEngine.exe /silent

Los comandos Velneo serían:
BD: Crear manejador ( hExcel, ODBC (compatible Microsoft SQL Server), “Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}; DBQ=d:/temp/Importar.xlsx;”, , , )
BD: Conectar ( hExcel, , , OK_CONEXION, OK_MENSAJE )
– BD: SQL ( hExcel, “SELECT * FROM \cHoja1$A1:F65536\c”, ODBC_NUM_FILAS, )
---- BD: Recorrer lista ( hExcel )
------ BD: Get dato de columna por nombre ( “TITULO”, 0, CAMPO_TITULO )
------ BD: Get dato de columna por nombre ( “PRECIO”, 1, CAMPO_PRECIO )

  • La consulta SELECT se hace sobre una Hoja del libro Excel y podemos especificar el rango de Importación.
  • ODBC_NUM_FILAS siempre devuelve -1 por lo que podemos saber de antemano el Nº de filas a importar.
    Me ha funcionado hasta con 65535 filas
  • La primera fila del rango debe contener los Nombres de Campo o de columna

Otra solución más.

Saludos
Paco Satué


([N1] info) #13

Fenomenale Paco… Probado en W8.1 con Excel 2013.


([N4] apinna.winmotor) #14

@Paco,

muchísimas gracias, esto si que es una solución y te la has currado.

Lo pruebo ahora mismo


([N4] apinna.winmotor) #15

@Paco,

sólo volverte a agradecer el esfuerzo: lo hemos montado y no sólo funciona sino que va como un tiro.

Muchas gracias por todo


([N3] pacosatu) #16

Hola apinna.winmotor.

Me alegro que os haya servido.

Saludos
Paco Satué


([N1] Juan) #17

Un aporte de hecho para importar siempre tiene que haber una limpieza de datos. cuando tengo datos en txt los paso a csv y el excel me pone comillas por que no se, sin emabrgo lo abro con notepad y los reemplazo con nada.

Ahora tenia un csv de mas de 1 millon de registros a importar era un solo campo y mi tabla tenia solo ID y campo NAME pero me tiraba el servidor, tardaba como media hora pero al finalizar se colgaba, hasta en 3er plano, mi maquina corei7 6gb de ram y se la traia abajo, la solucion es que mi tabla tenia el indice words y parts, los borre solo deje el indice ID y lo hizo en 3 minutos, luego le agregue los indicies y lo hizo en un cerrar y abrir de ojos.

Espero ayude en algo…
Saludos a la comunidad mas activa…!!!


([N3] pacosatu) #18

Hola Juan.

Para las tablas que necesiten importaciones masivas, en lugar de quitar los Índices, Triggers, Actualizaciones, etc … que ralentizan la transacción, lo más adecuado es condicionarlos mediante el valor Inicial aplicado a un campo de la tabla. Por ejemplo un campo #BORRADOR que se pone a 1 inicialmente para usar en la fórmula de Condición.

Una vez realizada la importación masiva, se recorren los registros añadidos poniendo a 0 el campo #BORRADOR, con lo que se irán creando los Índices y ejecutando Triggers, Actualizaciones, …

Saludos
Paco Satué


([N1] info) #19

Todo bien, pero se me presenta un problema tengo cabeceras con texto “F.Pago” , y “Coste Equip.” Asi que cualquier cabecera con separaciones caracteres como guiones, puntos, Barras, asi como acentos… NO LO LEE.

He probado con “F”+getAsciiChar(46,"\cISO-8859-1\c")+“Pago”, Para F.Pago , y tampoco funciona.

Esta testeado que es el punto , si cambio la cabecera a FPago funciona correctamente.

Se os ocurre alguna idea…

Habia pensado en leer la primera linea y eliminar todos los caracteres…


([N3] pacosatu) #20

Hola info.

Si te dan problemas los nombres de las columnas usa el comando “BD: Get dato de columna por número” para referirte a ellas por el número de columna.

Saludos
Paco Satué