none
Problema al generar achivo excel - Excepción de HRESULT: 0x800A03EC RRS feed

  • 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 error

     

    Error 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.

    jueves, 15 de octubre de 2009 15:01

Respuestas

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
    jueves, 15 de octubre de 2009 16:43
  • hola leandro
    ya tenia agregado ese tag.... aun no logro solucionar el problema.. pense q era porque el archivo ya se encontraba abierto en el servidor pero probe cerrando y tampoco funciono...

    saludos
    jueves, 15 de octubre de 2009 16:58
  • 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
    jueves, 15 de octubre de 2009 17:06
  • 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...

    jueves, 15 de octubre de 2009 17:50
  • deberia cambiar el post a la seccion de asp?
    jueves, 15 de octubre de 2009 17:52
  • 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
    jueves, 15 de octubre de 2009 20:11
  • 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 paso
    que el mismo moderador me administro

    ---------------------------------------------------------------------------------------------------------------
    ---------------------------------------------------------------------------------------------------------------
    Ing. Heinrrich Facho Verastegui
    MARCA COMO VALIDA SI TE AYUDO
    jueves, 17 de marzo de 2011 22:04
  • 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


    jueves, 17 de marzo de 2011 22:09