2018年12月28日 星期五

[C# ASP.NET] 不用ReportViewer 控制項, 直接由程式呼叫報表檔(.rdlc)來輸出報表

日前因工作上的要求,得在不能動到前端的配置下, 直接由後端完成輸出報表
上網查詢相關資料,終於寫出下面這方法

需要引用參考 Microsoft.ReportViewer.WinForms, System.Windows.Forms

//方法上要傳入的參數
*報表檔案路徑 StrPath
ex: string StrPath = Path.Combine(Server.MapPath("./"), "Report/PDF.rdlc");

*報表檔中資料來源的名稱 StrDataTableName
 重要: 名稱一定要命名和報表頁面上的資料集名稱一樣,不然會出錯

*要報表輸出的資料(DataTable) DTData

*傳遞報表參數 Dictionary<string,string>
 這邊我是先將(參數組)放到 Dictionary 集合中, 在方法中會再解析出來
ex: Dictionary<string,string> Dict1 =new Dictionary<string,string>();
    //key:參數名稱, value:參數值   
    Dict1.Add("參數1", "值1");
    Dict1.Add("參數2", "值2"); 
  

*報表輸出格式 StrPrtType
 支援  "Excel"、"PDF"、"Word" 和 "Image"

private void RenderReport(string StrPath, string StrDataTableName, DataTable DTData, Dictionary<string,string> DicParam, string StrPrtType)
{
        //宣告本機報表物件
        LocalReport LRpt1= new LocalReport();
        //設定報表檔案路徑
        LRpt1.ReportPath = StrPath;

        //加入報表資料來源
        LRpt1.DataSources.Add(new ReportDataSource(StrDataTableName, DTData));

        //報表上是否能輸出影像
        LRpt1.EnableExternalImages = true;

        //傳遞報表參數
        ReportParameter[] RParam = new ReportParameter[DicParam.Count];

        int i = 0;
        foreach (KeyValuePair<string,string> element in DicParam)
        {
                RParam[i] = new ReportParameter(element.Key, element.Value);
                i++;
        }
   
        LRpt1.SetParameters(RParam);


        //Render (out 參數)
        string StrMime = "";       //(報表的 MIME 類型 ex:如果輸出為PDF,則會傳回 "application/pdf")
        string StrEncode = "";
        string StrExten= "";        //(輸出檔所用的副檔名 ex 如果輸出為PDF,則會傳回 "pdf")
        string[] StrStreamArray;
        Warning[] OWar;            //(紀錄 產生報表時發生的錯誤訊息)

   
        //產生的位元組陣列
        byte[] ByteArray = LRpt1.Render(StrPrtType, null, out StrMime, out StrEncode, out StrExten, out StrStreamArray, out OWar);

        //設定輸出的資料流 Http MIME 類型 (ex: "application/pdf")
        HttpContext.Current.Response.ContentType = StrMime;

        //HTML <head>
        //設定輸出的檔案名稱
        string FileName = "File." + StrExten;
        HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename="+ FileName);

        //設定以 位元組陣列 表示的請求的長度(指的是<body>要輸出的長度)
        HttpContext.Current.Response.AddHeader("Content-Length", ByteArray.Length.ToString());

        //開始輸出到<body>的位元組陣列
        HttpContext.Current.Response.BinaryWrite(ByteArray);
        HttpContext.Current.Response.End();

}


參考:
http://dotnetsoldier.blogspot.com/2008/12/generate-pdf-from-local-report.html


沒有留言:

張貼留言