Exportación Excel vTools - Formato númerico

Hola a todos,

estoy integrando en una toolbar la exportación a excel de vTools, pero he observado que si tengo en una columna datos númericos con edición “Local”, los “.” de miles me los convierte en “,” decimal, dando unos valores erróneos.

Alguna pista?

Un saludo

pd. la configuración de “.” para miles y “,” para decimales es correcta

Hola Matías.

Consúltalo a Soporte y nos cuentas.

Saludos
Paco Satué

Buenos días Paco,

no tenéis esta misma incidencia o es que no usáis la exportación de la vTools?

Un saludo

Hola Matías.

Comprueba que tienes la última versión de vTools, la 18.1.

La exportación a Excel de vTools es muy básica, basada en el motor VBScript (solo Windows) y con un tratamiento de los números que tira por la calle de enmedio tratándolos como strings.

Lo más correcto es que los números, al igual que las fechas se exporten siempre en formatos independientes del sistema, es decir, con separador de punto decimal y sin separador de miles.

En su dia, ví algunos problemas en el código de vTools:

  • Para detectar los decimales de la columna ejecuta → var datoEnPartes = dato.split(".") por lo tanto contempla como separador de decimales el punto, lo que no siempre es cierto.
  • Rodea los datos numéricos entre comillas → scriptVB += ‘objSheet.Cells(’ + (fila+2) + ‘,’ + (columna+1-ocultas) + ‘).Value = "’ + dato + ‘"\r\n’; por lo tanto en Excel se reciben como textos y debemos pasarlos manualmente a números.
  • La condición → if (this.rejilla.dataType(columna) == VGridListDataView.TypeNumber) se cumple para algunas columnas y para otras no, aún siendo todas numéricas. Parece ser que si aplicas formato de alguna clase (negrita, fuente, …) deja de ser numérica.

Revisa el fichero VBS generado ExcelScript.vbs en la caché:

objSheet.Cells(2,2).Value =chr(39)+“Febrero” → esto es un string, correcto

objSheet.Cells(2,4).Value =chr(39)+“48.000,26” → Un número es así como lo genera VELNEO, Excel lo recoge como texto

objSheet.Cells(2,5).NumberFormat =“0.0#”
objSheet.Cells(2,5).Value = 48000.26 → Así es como debería de generarse para que sea un número

En fin, son muchas cosas las que hay que revisar y por eso lo de consultar a Soporte.

Saludos
Paco Satué

ok Paco muchas gracias.

La versión de vTools es la última, y revisando el código había observado lo que indicabas para dato.split(“.”).

He lanzado la consulta a Soporte y ya os informo.

Un saludo!

Hola a todos,

después de estar intercambiado correos con soporte y no obtener una solución a esta incidencia, me comentan que van a realizar pruebas.

Yo no he programado nunca en JavaScript, pero me he aventurado a modificar el código de las vTools (total, un “if” y un “else” ya sabemos qué hacen en cualquier lenguaje).

Con esta modificación se resuelve la exportación de datos numéricos, tengan o no decimales. Además se corrige la conversión que hacía a Texto y pasan directamente como numérico.

Le he enviado el fichero JS a soporte para que lo revisen y modifiquen lo que crean conveniente.

Os adjunto el fichero modificado. Las líneas que han cambiado/añadido están comentadas previamente con asteriscos.

Un saludo

pd. no sé si debido a mi desconocimiento de JS habré cometido algún “sacrilegio” en el código de las vTools. Supongo que me podrán perdonar :wink:

export_rejilla_excel.rar (2.67 KB)

Hola Matías.

Gracias por el aporte.
De todas formas comprueba que funciona también para:

  • Columnas con atributos aplicados (negritas, fuente, formato condicional, …)
  • Columnas que son cálculadas mediante una fórmula numérica.

Saludos
Paco Satué

P.D. El API de Velneo son 3 o 4 dias para aprenderlo y el JavaScript básico necesario, una semana como mucho.

le echaré un vistazo Paco.

Un saludo!

Buenas tardes Paco,

he modificado de nuevo el JS y funciona incluso para campos calculados con fórmula y campos con atributos aplicados.
El problema estaba (entre otras cosas) en la validación del tipo de columna, en la sentencia if (this.rejilla.dataType(columna) == VGridListDataView.TypeNumber)

La he sustituido por if (isNaN(datoEnPartes[0])==false) para que compruebe si es un valor numérico válido. He usado para comparar la parte izquierda del dato para así evitar errores en el caso de campos alfanuméricos tipo “C/LARGA, 23”. Si comparamos con el dato que está a la derecha de la “,” o un “.” (dependiendo nuestra configuración regional) lo tomaría como numérico cuando no es correcto.

Bueno no me enrollo más. Adjunto de nuevo el fichero JS

Un saludo!

export_rejilla_excel-1.rar (2.61 KB)

Hola a todos,

adjunto una nueva versión del script de la exportación a excel de las vTools.

Un saludo

export_rejilla_excel-2.rar (2.61 KB)

Hola Matías.

He probado el código y en principio funciona bien.

Yo añadiría la opción de poner o no el Separador de Miles dependiendo de si lo tiene o no la columna de la Rejilla.


if (isNaN(datoEnPartes[0])==false) {
   // Comprobamos si la columna tiene separador de miles
   <strong>var lConSepMiles = dato.indexOf(thousandsSeparator) > -1</strong>
   dato = dato.replace(thousandsSeparator, "");
   dato = dato.replace(decimalPoint, decimalPointExcel);
   if (numeroDecimales>0) {
      scriptVB += 'objSheet.Cells(' + (fila+2) + ',' + (columna+1-ocultas) + ').NumberFormat =' + '"#' + <strong>(lConSepMiles?',':'')</strong> + '##0.0' +Array(numeroDecimales).join("0")+'"' + '\r\n';
   } else {
      scriptVB += 'objSheet.Cells(' + (fila+2) + ',' + (columna+1-ocultas) + ').NumberFormat =' + '"#' + <strong>(lConSepMiles?',':'')</strong> + '##0"' + '\r\n';
   }
   scriptVB += 'objSheet.Cells(' + (fila+2) + ',' + (columna+1-ocultas) + ').Value = "' + dato + '"\r\n';
} else {
   // Le sumamos 2 a la fila porque en excel las filas empiezan en 1 y en la posición 1 están los títulos
   scriptVB += 'objSheet.Cells(' + (fila+2) + ',' + (columna+1-ocultas) + ').Value =chr(39)+"' + dato + '"\r\n';
}

Saludos y gracias
Paco Satué

Hola Paco,

me parece perfecto!
Ya está actualizado el código.

Un saludo y muchas gracias!

export_rejilla_excel-3.rar (2.67 KB)

Hola a todos,

ya ha respondido el equipo de Soporte:

“Informarle que en la próxima versión de vTools se incluirá el script que recomendó tras evaluación por el equipo de desarrollo.”

Un saludo a todos