Friday, March 23, 2007

Problemas Globalización Internacionalización Bibliotecas Office .NET

Primera entrada de tecnología, pero esta fue una cosa que me pasó y prefiero dejarla archivada para futuras referencias y también para eventuales lectores que pueda de alguna manera solucionar el problema.

Resumen del sistema, aplicación de escritorio en plataforma .NET lenguaje C#. La aplicación lee un archivo excel de forma práctica utilizando OleDB, muy práctico:


//String de la Query

String ConsultaSQL="SELECT * FROM [NOMBRE-HOJA$]";


//Conexión y Lector
OleDbConnection connection = new OleDbConnection();
string ConStr = "Provider=Microsoft.Jet.OleDb.4.0;Data source=" + PathNombreArchivo + ";Extended Properties=\"Excel 8.0;IMEX=1\"";
OleDbCommand comm = new OleDbCommand(ConsultaSQL, connection);
DbDataReader Lector = comm.ExecuteReader();



Simple y bonito, pero de todas maneras, previo a esto los datos debían pasar por una serie de cálculos que necesariamente vienen de otra planilla excel, es decir, tengo los datos fuentes, se debían copiar a otra planilla excel para que le realice ciertos cálculos y posterior a ello consultarlos. Para este efecto utilicé (no se si malamente, pero me resultó más sencillo), utilicé la interfaz que provee la aplicación Excel, añadiendo por referencia al proyecto la biblioteca del objeto COM de Microsoft Excel 11.0 (referencia directa del Office instalado en el PC de desarrollo). Con ello fue sencillo, levanté la aplicación excel, cargue la planilla de origen, cargue la planilla que contiene las operaciones a realizar, copié a través de Clipboard y guarde un temporal que posteriormente lo leí. Todo OK, funciona en todas partes. Hasta que me llama un usuario que empezó a fallar la carga en todos los equipos (la mayoría laptop) nuevos. Pero en los antiguos todo bien. Resumen final del problema, la biblioteca cargada como referencia COM: Microsoft Excel 11.0 Object Library, viene de Office 2003 (Español), pero los equipos nuevos tiene el Office 2003 (Inglés). Solución:

System.Threading.Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.CreateSpecificCulture("en-US");


Para la función que realiza el tratamiento a las planillas levantando un objeto Excel. Otra solución es enlazar el objeto COM en tiempo de ejecución y no en tiempo de compilación como yo lo estaba haciendo, pero como generalmente las soluciones buscadas son para ayer, entonces funcionó y ahora están todos contentos.

Saludos, !