Hola foro. tengo el siguiente problema, a ver si alguien tiene alguna idea del porque y como solucionarlo,
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:
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
}
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.
Saludos y gracias por vuestro tiempo
Plch