[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堂課》,為培養台灣未來的領袖而努力。 |