Von diversen Kunden kam bereits die fachliche Anforderung an mich heran, dass ihre Anwender gerne Daten aus einer SQL Server Datenbank-Tabelle in einer MS Office-Dokument präsentiert haben möchten. Dabei handelt es sich meistens um Word-Dokumente für den Schriftverkehr mit Kunden oder um Excel-Dokumente für statistische Auswertungen.

Nun kann man mit dem OpenXML SDK für diese Szenarien ganz passable Lösungen implementieren, aber mir persönlich kommt das OpenXML SDK oft zu wuchtig vor. Quasi mit Kanonen auf Spatzen schießen!

Auf der Suche nach einer leichtgewichtigen Alternative für OpenXML fiel mir auf, dass viele meiner zu generierenden Dokumente eigentlich einem SSRS-Bericht sehr ähnlich sind. SSRS bietet out-of-thr-box die Möglichkeit einen generierten Bericht in ein anderes Dateiformat zu konvertieren. Und genau an dieser Stelle habe ich angesetzt in der Hoffnung das Konvertierungsfeature automatisiert nutzen zu können.

Das Zauberwort heißt “SSRS execution service”!

 

Mein kleiner Proof of Concept :

Bevor ich den Execution Service in meine finale Lösung integriere, habe ich erst einmal einen schlanke WinForms-Anwendung erstellt, um die Fähigkeiten auf den Prüfstand zu stellen. Dieser nachfolgend dargestellte PoC kommt mit wenig Einstellungen aus. Erforderlich ist lediglich die URL des Service, der Name des Berichts, der Dateipfad für den Download und das gewünschte Zielformat.

image

Nach dem Klick auf die Schaltfläche „Go!“ und einer Erfolgsmeldung kann das generierte und gespeicherte Dokument geöffnet werden. (In einer Webanwendung kann das generierte Dokument über den Response-Stream zum Download angeboten werden!)

image

Der Quellcode des PoCs ist recht übersichtlich und kann somit komfortable in andere Projekte überführt werden.  .csharpcode, .csharpcode pre
{
font-size: 13.3333px;
font-width: 400;
color: black;
font-family: „Courier New“;
}
.csharpcode pre { margin: 0px; }
.csharpcode .comment { color: #008000; }
.csharpcode .comment2 { color: #808080; }
.csharpcode .type { color: #2b91af; }
.csharpcode .keyword { color: #0000ff; }
.csharpcode .string { color: #a31515; }
.csharpcode .preproc { color: #0000ff; }

Code:

Imports SSRS_Downloader.SsrsReportingService
Imports System.Web.Services.Protocols
Imports System.IO
Imports System

Public Class Form1

    Public Property ReportPath As String
    Public Property Parameters As IEnumerable(Of ParameterValue)
    Public Property OutputFormat As ExportFormat

    Private Sub ButtonDownload_Click(sender As Object, e As EventArgs) Handles ButtonDownload.Click

        Dim rs = New ReportExecutionService()
        rs.Url = TbReportingServiceText
        rs.Credentials = Net.CredentialCache.DefaultCredentials
        Dim devinfo = "<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>"

        ReportPath = TbReportPath.Text
        Dim FilePath = TbSaveFilePathText

        Dim historyID As String = Nothing
        Dim warnings As Warning() = Nothing

        Dim showHideToggle As String = Nothing
        Dim reportHistoryParameters As ParameterValue() = Nothing
        Dim streamIDs As String() = Nothing

        Dim parameters As ParameterValue() = New ParameterValue(3) {}
        'parameters(0) = New ParameterValue()
        'parameters(0).Name = "EmpID"
        'parameters(0).Value = "288"

        ' Out Parameters
        Dim mimeType, encoding As String

        Dim result As Byte() = Nothing
        Try
            rs.LoadReport(ReportPath, Nothing)
            rs.SetExecutionParameters(parameters.ToArray(), "de")
            result = rs.Render(GetSsrsExportStringValue(OutputFormat), devinfo, Nothing, mimeType, encoding, warnings, streamIDs)
            'ToDo: Check mimType and warnings 
        Catch ex As SoapException
            ' ToDo: Logging error due to saving file faild
            MessageBox.Show("Error: Receiving converted report faild!")
        End Try
        ' ToDo: Logging error due to failing conversion
        Try
            Using stream As FileStream = File.Create(FilePath, result.Length)
                'Console.WriteLine("File created.");
                stream.Write(result, 0, result.Length)
                'Console.WriteLine("Result written to the file.")
                stream.Close()
            End Using
            MessageBox.Show("Resport successfully converted and saved.")
        Catch ex As Exception
            ' ToDo: Logging error due to saving file faild
            MessageBox.Show("Error: Saving file faild!")
        End Try
    End Sub

    Public Overridable Function GetSsrsExportStringValue(exportType As ExportFormat)
        Select Case exportType
            Case ExportFormat.XML
                Return "XML"
            Case ExportFormat.CSV
                Return "CSV"
            Case ExportFormat.Image
                Return "IMAGE"
            Case ExportFormat.PDF
                Return "PDF"
            Case ExportFormat.MHTML
                Return "MHTML"
            Case ExportFormat.HTML4
                Return "HTML4.0"
            Case ExportFormat.HTML32
                Return "HTML3.2"
            Case ExportFormat.Excel
                Return "EXCEL"
            Case ExportFormat.Word
                Return "WORD"
            Case Else
                Return "PDF"
        End Select
    End Function

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim formats As String() = [Enum].GetNames(GetType(ExportFormat))
        ComboBoxFormat.DataSource = formats
    End Sub

    Private Sub ComboBoxFormat_SelectedValueChanged(sender As Object, e As EventArgs) Handles ComboBoxFormat.SelectedValueChanged
        OutputFormat = [Enum].Parse(GetType(ExportFormat), ComboBoxFormat.SelectedValue)
    End Sub
End Class

 

Unterm Strich eine sehr charmante Lösung, um leichtgewichtige Dokumentengenerierung umzusetzen. Bei Richtexten etc. kommt SSRS natürlich an seine Grenzen, aber für schlichte Informationen ist es ideal.

Erfreulicherweise kann ein SSRS-Bericht von außen mit Parametern bestückt werden. So kann man bspw. dem Bericht die ID eines darzustellenden Datensatzes übergeben.

Die 2012 Version des SQL Server unterstütz mittleiweil auch das DOCX-Dateiformat von Haus aus. Für den 2008er gibt es allerdings eine Rendering Exetension  auf CodePlex (http://ssrsword2007render.codeplex.com/)

1 Comments

  1. Pingback: SSRS – Templating Engine - SharePoint Blogs in German - Bamboo Nation

Leave a comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload the CAPTCHA.