Principales respuestas
Problema al generar achivo excel - Excepción de HRESULT: 0x800A03EC

Pregunta
-
Hola camaradas computines,
Estoy trabajando en una aplicacion asp.net con VB, la instale en un servidor con windows server 2008 y al trabajar de forma local en el servidor la aplicacion me genera sin problemas el archivo excel. Sin embargo al correr la aplicacion web desde mi pc me arroja el siguiente errorError de servidor en la aplicación '/'.
Excepción de HRESULT: 0x800A03EC
Descripción: Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código.
Detalles de la excepción: System.Runtime.InteropServices.COMException: Excepción de HRESULT: 0x800A03EC
Error de código fuente:
Línea 653: Archivo = New Excel.Application Línea 654: Libros = Archivo.Workbooks Línea 655: Libro = Libros.Open("C:\Inetpub\wwwroot\Gringo\Agencia\Agencia\Estadisticas_Sigad\Archivos Excel\MATRIZ_CONSULTA_EXPO.xls") Línea 656: Hoja = Libro.Worksheets(1) Línea 657: Hoja.Unprotect()
Archivo de origen: C:\inetpub\wwwroot\gringo\Agencia\Agencia\Estadisticas_SIGAD\wfConsultaExpoSIGAD.aspx.vb Línea: 655
Seguimiento de la pila:
[COMException (0x800a03ec): Excepción de HRESULT: 0x800A03EC] Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad) +0 Agencia.wfConsultaExpoSIGAD.GENERAEXCEL() in C:\inetpub\wwwroot\gringo\Agencia\Agencia\Estadisticas_SIGAD\wfConsultaExpoSIGAD.aspx.vb:655 Agencia.wfConsultaExpoSIGAD.btConsultar_Click(Object sender, EventArgs e) in C:\inetpub\wwwroot\gringo\Agencia\Agencia\Estadisticas_SIGAD\wfConsultaExpoSIGAD.aspx.vb:339 System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565
En el servidor y en mi pc tengo instalado office 2003. Busque en la web y no encontre cual seria el problema por eso recurro a sus conocimientos, espero que puedan ayudarme, de antemano muchas gracias.
Respuestas
-
este post se siguien en el foro de asp.net
Problema al generar achivo excel - Excepción de HRESULT: 0x800A03EC
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Marcado como respuesta Falfost viernes, 16 de octubre de 2009 12:05
Todas las respuestas
-
hola
Es todo un tema el uso de las librerias COM de Excel desde una aplicacion Web
- descarto que la ruta sea la correcta
- prueba si no es un tema de impersonacion:
ASP.NET Impersonation
C ó mo implementar la representación en una aplicación ASP.NET
Understanding Impersonation in ASP.NET
como veras debes agregar el tag
<identity impersonate="true" userName="accountname" password="password" />
a tu web.config, agregando un usuario y paswword que al menos tenga permisos de administracion local en el equipo
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
-
hola
Segun comentas al trabajar en el Win 2008 de forma local, o se me imagino con una aplicacion winforms te funciona, pero en tu pc en un sitio web no.
No has probado crear una aplicacion pequeña winform y correrla localmente en tu pc a ver si te funciona la generacion del excel
- en Win2008 cuando dices que funciona es tambien dentro de una aplicacion web ?
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
claro, es una aplicacion web.. esta montada en un servidor win 2008 con .net 2008, si llamo a esta pag web desde el servidor (abro explorer y pongo localhost) logro crear el archivo excel...(lo q hacer realmente la aplicacion es abrir un archivo excel y modificarlo y luego guardarlo en otra ubicacion.. pero el problema ahora es al abrir el archivo)... Cuando trato de ejecutar la misma aplicacion desde mi maquina me arroja el error q mencione...
-
-
este post se siguien en el foro de asp.net
Problema al generar achivo excel - Excepción de HRESULT: 0x800A03EC
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Marcado como respuesta Falfost viernes, 16 de octubre de 2009 12:05
-
yo tambien tenia el mismo problema que tu... y de una y otro forma lo solucione y te paso a explicar espero te sirva, para comenzar te debo decir que tengo una aplicacion en la cual se me pidio expotar a excel si bien es cierto no se recomienda el uso dela libreria interop en el asp pero hay situaciones que se deben usar si o si bueno el codigo es el siguiente
Dim excel As Microsoft.Office.Interop.Excel.Application = Nothing
Dim Libro As Microsoft.Office.Interop.Excel.Workbook = Nothing
Dim HojaAnt, HojaPost, hoja As Microsoft.Office.Interop.Excel.Worksheet
hoja = Nothing
HojaAnt = Nothing
HojaPost = Nothing
Dim nameAnte(99) As String
Dim namePost(99) As String
Dim k As Integer = 0
Try
Dim regla As New RNDocumentoVenta
Dim docven As Data.DataTable
docven = regla.ListarDocumentoVentaCod(Usuario, CInt(gvcontratos.Rows(gvcontratos.SelectedIndex).Cells(16).Text))
excel = New Microsoft.Office.Interop.Excel.Application
'Libro = excel.Workbooks.Add(AppDomain.CurrentDomain.BaseDirectory & "\Plantillas\Consolidado_Primaria.xls")
Libro = excel.Workbooks.Add(Server.MapPath("~/Plantillas\boleta.xltx"))
HojaAnt = CType(Libro.Worksheets(1), Worksheet)
HojaAnt.Select()
excel.ScreenUpdating = False
Dim cont As Integer = 0
Dim cadenafecha As String
'For cont = 0 To 1
cadenafecha = Now.Day & "/" & Now.Month & "/" & Now.Year
HojaAnt = CType(Libro.Worksheets(1), Worksheet)
HojaAnt.Copy(HojaAnt)
'para la fecha
HojaAnt.Range("I8").Value = docven.Rows(0).Item(3).ToString
'para el dni
HojaAnt.Range("I10").Value = gvcontratos.Rows(gvcontratos.SelectedIndex).Cells(9).Text
'para el cliente
HojaAnt.Range("C8").Value = gvcontratos.Rows(gvcontratos.SelectedIndex).Cells(8).Text
'para el direccion
HojaAnt.Range("C10").Value = ""
'para el precio
HojaAnt.Range("I13").Value = docven.Rows(0).Item(5).ToString
HojaAnt.Range("I21").Value = docven.Rows(0).Item(5).ToString
'para el descripcion
Dim cant As Integer
cant = Len(docven.Rows(0).Item(4).ToString)
Dim descrip As String
descrip = docven.Rows(0).Item(4).ToString().Substring(0, cant / 2)
HojaAnt.Range("B13").Value = descrip
descrip = docven.Rows(0).Item(4).ToString().Substring(cant / 2, Len(descrip) - 1)
HojaAnt.Range("B14").Value = descrip
'Next
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'*************** Borrando las dos primeras hojas ****************'
excel.DisplayAlerts = False
Dim hojaA, hojaP As Microsoft.Office.Interop.Excel.Worksheet
hojaA = CType(Libro.Worksheets(1), Worksheet)
hojaA.Select()
If Libro.Worksheets.Count > 1 Then
hojaA.Delete()
End If
hojaA = Nothing
hojaP = Nothing
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'*************** Agregar los nombres de las hojas ****************'
Dim w As Integer = Libro.Worksheets.Count
Dim count As Integer
count = CInt((w))
w = Libro.Worksheets.Count
For k = 0 To count - 1
HojaAnt = CType(Libro.Worksheets(w), Worksheet)
HojaAnt.Name = k + 1
hoja = CType(Libro.Worksheets(w), Worksheet)
hoja.Select()
'excel.Run("OcultarFilaVacia")
'excel.Run("OcultarColumnaVacia")
'HojaAnt.Protect(CLAVE)
w -= 1
Next
'Me.pbAvance.Value += 5
'*************** Para seleccionar la primera hoja ****************'
hoja = CType(Libro.Worksheets(1), Worksheet)
hoja.Select()
'------------------------------------------------------------------'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'******************* Para guardar las hojas *********************'
'excel.ActiveWorkbook.SaveAs("c:\" & "Consolidado" + cadenafecha + ".xls")
excel.ActiveWorkbook.SaveAs(Server.MapPath("~/Exportacion/boleta.xlsx"))
' MsgBox(Server.MapPath("~/Exportacion/Consolidado.xlsx"))
excel.ActiveWorkbook.Activate()
'fechacadena = cadenafecha
'Release(excel)
'------------------------------------------------------------------'
excel.ScreenUpdating = True
hoja = Nothing
HojaAnt = Nothing
HojaPost = Nothing
Libro.Close()
'Libro = Nothing
excel.Workbooks.Close()
excel.Quit()
'excel = Nothing
Marshal.ReleaseComObject(Libro)
Marshal.ReleaseComObject(excel)
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()
'GC.Collect()
'GC.WaitForPendingFinalizers()
Catch ex As Exception
'If excel Is Nothing Then
' excel = New Microsoft.Office.Interop.Excel.Application
'End If
'If excel.ScreenUpdating = False Then
' excel.ScreenUpdating = True
'End If
excel.ActiveWorkbook.Saved = True
Finally
Response.Clear()
Response.ContentType = "application/vnd.mds-excel"
Response.AppendHeader("Content-Disposition", "attachment; filename=Impresion.xlsx")
Response.Charset = "UTF-8"
Response.ContentEncoding = Encoding.Default
Response.TransmitFile(Server.MapPath("~/Exportacion/boleta.xlsx"))
''Response.TransmitFile("c:\Exportacion\" & "Consolidado" & ".xls")
Response.End()
End Try
lo que hace el codigo anterior es crear un excel a partir de otro que en este caso es una plantilla te puedes dar cuenta por la extencion ".xltx" ahora he hecho esto para que me tome la misma forma que tiene dicha plantilla asi respeta colores, margenes, y cosas por el estilo , depsues de crearlo lo grabo en un una carpeta no importa cual por que para el tema no es el caso, este nuevo archivo se lo paso a traves del response al cliente para que pueda digamos descargarlo....
con esto se concluye la parte programativa... una parte resaltante y la cual si no tienes en cuenta te conllevara a problemas es esta
Libro.Close()
'Libro = Nothing
excel.Workbooks.Close()
excel.Quit()
'excel = Nothing
Marshal.ReleaseComObject(Libro)
Marshal.ReleaseComObject(excel)
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()
'GC.Collect()
'GC.WaitForPendingFinalizers()
este pedazo de codigo sirve para realmente cerrar el proceso de excel y asi no acomular procesos en el servidor y no se te congestione... ok?
luego viene la parte de configuracion ... aqui viene lo bueno...vas a tu archivo web.config y encontraras esta seccion
<compilation debug="true" strict="false" explicit="true"><assemblies><add assembly="Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"/></assemblies>
esta linea referencia a la libreria de interop para que se ensamble a tu pagina para su funcionamiento
porteriormente viene la seccion de<authentication mode="Forms"><forms loginUrl="Mantenimiento/Login.aspx"/></authentication><identity impersonate="true" userName ="usuario" password ="contraseña"/>
aqui se ve el modo de autentificacion con el controlas tu pagina debajo esta el identity y he aqui el truco de todo este asunto he impersonalisado la cuenta que tomara posesion de los recursos que estan en el server y con ella puedes invocar al COM.... ( si tienes problemas con esto pon la cuenta con la que accedes remotamente al servidor para poder configurarlo y de donde puedes ver la pagina)
luego debes seguir estos pasoque el mismo moderador me administro
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Ing. Heinrrich Facho VerasteguiMARCA COMO VALIDA SI TE AYUDO -
creo que me adelante y te deje otro postt pero mas o menos va por el mismo camino te sale este error por que no esta encontrando el archivo que busca.... primero por que tu estas usando un ruta global y no una referenciada como seria mas conveniente ademas las carpetas que referencias debe estan en tu solucion de la pagina mira yo referencio asi
excel.ActiveWorkbook.SaveAs(Server.MapPath("~/Exportacion/boleta.xlsx"))
este es para guardar el excel que estoy manipulando ahora bien con el
Server.MapPath("~/Exportacion/boleta.xlsx")) te retorna un string de la ruta de donde esta actualmente el sistema y fijate que le agregado a eso el "~/Exportacion/boleta.xl" entonces me retornaria toda la ruta mas esa carpeta y el archivo
- Propuesto como respuesta alfonso_tecnicopa miércoles, 7 de mayo de 2014 15:09