使用FastReport報表工具生成圖片格式文件
之前我在隨筆《使用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的案例程式碼,如下所示。