
Los usuarios finales de un sistema que estamos desarrollando reciben un archivo CSV antiguo que los usuarios finales abrirán en MS Excel. Una de las columnas contendrá entradas que consistirán en cadenas de dígitos numéricos. Estos no son números sino identificadores. Hemos notado que el formato predeterminado aplicado a esta columna hace que las entradas se interpreten como números grandes que posteriormente se representan en notación científica. Esta ya es una mala experiencia para el usuario, pero espera, se vuelve desastrosa. Al guardar el archivo, los datos aparentemente se interpretan como un valor de punto flotante de precisión simple y todos los dígitos después del sexto se truncan por completo. Si el usuario cambia el formato para que la columna se muestre correctamente antes de guardar, Excel no muestra este comportamiento y los datos no se dañan al guardar.
Descubrí que (1) cambiar el formato de la columna o (2) deshabilitar la evaluación de la fórmula evitan que ocurran ambos problemas.
Ahora, mi pregunta: ¿es posible realizar cualquiera de las acciones anteriores, o alguna otra acción que evite los problemas mencionados anteriormente, de forma predeterminada al abrir un archivo de tipo CSV en MS Excel? Tenga en cuenta que probablemente sería increíblemente difícil lograr que el cliente acepte que los usuarios finales deben deshabilitar la ejecución de fórmulas para todos los archivos, incluidos los archivos con formato Excel. ¿Hay alguna manera de establecer la configuración global? ¿Alguna forma de configurar cómo se tratan los CSV en particular? ¿Alguna forma de distribuir una macro a las instalaciones de Excel de los usuarios que se ejecutan en todos los archivos CSV abiertos?
Respuesta1
Descubrí que esto se puede lograr escribiendo un complemento de Excel. En el libro abierto, puedo hacer lo siguiente:
// set format of everything to text
Wb.ActiveSheet.UsedRange.NumberFormat = "@";
// disable further formatting - may not be necessary
Wb.ActiveSheet.EnableFormatConditionsCalculation = "false";
// for any existing cells, overwrite the formatted data with the real data, e.g., the formula
Wb.ActiveSheet.UsedRange.Value = Wb.ActiveSheet.UsedRange.Formula;
Esto me funciona en Excel 2010.