Tengo una aplicacion basada en winform que esta compilada con VS2008 C# y en un sistema operativo de 64 bits (W7).
la aplicacion intenta abrir desde una ubicacion un archivo en excel, para lo cual utiliza interop, el cual esta referenciado en la aplicacion.
al seleccionar un archivo, la aplicacion hace un open del libro (pasado como variable), y recorre la coleccion Worksheets obteniendo el nombre de la hoja y copiandolo en un datatable, el cual se retorna para que el usuario elija la hoca del libro con la cual quiere trabajar (en caso que exista mas de una)
posteriormente con el nombre del archivo y el nombre de la hoja, se ejecuta nuevamente la funcion de apertura, esta vez para leer lod datos del libro/hoja especificados, y traspasarlos a un datatable, el cual es devuelto para el procesamiento de dichos datos
el problema es, que la aplicacion funciona en la maquina donde compilo la aplicacion, pero cuando copio esta aplicacion al servidor de produccion (donde la accesaran varios usuarios) me arroja el siguiente error:
Excepción de HRESULT: 0x800A03EC
He visto en otros foros, que mencionan un problema de acceso al archivo (aunque siempre hacen referencia a aplicaciones del tipo web), por lo que intente abrir un archivo que reside en el mismo server, incluso en el mismo directorio donde se ejecuta la aplicacion, pero aun asi, me sigue marcando el error.
este es el codigo de la aplicacion, la cual sigue una serie de recomendaciones para trabajar con este tipo de tecnologias. aca lo dejo por si alguien lo quiere utilizar
Código:
private DataTable _dttObtieneHojasLibro(string _sPath) { try { DataTable dttHojas = new DataTable(); dttHojas.Columns.Add("hojas", Type.GetType("System.String")); dttHojas.Columns.Add("total_filas", Type.GetType("System.Int32")); System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); #region Open WorkBook Method Parameters int iTime = 50; Microsoft.Office.Interop.Excel.Application oApp = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbooks oBooks = oApp.Workbooks; Microsoft.Office.Interop.Excel.Workbook oBook = oBooks.Add(Type.Missing); #region Open WorkBook Method Parameters oBook = oApp.Workbooks.Open(_sPath, //Source File Name 0, //UpdateLinks false, //ReadOnly 5, //Format "", //Password "", //WriteResPassword true, //IgnoreReadOnly Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, //Origin "\t", //Delimiter false, //Editable false, //Notify 0, //Converter false, //AddToMru null, //Load null); //CorruptLoad #endregion #endregion #region Procesa Hojas Libro for (int i = 1; i < oBook.Worksheets.Count + 1; i++) { Microsoft.Office.Interop.Excel.Worksheet sheet = new Microsoft.Office.Interop.Excel.Worksheet(); sheet = (Microsoft.Office.Interop.Excel.Worksheet)oBook.Worksheets.get_Item(i); if (sheet != null && sheet.Name.Length > 0) { dttHojas.Rows.Add(sheet.Name.Trim(), sheet.Rows.Count); } } #endregion #region Close WorkBook Method Parameters //NAR(hoja, iTime); oBook.Close(false, Type.Missing, Type.Missing); NAR(oBook, iTime); NAR(oBooks, iTime); oApp.Quit(); NAR(oApp, iTime); if (!bKillExcellProcess(iTime)) { return null; } #endregion System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("es-CL"); if (dttHojas.Rows.Count > 0) { return dttHojas; } else { return null; } } catch (Exception ex) { return null; } }
Código:
La verdad de las cosas, es que ya he gastado demasiado tiempo y neuronas en este tema, y ya estoy pensando en optar por una libreria de pago, que me permita manejar archivos en excel, ya que incluso estuve un tiempo usando ADO, pero este no tiene soporte para 64 bits.private DataSet _dttXlsToDts(string _sPath, string _sHoja, System.Data.DataTable _dttFormato, string _sPassword) { #region Seteo de password string sPassword = null; if (_sPassword == null || _sPassword.Length == 0) { sPassword = ""; } else { sPassword = _sPassword; } #endregion #region Setea el nombre del Dataset dtsDataSource = new DataSet(_sPath.Substring(_sPath.LastIndexOf("\\") + 1)); #endregion #region Open WorkBook Method Parameters int iTime = 50; Microsoft.Office.Interop.Excel.Application oApp = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbooks oBooks = oApp.Workbooks; Microsoft.Office.Interop.Excel.Workbook oBook = oBooks.Add(Type.Missing); #region Open WorkBook Method Parameters oBook = oApp.Workbooks.Open(_sPath, //Source File Name 0, //UpdateLinks false, //ReadOnly 5, //Format "", //Password "", //WriteResPassword true, //IgnoreReadOnly Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, //Origin "\t", //Delimiter false, //Editable false, //Notify 0, //Converter false, //AddToMru null, //Load null); //CorruptLoad #endregion #endregion #region transform to datatable from Excel for (int i = 1; i < oBook.Worksheets.Count + 1; i++) { Microsoft.Office.Interop.Excel.Worksheet sheet = new Microsoft.Office.Interop.Excel.Worksheet(); sheet = (Microsoft.Office.Interop.Excel.Worksheet)oBook.Worksheets.get_Item(i); if (sheet.Name.ToString().Trim().ToUpper() == _sHoja.Trim().ToUpper()) { System.Data.DataTable dttAux = new System.Data.DataTable(); dttAux = loadDataTable((Microsoft.Office.Interop.Excel.Worksheet)oBook.Worksheets.get_Item(i)); if (dttAux == null || dttAux.Rows.Count == 0) { continue; } // revisa si existe el datatable con el formato if (_dttFormato != null && _dttFormato.Rows.Count > 0) { if (bFormatoOK(_dttFormato, dttAux)) { dtsDataSource.Tables.Add(dttAux); } } } } #endregion #region Close WorkBook Method Parameters //NAR(hoja, iTime); oBook.Close(false, Type.Missing, Type.Missing); NAR(oBook, iTime); NAR(oBooks, iTime); oApp.Quit(); NAR(oApp, iTime); if (!bKillExcellProcess(iTime)) { return null; } #endregion #region devuelve resultados por propertys y por parametros dtsDatos = dtsDataSource; return dtsDataSource; #endregion }
Saludos y gracias por vuestro tiempo
Plch