又遇到了在B/S系統中打印,打印格式要求比較高,打印出的效果要求高大上。用VS2013中微軟自帶的報表,實在難以實現應用的效果,主要問題表現在:
1.不能插入用Word做好的打印模板,自己按照模板來做感覺比較費事,實現不了Word的打印效果,一旦打印模板改變,調整格式比較麻煩。
2.在火狐、谷歌瀏覽器中打印按鈕不顯示。
想試試水晶報表,無奈VS2013中已經不集成該報表了。需要單獨下載安裝http://scn.sap.com/docs/DOC-7824。大家可以根據自己的VS版本下載合適的水晶報表插件。但是一定要注意下載exe可安裝文件,而不是msi安裝文件,否則VS里面找不到添加水晶報表的項。即下圖中紅色方框內的說明。同時也要下載一個clickonce32/64,在服務器部署是需要。
安裝好之后,在VS的新建項中發現了熟悉的Crystal Reports如下圖:
在詳細資料處【右鍵】--【插入】--【OLE對象】--【由文件創建】選中要打印的模板。拖動鼠標,放置。
在字段資源管理器中【參數字段】--【右鍵】--【新建參數】。
把參數拖放到要動態獲取數據的地方。
新建Web窗體,拖放CrystalReportViewer控件,設置相關屬性。其中如果不需要左側的組樹,需要設置ToolPanelView=“None”。這是與當時在VS2008中用水晶報表不同的地方。
在頁面后台代碼動態設置字段值。如下:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { ReportDocument testReport = new ReportDocument(); //取到報表文件物理路徑 string reportPath = Server.MapPath("~/CrystalReport1.rpt"); //加載報表文件 testReport.Load(reportPath); this.CrystalReportViewer1.ReportSource = testReport; ParameterFields pfs = new ParameterFields(); ParameterField pf = new ParameterField(); ParameterDiscreteValue pv = new ParameterDiscreteValue(); pf.ParameterFieldName = "SQR"; pv.Value = "一衣孤行"; pf.CurrentValues.Add(pv); pfs.Add(pf); this.CrystalReportViewer1.ParameterFieldInfo = pfs; } }
在VS中運行調試,打印模板不見了,只有“圖像”二字,結果如下:
右鍵圖片屬性,看到圖片的路徑是:http://localhost:/CrystalImageHandler.aspx?dynamicimage=cr_tmp_image_3ab921d0-cd7d-4fb9-a724-fd12c580b18d.png。問題是我的項目中也沒有CrystalImageHandler.aspx啊。新增空白CrystalImageHandler.aspx頁面。重新運行,OK。效果如下:
在IIS中發布。首先出現如下錯誤:
未能加載文件或程序集“log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304”或它的某一個依賴項。系統找不到指定的文件。
問題是我也沒用到log4net啊。按照網上的方法把C:\Windows\assembly\GAC_32\log4net\1.2.10.0__692fbea5521e1304\log4net.dll (不同的版本log4net的版本可能不同,可以用dos命令符在C:\Windows\assembly文件夾下用dir命令逐級找到)copy出來,放到部署之后的程序bin文件夾下。刷新頁面,出現如下錯誤:
未能加載文件或程序集“log4net”或它的某一個依賴項。試圖加載格式不正確的程序。
這個錯誤很熟悉吧,64位操作系統IIS應用程序池未啟用32位應用程序,設為True。刷新頁面,出現如下錯誤:
不支持的操作。無法在 C++ 堆棧中打開由 JRC 引擎處理的文檔。
發現在發布的時候VS不會把rpt文件發布過來,直接把rpt拷貝過來。刷新頁面,OK了。






