2009-10-30 11 views
4

J'ai un rapport que je dois exécuter plusieurs fois et enregistrer au format PDF. Je génère actuellement le rapport sous forme de fichier PDF, mais je veux enregistrer les rapports sans que l'utilisateur doive choisir l'option de sauvegarde manuellement à chaque fois.Enregistrer les rapports RDLC en tant que PDF par programme

Le code que j'utilise pour rendre un seul rapport en format PDF est:

Dim warnings As Microsoft.Reporting.WebForms.Warning() = Nothing 

    Dim streamids As String() = Nothing 

    Dim mimeType As String = Nothing 

    Dim encoding As String = Nothing 

    Dim extension As String = Nothing 

    Dim deviceInfo As String 

    Dim bytes As Byte() 

    Dim lr As New Microsoft.Reporting.WebForms.LocalReport 

    deviceInfo = "<DeviceInfo><SimplePageHeaders>True</SimplePageHeaders></DeviceInfo>" 

    bytes = ReportViewer1.LocalReport.Render("PDF", deviceInfo, mimeType, encoding, extension, streamids, warnings) 

    Response.ClearContent() 

    Response.ClearHeaders() 

    Response.ContentType = "application/pdf" 

    Response.BinaryWrite(bytes) 

    Response.Flush() 

    Response.Close() 

je pouvais courir Figuring je dans une boucle et enregistrer le PDF chaque fois.

+0

avez-vous essayé avec ** ** FileStream et obtenir une solution? – Kiquenet

Répondre

6

Quelle est votre question ici? Est-ce que ça ne marche pas?

Voici un exemple de ce que nous avons fait en 2005. Nous avons défini un contrôle appelé rptViewer1 qui peut être visible ou non selon vos besoins. strFormat devrait contenir "PDF" et strNomFicher le chemin complet.

BTW les noms de variables et fonctions sont en français, mais cela fonctionne de toute façon :)

 

    Public Sub CreerFichierRapport(ByVal strNomFichier As String, ByVal strFormat As String) 
     Dim bytes() As Byte 
     Dim strDeviceInfo As String = "" 
     Dim strMimeType As String = "" 
     Dim strEncoding As String = "" 
     Dim strExtension As String = "" 
     Dim strStreams() As String 
     Dim warnings() As Warning 
     Dim oFileStream As FileStream 
     _stream = New List(Of Stream) 
     Try 
      bytes = rptViewer1.LocalReport.Render(strFormat, strDeviceInfo, strMimeType, strEncoding, strExtension, strStreams, warnings) 

      oFileStream = New FileStream(strNomFichier, FileMode.Create) 
      oFileStream.Write(bytes, 0, bytes.Length) 
      _stream.Add(oFileStream) 
     Finally 
      If Not IsNothing(oFileStream) Then 
       oFileStream.Close() 
       oFileStream.Dispose() 
      End If 
     End Try 
    End Sub 

+0

J'ai besoin d'envoyer au client dans 'Response' le rapport comme *** application/pdf et application/vnd.ms-excel *** en utilisant *** bytes array *** avec' HttpContext.Current.Response.BinaryWrite (renderedBytes) '. Est-il possible ou _J'ai besoin d'enregistrer le fichier sur le disque d'abord, puis d'envoyer au client? _ – Kiquenet

+0

Qu'est-ce que la variable *** _ stream ***? statique en classe? – Kiquenet

5

La réponse de David a été très utile pour moi. Je pensais que je publierais mon simplifiée et (un peu) version traduite de ce code, car l'original contenait un peu de français, et aussi quelques références qui ne sont pas pertinentes:

Imports Microsoft.Reporting.WebForms 
Imports System.IO 

Public Class RenderToPDF 
    Public Sub Save(ByVal viewer As ReportViewer, ByVal savePath As String) 
     Dim Bytes() As Byte = viewer.LocalReport.Render("PDF", "", Nothing, Nothing, Nothing, Nothing, Nothing) 

     Using Stream As New FileStream(savePath, FileMode.Create) 
      Stream.Write(Bytes, 0, Bytes.Length) 
     End Using 
    End Sub 
End Class 
+0

J'utilise *** bytes array *** avec 'HttpContext.Current.Response.BinaryWrite (renderedBytes)' mais parfois je reçois ** exception ** _OutOfMemory_ Peut-être d'abord sauvegarder le fichier sur le système de fichiers dans ASP.NET Server? – Kiquenet

Questions connexes