在一些報表模塊中,需要我們根據用戶操作的名稱,來動態根據人員姓名,更新報表的簽名圖片,也就是電子手寫簽名效果,本篇隨筆介紹一下使用FastReport報表動態更新人員簽名圖片。 ...
在一些報表模塊中,需要我們根據用戶操作的名稱,來動態根據人員姓名,更新報表的簽名圖片,也就是電子手寫簽名效果,本篇隨筆介紹一下使用FastReport報表動態更新人員簽名圖片。
1、設計FastReport報表,使用圖片來代替簽名效果
例如我們設計了以上的FastReport報表,其中簽字蓋章哪裡,我們用來圖片組件來承載相關醫生的電子簽名,電子簽名的圖片,根據資料庫記錄的圖片地址,進行生成時刻的替換即可。
報表以PDF的方式生成,手機端利用PDF.js庫可以查看PDF文件。
我們看到以上的簽字圖片,設計的時候用一張預設圖片代替效果,我們切換報表的C#代碼部分,來實現報表簽名的動態更新。
各個部分的圖片替換處理邏輯是一樣的,都是首先根據傳遞的參數名稱,來設置圖片的路徑即可。
2、動態根據資料庫配置的圖片地址,進行參數處理
FastReport報表呈現,可以賦值參數,以及數據源等,我們可以通過再資料庫獲取到圖片信息後賦值給參數名稱,以及數據記錄作為數據源綁定到報表即可,如下是相關的處理代碼。
//定義參數和數據格式 var dict = new Dictionary<string, object>();
然後封裝一個根據醫生名稱,讀取裡面的資料庫圖片地址的函數,如下所示。
/// <summary> /// 獲取醫生的簽名圖片,如果沒有,則返回空圖片文件 /// </summary> /// <param name="doctorName">醫生姓名</param> /// <returns></returns> private string GetDoctorSign(string doctorName) { //轉換為物理路徑 string signImage = "/Report/EmptySign.png"; var signImagePath = Server.MapPath(signImage); if(!string.IsNullOrEmpty(signImage)) { var signInfo = BLLFactory<DoctorSign>.Instance.FindSingle($"DoctorName='{doctorName}'"); if(signInfo != null && !string.IsNullOrEmpty(signInfo.PicturePath)) { signImagePath = signInfo.PicturePath; } } return signImagePath; }
接著就是把這些圖片地址作為對應醫生的參數賦值到字典集合。
//相關醫生簽名圖片 dict.Add("SignChufang", GetDoctorSign(info.ShopDoctor)); dict.Add("SignShenfang", GetDoctorSign(info.CheckPharmacistName)); dict.Add("SignTiaopei", GetDoctorSign(info.Tiaopei)); dict.Add("SignFuhe", GetDoctorSign(info.Fayao));
而處方單的記錄,我們可以構建一個DataTable的數據集合,根據資料庫記錄寫入DataTable賦值即可。
var dt = DataTableHelper.CreateTable("ProductName,Quantity|int,Unit,Specification,HowTo,Frequency,UseAmount");
foreach (var item in detailList) { var dr = dt.NewRow(); var displayName = item.ProductName; if(!string.IsNullOrEmpty(item.Specification)) { displayName += $"({item.Specification})"; } dr["ProductName"] = displayName; dr["Quantity"] = item.Quantity; dr["Unit"] = item.Unit; dr["Specification"] = item.Specification; dr["HowTo"] = item.HowTo; dr["Frequency"] = item.Frequency; dr["UseAmount"] = item.UseAmount; dt.Rows.Add(dr); }
有了參數和數據源,賦值給報表對象進行處理即可,如下代碼。
//刷新數據源 report.RegisterData(dt, "Detail"); foreach (string key in dict.Keys) { report.SetParameterValue(key, dict[key]); } //運行報表 report.Prepare();
最後使用PDFExport生成PDF文件,如下所示。
生成PDF文件,我們在服務端的API介面返迴路徑給pdf.js前端處理顯示。
//導出PDF的相對文件路徑 string exportPdfPath = string.Format("/GenerateFiles/Pres/NewReport_{0}.pdf", id); //轉換為物理路徑 string realPath = Server.MapPath(exportPdfPath); var export = new PDFExport(); report.Export(export, realPath); report.Dispose();
最後報表的H5界面顯示效果如下。
以上就是基於FastReport對報表處理的過程,FastReport還可以用在Winform、Vue的BS端,以及WPF應用程式上,我的博客裡面都有相關的介紹,因此利用FastReport設計的報表,可以重用在多個終端上,非常方便。
專註於代碼生成工具、.Net/.NetCore 框架架構及軟體開發,以及各種Vue.js的前端技術應用。著有Winform開發框架/混合式開發框架、微信開發框架、Bootstrap開發框架、ABP開發框架、SqlSugar開發框架等框架產品。
轉載請註明出處:撰寫人:伍華聰 http://www.iqidi.com