none
No es posible guardar Excel abierto por Webbrowser RRS feed

  • Pregunta

  • Hola

    Estoy desarrollando una aplicacion que genera algunos reportes desde una aplicacion web. Para navegar dentro de la aplicacion y las URL, utilizo un control webbrowser. Las URL las tengo en un array ArrURL.

    Los reportes que genera la aplicacion son de dos tipos>

    - Algunos de ellos son descargables directamente, por lo que utilizo My.Computer.Network.DownloadFile() para descargarlos

    - Otros reportes son unos archivos CSV que se abren en el componente webbrowser. El problema que tengo con estos archivos es que no puedo descargarlos desde el mismo control (invocando a .ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT_DONTPROMPTUSER) me arroja un mensaje del formato de los CSV en Excel). He intentado generar una httpwebrequest para estas URL (y asi capturar el CSV en el response), pero tampoco me permite hacerlo, ya que en el response solo tengo un HTML vacio. Al generar la httpwebrequest, le paso los parametros de los headers, los mismos que tienen los CSV generados de forma automatica x la aplicacion (estos parametros los escanee usando la herramienta flidder)

    HTTP/1.0 200 OK
    Server: Microsoft-IIS/5.0
    Date: Tue, 15 Feb 2011 22:10:49 GMT
    X-Powered-By: ASP.NET
    Content-Length: 1308
    Content-Disposition: unspecified; filename="repAprform226_sousaj07.csv"
    Content-Type: unknow/unknow; Charset=UTF-8
    Cache-Control: private
    X-Cache: MISS from Proxy_Chile2_Vespucio
    X-Cache-Lookup: MISS from Proxy_Chile2_Vespucio:3128
    Via: 1.1 Proxy_Chile2_Vespucio:3128 (squid/2.7.STABLE3)
    Connection: keep-alive
    Proxy-Connection: keep-alive

    Aqui va la funcion con la que intento descargar el reporte CSV:

     

    Public Shared Function SaveFileFromURL(ByVal url As String, ByVal destinationFileName As String, ByVal timeoutInSeconds As Integer) As Boolean

    ' Create a web request to the URL
    Dim MyRequest As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
    MyRequest.Timeout = timeoutInSeconds * 1000
    MyRequest.ContentType = "unknow/unknow; Charset=UTF-8"
    MyRequest.Headers.Add("Content-Disposition", "unspecified; filename='repAprform226_sousaj07.csv'")

    Try
    ' Get the web response
    Dim MyResponse As HttpWebResponse = DirectCast(MyRequest.GetResponse(), HttpWebResponse)
    ' Make sure the response is valid
    If HttpStatusCode.OK = MyResponse.StatusCode Then
    ' Open the response stream
    Using MyResponseStream As Stream = MyResponse.GetResponseStream()
    ' Open the destination file
    Using MyFileStream As New FileStream(destinationFileName, FileMode.OpenOrCreate, FileAccess.Write)
    ' Create a 4K buffer to chunk the file
    Dim MyBuffer As Byte() = New Byte(4095) {}
    Dim BytesRead As Integer
    ' Read the chunk of the web response into the buffer
    While 0 < (InlineAssignHelper(BytesRead, MyResponseStream.Read(MyBuffer, 0, MyBuffer.Length)))
    ' Write the chunk from the buffer to the file
    MyFileStream.Write(MyBuffer, 0, BytesRead)
    End While
    End Using
    End Using
    End If
    Catch err As Exception
    Throw New Exception("Error saving file from URL:" + err.Message, err)
    End Try
    Return True
    End Function

     

    Ahora les paso el webbrowser_documentcomplete donde navego entre las distintas URL e intento descargar estos reportes. Aca utilizo la funcion de arriba (con httpwebrequest) y ExecWB, donde ninguna de ellas funciona

     

     
    Private Sub wbReports_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles wbReports.DocumentCompleted
    Try

    Dim fecha As Date = IIf(Weekday(CDate(Now), FirstDayOfWeek.Monday) = 1, CDate(Now).AddDays(-2), CDate(Now).AddDays(-1))
    Dim MFecha As String = CStr(Format(fecha, "yyyy/MM/dd"))
    Dim login As String = AppDomain.CurrentDomain.BaseDirectory & "\usuario.txt"

    Dim Text1 As String = ""
    Dim Text2 As String = ""

    Dim sr As New System.IO.StreamReader(login)
    Text1 = sr.ReadToEnd()
    sr.Close()
    Dim senha As String = AppDomain.CurrentDomain.BaseDirectory & "\contraseña.txt"
    Dim sr1 As New System.IO.StreamReader(senha)
    Text2 = sr1.ReadToEnd()
    sr1.Close()

    Select Case e.Url.AbsoluteUri

    Case arrUrl(0) 'URL Login
    With wbReports.Document
    .All("txtLogin").SetAttribute("Value", Text1)

    .All("txtSenha").SetAttribute("Value", Text2)
    End With
    wbReports.Document.Forms(0).InvokeMember("submit")
    intCount += 1
    Case arrUrl(1) 'URL Main Workflow SiteX
    Application.DoEvents()

    intCount += 1
    arrUrl(intCount) = arrUrl(intCount) & MFecha & "&df=" & MFecha & "&txtObs=&tempo=S&p1=" & MFecha & "&p2=" & MFecha & "&p3=&p4=&p5="
    wbReports.Navigate(arrUrl(intCount))

    Case arrUrl(intCount) 'Descargar reportes
    Dim Documento As HtmlDocument = wbReports.Document
    Dim strFrm As String = ""
    Dim Texto As String = ""
    Dim ListaTexto As New ArrayList
    Application.DoEvents()

    'Rescatar # de formulario para descargar
    strFrm = Mid(arrUrl(intCount), InStr(arrUrl(intCount), "=") + 1, InStr(arrUrl(intCount), "&lst") - InStr(arrUrl(intCount), "=") - 1)

    Select Case strFrm
    Case "form226", "form225", "form227", "form206"

    Dim sPath As String, sPathOrig As String
    Dim res As Boolean = True

    sPath = AppDomain.CurrentDomain.BaseDirectory & "Reportes\Rep" & strFrm & "_" & Text1 & ".csv"

    MFecha = Replace(MFecha, "-", "/")
    url = "http://161.193.117.70/workflow/wkrp010d.asp?codForm=" & strFrm & _
    "&lstUsuario=&txtSolic1=&txtSolic2=&lstStatus=PEN;APR;RET;&lstAprov=&di=" & _
    MFecha & "&df=" & MFecha & "&txtObs=&tempo=&p1=&p2=&p3=&p4=&p5=repApr" & strFrm & "_" & Text1 & ".csv"

    Dim ie As Global.SHDocVw.InternetExplorer = DirectCast(wbReports.ActiveXInstance, Global.SHDocVw.InternetExplorer)
    Dim pvaIn As Object = ""
    Dim pvaOut As Object = Nothing

    'ie.ExecWB(OLECMDID_SAVE, OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, pvaIn, pvaOut)
    ie.ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT) 'Realizar descarga usando una instancia de IE, con ExecWB, no funciona

    ie = Nothing

    Dim odoc As Object
    odoc = wbReports.ActiveXInstance

    odoc.Navigate(url)
    odoc.ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT_DONTPROMPTUSER) 'Realizar descarga usando ExecWB del mismo WebBrowser, no funciona

    'Invocar a funcion para descargar archivo, no funciona
    Dim b as Boolean = SaveFileFromURL(e.Url.AbsoluteUri, sPath)

    Case Else
    'Leer nombre de archivo desde página
    For i As Integer = 0 To Documento.All.Count - 1
    Texto = Documento.All(i).InnerText
    ListaTexto.Add(Texto)
    Next

    Texto = ListaTexto.Item(18).ToString
    'Descargar reporte
    My.Computer.Network.DownloadFile("http://161.193.117.70/workflow/wkrp001d.asp?codForm=" & strFrm & "&arq=" & Texto & "", AppDomain.CurrentDomain.BaseDirectory & "Reportes\" & Texto, Text1, Text2)
    End Select

    'Pasar a siguiente URL
    intCount += 1
    arrUrl(intCount) = arrUrl(intCount) & MFecha & "&df=" & MFecha & "&txtObs=&tempo=S&p1=" & MFecha & "&p2=" & MFecha & "&p3=&p4=&p5="
    wbReports.Navigate(arrUrl(intCount))

    End Select
    Catch ex As Exception
    MsgBox("Ha ocurrido el siguiente error: " & ex.Message)
    End Try
    End Sub

     

    Gracias por la ayuda.

    CL

    • Editado Christian N00b miércoles, 16 de febrero de 2011 14:05 mejora redaccion
    • Cambiado Enrique M. Montejo lunes, 11 de julio de 2011 17:52 desarrollo web (De:Lenguaje VB.NET)
    miércoles, 16 de febrero de 2011 0:20