[C#]透過ReportServer提供的WebReference將報表另存成檔案

[SQL Server]透過ReportServer提供的WebReference將報表另存成檔案

前一篇提到使用ReportViewer來將Reporting Service提供的報表轉成檔案輸送到前端,本篇再補一下用ReportServer本身所提供的匯出功能我們可以怎麼做,畢竟如果是商用軟體,我們多數還是會將報表佈署到ReportServer上,一來方便管理,二來系統的穩定程度也會比較好,下方我們分別撰寫Reporting Service2005之前(含2000)的寫法與Reporting Serice2008的做法,其實寫法上與ReportViewer匯出的寫法大同小異,只是Render時呼叫的function有所差別:

Rrporting Service 2000/2005的寫法:

 


/// <summary>
/// 透過ReportServer提供的Web Service來取得報表的Byte[]資料
/// </summary>
/// <param name="pReportServerAddress">ReportServer的位址</param>
/// <param name="pParamReturnValues">開啟報表所需參數</param>
/// <param name="pReportPath">報表路徑</param>
/// <param name="pFileType">轉出型別</param>
/// <returns>報表的Byte[]資料</returns>
public byte[] ExportFileByReportServer2005(string pReportServerAddress, Hashtable pParamReturnValues, string pReportPath, string pFileType)
{
    // 佚代器以尋找 Hashtable 裡的 key 跟 value
    IDictionaryEnumerator tIterator = null;
    // 跑迴圈紀錄索引值的變數		 
    int tIndex = 0;
    // 必要的報表函式參數 , 記錄編碼					 
    string tEncoding;
    // 必要的報表函式參數 , 記錄檔案型態								 
    string tMimeType;
    // 必要的報表函式參數 , 記錄串流的ID						 
    string[] tStreamIds;
    // 回傳報表結果的 byte 陣列				 
    byte[] tResult = null;

    // 報表伺服器變數
    WebReference.ReportingService tReportingService = null;
    // 報表的參數陣列
    WebReference.ReportParameter[] tParams = null;
    // 傳到報表伺服器的參數   
    WebReference.ParameterValue[] tParameterValues = null;
    // 必要的報表函式參數 , 記錄報表參數及值  
    WebReference.ParameterValue[] tParamValues;
    // 必要的報表函式參數 , 記錄警告訊息	    
    WebReference.Warning[] tWarnings;						    
    // 產生報表 Web Service 的物件
    tReportingService = new WebReference.ReportingService();

    tReportingService.Url = "ReportService.asmx";
    // 建立傳入報表的參數陣列
    tParameterValues = new WebReference.ParameterValue[pParamReturnValues.Count];

    // 跑迴圈將傳入的參數與值塞入陣列中
    tIterator = pParamReturnValues.GetEnumerator();

    tIndex = 0;
    //逐一取得參數
    while (tIterator.MoveNext())
    {
        tParameterValues[tIndex] = new WebReference.ParameterValue();
        tParameterValues[tIndex].Name = tIterator.Key.ToString();
        tParameterValues[tIndex].Value = tIterator.Value.ToString();

        tIndex++;
    }

    // 呼叫 Web Service 產生報表的 byte 陣列
    tResult = tReportingService.Render(pReportPath, pFileType, null, null, tParameterValues, null, null, out tEncoding, out tMimeType, out tParamValues, out tWarnings, out tStreamIds);
    return tResult;
}

Reporting Service 2008的寫法:


/// <summary>
/// 透過ReportServer提供的Web Service來取得報表的Byte[]資料
/// </summary>
/// <param name="pReportServerAddress">ReportServer的位址</param>
/// <param name="pParamReturnValues">開啟報表所需參數</param>
/// <param name="pReportPath">報表路徑</param>
/// <param name="pFileType">轉出型別</param>
/// <returns>報表的Byte[]資料</returns>
public byte[] ExportFileByReportServer2008(string pReportServerAddress, Hashtable pParamReturnValues, string pReportPath, string pFileType)
{
    // 佚代器以尋找 Hashtable 裡的 key 跟 value
    IDictionaryEnumerator tIterator = null;
    // 跑迴圈紀錄索引值的變數		 
    int tIndex = 0;
    // 必要的報表函式參數 , 記錄編碼					 
    string tEncoding;
    // 必要的報表函式參數 , 記錄檔案型態								 
    string tMimeType;
    // 必要的報表函式參數 , 記錄串流的ID						 
    string[] tStreamIds;
    // 回傳報表結果的 byte 陣列				 
    byte[] tResult = null;									 

    IDictionaryEnumerator tIterator2 = null;

    // 跑迴圈將傳入的參數與值塞入陣列中                
    tIterator2 = pParamReturnValues.GetEnumerator();

    string tExtension;               
    string tHistoryID = null;        
    string tDevInfo = null;          

    ReportExecutionService tReportingExcutionService2005;
    // 產生報表 Web Service 的物件
    tReportingExcutionService2005 = new ReportExecutionService();
    tReportingExcutionService2005.Credentials = System.Net.CredentialCache.DefaultCredentials;


    // 指定報表 Web Service 的 Url , 如 http://192.168.0.1/ReportServer2008/ReportService.asmx
    tReportingExcutionService2005.Url = tmpReportInfoArray[0] + "/ReportExecution2005.asmx";

    ReportExcutionService.Warning[] tWarnings2005 = null;
    ReportExcutionService.ExecutionInfo tExecInfo = new ReportExcutionService.ExecutionInfo();
    ReportExcutionService.ExecutionHeader tExecHeader = new ReportExcutionService.ExecutionHeader();

    tReportingExcutionService2005.ExecutionHeaderValue = tExecHeader;
    //載入報表檔
    tExecInfo = tReportingExcutionService2005.LoadReport(pReportPath, tHistoryID);

    ReportExcutionService.ParameterValue[] tParameters = new ReportExcutionService.ParameterValue[pParamReturnValues.Count];
    tIndex = 0;
    //逐一取得參數
    while (tIterator2.MoveNext())
    {
        tParameters[tIndex] = new ReportExcutionService.ParameterValue();
        tParameters[tIndex].Name = tIterator2.Key.ToString();
        tParameters[tIndex].Value = tIterator2.Value.ToString();
        tIndex++;
    }

    tReportingExcutionService2005.SetExecutionParameters(tParameters, "en-us");
    tResult = tReportingExcutionService2005.Render(pFileType, tDevInfo, out tExtension, out tEncoding, out tMimeType, out tWarnings2005, out tStreamIds);

    return tResult;
}

以上用到的ReportingExcutionService或者WebReference.ReportingService都是由Reporting Service自動產生的class,你可以自己修改他的namespace並加以利用。

游舒帆 (gipi)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。