之前我在隨筆《使用FastReport報表工具生成報表PDF文檔》介紹過使用FastReport.Net來根據報表模板進行生成PDF,以及隨筆《使用FastReport報表工具生成標簽打印文檔》介紹過生成標簽文檔的處理,基本上都是基於模板進行生成PDF的做法,由於PDF在手機端顯示總是覺得不那么方便,不管使用pdfjs或者直接打開PDF,都不太令客戶滿意,客戶希望直接展示圖片的方式顯示。本篇隨筆介紹如何使用FastReport.Net來直接生成報表格式的圖片文件。
1、報表模板及數據綁定處理
FastReport.Net是一款適用於Windows Forms, ASP.NET和MVC框架的功能齊全的報表分析解決方案。之前使用直接生成PDF的方式構建報表文檔,如下效果所示。
在FastReport設計報表模式里面,我們可以對報表進行設置,以便於在實際運行環境的情況下生成上面的報表文檔。在FastReport設計器里面的效果如下所示。
這個報表包含了主表信息,和明細表的信息,我們主表動態信息,可以通過參數的綁定方式綁定,明細表則通過綁定DataTable的方式動態處理即可。
采用參數綁定,我們需要在報表設計器里面定義好我們需要的參數,如下所示。
我們一般預先定義好相關的參數,然后綁定在模板里面,並設置好內容的對其格式即可。
如報表頁面里面,我們放置了一個表格,定義好表格的行列和寬度后,雙擊表格單元格,就可以設置表格單元格的文本內容為對應的參數了,如下界面所示。
對於動態展示的明細列表部分,我們需要定義一個數據源的方式,從而可以讓報表模板綁定對應的字段名稱。
我根據數據表的信息,生成一個用於綁定明細列表的數據源,如下所示。
這樣我們在代碼綁定的時候,只需要指定Detail的名稱和對應的字段名稱即可,有了這些定義,我們可以在報表設計中使用字段綁定了。
對於運行時刻報表數據的綁定,主要使用對應的對象的注冊數據和設置參數處理函數即可實現。
//刷新數據源 report.RegisterData(dt, "Detail"); foreach (string key in dict.Keys) { report.SetParameterValue(key, dict[key]); } //運行報表 report.Prepare(); //導出PDF報表 PDFExport export = new PDFExport(); report.Export(export, realPath); report.Dispose();
2、實現報表生成圖片文檔
圖片生成的處理,和PDF格式的處理大同小異,主要就是先處理數據的綁定和准備,后續在根據對應的文件后綴名進行相應的圖片生成,PDF生成使用PDFExport,圖片生成采用的是ImageExport類處理。
如果是基於Web開發的,我們在控制器上處理對應的報表輸出文件名稱和路徑,如下所示。
//導出PDF的文件路徑 string exportPdfPath = string.Format("/GenerateFiles/Pres/Report_{0}.jpg", id); //轉換為物理路徑 string realPath = Server.MapPath(exportPdfPath);
加載報表模板並初始化,這個不管PDF或者換圖片格式,處理一樣。
//以報表模板,初始化報表對象 Report report = new Report(); report.Load(reportPath);
BS下生成並輸出圖片文件如下所示
//刷新數據源 report.RegisterData(dt, "Detail"); foreach (string key in dict.Keys) { report.SetParameterValue(key, dict[key]); } //運行報表 report.Prepare(); //導出PDF報表 //PDFExport export = new PDFExport(); //導出JPG報表 ImageExport export = new ImageExport(); //export.JpegQuality = 392; //export.ResolutionY = 226; report.Export(export, realPath); report.Dispose(); result = Content(exportPdfPath);//返回Web相對路徑
我們看到,圖片生成的操作和PDF的處理差不多。
最后生成圖片的界面效果如下所示。
如果報表的頁數超過一頁,我們可以通過參數來生成不同的圖片,如下所示。
new ImageExport() { PageRange = PageRange.Current, CurPage = count }
我們來看看另外一個處理代碼,如下所示。
//多個圖片導出 int count = 1; string firstFileName = exportImgPath.Replace(".png", ""); foreach (PageBase item in report.Pages) { string fileName = string.Format("{0}_{1}.png", firstFileName, count); exportImgPath = fileName; report.Export(new ImageExport() { PageRange = PageRange.Current, CurPage = count }, fileName); count++; }
和之前的不同,這個圖片格式指定為PNG,另外可以支持多個頁面的圖片生成。
針對FastReport報表的特性,我在綜合案例里面編寫了一個專門用來處理FastREport的案例代碼,如下所示。