1. 程式人生 > >使用FastReport報表工具生成圖片格式文件

使用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的案例程式碼,如下所示。