Crystal Report動態顯示圖片
引子
水晶報表以其強大的功能占距了強大的開發市場,其列印出的報表美觀、大方,深得用戶喜愛,然而其某些功能上不免有些瑕疵。例如,當資料庫中只存放了圖片的路徑時,當你在設計報表時,卻沒有提供將其列印成圖片的功能。當然,新版本XI R2是有提供這些功能的,然,你總不會因為這個功能就要求你老闆去買最新版的CrystalReport吧? 既然選擇了程式員這一行業,我想沒有最新的工具,我們也能做出漂亮的帶圖片的報表來的。跟我來…
環境
1、VS05 + SQL Server2000 + VS2005自帶的CrystalReport 10.2
2、VS2005 + SQL Server2000 + Crystal Report XI R2(11.5)
索引
1、版本11以下的動態圖片的顯示
1-1、 數據庫中圖片字段的顯示
1-2、 動態顯示字段
1-3、 設計顯示水晶模板
1-4、 編碼獲取水晶數據源
2、版本11以上的動態圖片的顯示
2-1、版本的獲得
2-2、版本的升級
2-3、升級注意事項
內容
1、版本11以下的動態圖片的顯示
1-1、數據庫中圖片字段的顯示
這個其實就是數據庫中某一個字段保存了圖片的二進制流。跟普通的水晶報表設計沒有什么兩樣的。唯一需要註意的是如何將二進制流寫入數據庫中,或如何從數據庫的相關字段中取出來。就可以了。我這里貼出一段讀寫數據庫中二進制字段的代碼出來。讀者朋友們參考自行修改。
Private Sub Button1_Click()Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim bytePws As Byte() = Encoding.UTF8.GetBytes(CryptoFunc.Encrypt("admin"))
Using conn As New SqlConnection("Initial Catalog='Northwind';user id='sa';data source='localhost'")
Using comm As New SqlCommand("Update t set Pws=@Pws", conn)
Dim parameter As SqlParameter = New SqlParameter("@Pws", _
SqlDbType.Binary, _
bytePws.Length, _
ParameterDirection.Input, _
False, 0, 0, Nothing, DataRowVersion.Current, bytePws)
comm.Parameters.Add(parameter)
conn.Open()
comm.ExecuteNonQuery()
End Using
End Using
End Sub
Private Sub Button2_Click()Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Using conn As New SqlConnection("Initial Catalog='Northwind';user id='sa';data source='localhost'")
Using comm As New SqlCommand("Select top 1 * from t ", conn)
Dim adapter As SqlDataAdapter = New SqlDataAdapter(comm)
Dim ds As New DataSet()
adapter.Fill(ds, "t")
Dim bytePws As Byte() = CType(ds.Tables("t").Rows(0)("Pws"), Byte())
Dim str As String = Encoding.UTF8.GetString(bytePws)
str = str.Replace(Chr(0), "")
MessageBox.Show(CryptoFunc.Decrypt(str))
End Using
End Using
End Sub
2-2、動態顯示字段
關於這一點。我們首先應該自定義一個xsd的文件,VS2005操作圖片依次為:
建立完如最后一張圖示的數據后,我們就可以開始設計水晶模板了。
3-3、設計水晶模板,也就是我們常見的水晶報表文件的設計.
這一步注意數據庫專家選新建一個新的連接。如圖示
有了數據源之后,我想你的報表要如何擺放布局,就不需要教了吧。自行調整,我這里為了演示,布局如下
4-4、這可能就是大家關心的地方的。
這里代碼主要是參考后面的后記里的部份代碼,在那篇文章中,只能顯示JPG和BMP格式的文件,制約了部分格式圖片的顯示.而本篇所介紹的圖片是任意格式的均可顯示。先貼最終圖出來。
最后放出代碼
Imports System.IO
Imports System.Data
Imports System.Drawing.Imaging
Public Class Form1Class Form1
Private Sub btnGenerate_Click()Sub btnGenerate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGenerate.Click
Dim crReportDocument As New CrystalReport1
Dim myDataSet As New DataSet
Dim PicPath As String
myDataSet.Tables.Add("Table1")
myDataSet.Tables(0).Columns.Add("LastName", System.Type.GetType("System.String"))
myDataSet.Tables(0).Columns.Add("FirstName", System.Type.GetType("System.String"))
myDataSet.Tables(0).Columns.Add("Photo", System.Type.GetType("System.Byte[]"))
PicPath = tbxPath.Text & "\"
AddOneRow(myDataSet.Tables(0), "Sunnet", "JPG File", PicPath & "Sunset.jpg")
AddOneRow(myDataSet.Tables(0), "Jin", "Gif File", PicPath & "1.gif")
AddOneRow(myDataSet.Tables(0), "Zhang", "Gif File", PicPath & "2.gif")
AddOneRow(myDataSet.Tables(0), "Wang", "JPG File", PicPath & "1.jpg")
AddOneRow(myDataSet.Tables(0), "Liu", "JPG File", PicPath & "2.jpg")
AddOneRow(myDataSet.Tables(0), "VS2005", "BMP File", PicPath & "vs2005.bmp")
crReportDocument.SetDataSource(myDataSet)
CrystalReportViewer1.ReportSource = crReportDocument
End Sub
Private Sub Form1_Load()Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
tbxPath.Text = Directory.GetCurrentDirectory() & "\Pics"
End Sub
Private Sub AddOneRow()Sub AddOneRow(ByRef tbl As DataTable, ByVal c1 As String, ByVal c2 As String, ByVal c3 As String)
Dim row As DataRow
row = tbl.NewRow()
row(0) = c1
row(1) = c2
row(2) = ConvertImage(c3)
tbl.Rows.Add(row)
End Sub
Private Function ConvertImage()Function ConvertImage(ByVal path As String) As Byte()
Dim stream As FileStream = Nothing
Try
stream = File.OpenRead(path)
Return ConvertImage(stream)
Finally
If stream IsNot Nothing Then
stream.Close()
End If
End Try
End Function
Private Function ConvertImage()Function ConvertImage(ByVal stream As Stream) As Byte()
Dim image As Image = image.FromStream(stream)
Dim myImage As Byte() = Nothing
If image.RawFormat.Guid <> ImageFormat.Jpeg.Guid AndAlso image.RawFormat.Guid <> ImageFormat.Bmp.Guid Then
Dim memStream As New MemoryStream()
image.Save(memStream, ImageFormat.Jpeg)
myImage = memStream.GetBuffer()
memStream.Close()
Else
stream.Position = 0
myImage = New Byte(stream.Length) {}
stream.Read(myImage, 0, stream.Length)
End If
Return myImage
End Function
End Class
2、版本11以上的動態圖片的顯示
2-1、版本的獲得
以下兩個鏈接,我不保証長期有效,我也是從網上找的。呵呵…
File 1 - EXE 700MB(http://ftp1.businessobjects.com/webprod/crxi/crxir2sp1/crxir2.part1.exe)*
File 2 - RAR 386MB(http://ftp1.businessobjects.com/webprod/crxi/crxir2sp1/crxir2.part2.rar)*
2-2、版本的升級
安裝完之后,打開VS2005,我們發現版本就變了。
而且我們在11.5版本的水晶文件中,可以利用公式來動態指定圖片的位置的。如圖示:
2-3、升級布署注意事項
我這里主要針對是WEB的,如果是Winform,建立打包的時候,將相關的合并模組打包發布出去。如果不行,請在你的本機C:"Program Files"Microsoft Visual Studio 8"SDK"v2.0"BootStrapper"Packages"CrystalReports下的CrystalRedist115_x86.msi拿到你的服務器上安裝一下。自然,如果是10.2的自帶版本,安裝CrystalRedist_x86.msi就可以了。只是不明白,網上似乎很多朋友說會出錯,我試過,卻是沒有問題的。如果是Web的話,本人建議你的Web.Config如下:
補充
關於水晶報表的兩種模式,pull和push模式,優劣各有,如有興趣,可自行在網站查閱相關文章評論,我這裡隻是記錄一下這兩種模式需要注意的地方:pull模式,由水晶報表自己獲取數據,但需要提供登陸信息。也就是TableLogOnInfo,列舉一下相關的代碼:
private void SetLogOnInfo (string server, string database, string userID, string password, ReportDocument rd)
{
TableLogOnInfo logOnInfo = new TableLogOnInfo ();
logOnInfo.ConnectionInfo.ServerName = server;
logOnInfo.ConnectionInfo.DatabaseName = database;
logOnInfo.ConnectionInfo.UserID = userID;
logOnInfo.ConnectionInfo.Password = password;
foreach(CrystalDecisions.CrystalReports.Engine.Table dt in rd.Database.Tables)
{
dt.ApplyLogOnInfo(logOnInfo);
}
}
Private Sub SetLogOnInfo(ByVal server As String, ByVal database _
String, ByVal userID As String, ByVal password As String, ByVal _
rd As ReportDocument)
Dim logOnInfo As New TableLogOnInfo()
logOnInfo.ConnectionInfo.ServerName = server
logOnInfo.ConnectionInfo.DatabaseName = database
logOnInfo.ConnectionInfo.UserID = userID
logOnInfo.ConnectionInfo.Password = password
For Each dt As CrystalDecisions.CrystalReports.Engine.Table In rd.Database.Tables
dt.ApplyLogOnInfo(logOnInfo)
Next
End Sub
如果報表文件本身帶有參數, 就需要指定這些參數字段的ParameterFieldDefinition對象集及對象和ParameterValue對象集及對象(一般是ParameterDiscreteValue離散值),舉一段VB.NET代碼吧:
Private Sub AddCrystalParameter(ByVal rd As ReportDocument, ByVal strParameterName As String, ByVal strParameterValue As String)
Dim pfds As ParameterFieldDefinitions = rd.DataDefinition.ParameterFields
Dim pfd As ParameterFieldDefinition = pfds(strParameterName)
Dim pvs As ParameterValues = New ParameterValues()
Dim pdv As ParameterDiscreteValue = New ParameterDiscreteValue()
pvs = pfd.CurrentValues
pdv.Value = strParameterValue
pvs.Add(pdv)
pfd.ApplyCurrentValues(pvs)
End Sub
還是提供C#代碼吧,
public void AddCrystalParameter(ReportDocument rd, string strParameterName, string strParameterValue)
{
ParameterFieldDefinitions pfds = rd.DataDefinition.ParameterFields;
ParameterFieldDefinition pfd = pfds(strParameterName);
ParameterValues pvs = new ParameterValues();
ParameterDiscreteValue pdv = new ParameterDiscreteValue();
pvs = pfd.CurrentValues;
pdv.Value = strParameterValue;
pvs.Add(pdv);
pfd.ApplyCurrentValues(pvs);
}
push推模就是程序編程得到一個DataSet,推給報表文件,故名。最後使用SetDataSource給報表文件賦值就可以了,似乎沒有很多要講,但這種個人還是認為值得推薦。
寫到這裡,又發現了一個網上的CrystalHelper的類,貼出地址吧:http://www.cnblogs.com/pccai/articles/895169.html
我自己沒有試過,還有一篇文章,應該是蠻好,隻是頁面顏色不太協調,看著眼睛不舒服,也沒有完全看完,有興趣的可以看看:
http://hi.baidu.com/yaoyan0421/blog/item/cc6bcbcb9d5a8040f31fe756.html
后記
1、文在成形之前,參考了網上阿泰實用主義的<<水晶报表中如何动态加载图片(图片文件版本及数据库版本)>>地址是:http://www.cnblogs.com/babyt/archive/2005/04/21/142789.html
2、余皆原創,轉載請註明來自http://jinliangliu.cnblogs.com/
3、專案源碼下載一http://files.cnblogs.com/jinliangliu/CrytalReport.rar(版本11以下)
4、專案源碼下載二http://files.cnblogs.com/jinliangliu/WebSite1.rar(版本11.5以上)
转载于:https://www.cnblogs.com/jinliangliu/archive/2008/07/17/1245136.html
Crystal Report動態顯示圖片相关推荐
- python display方法_在Python中縮放和顯示圖像的最快方法是什么?
6 The fastest way to display 30x400 data points is to: 顯示30x400數據點的最快方法是: Use OpenGL color arrays If ...
- (原創) 如何讓Linux開機時,不要在圖形介面顯示開機訊息? (OS) (Linux) (CentOS)
Abstract 玩Linux的成就感之一,就是開機時看到每個硬體裝置和服務一個一個顯示[OK],但進入X Window後,一些開機訊息會顯示在圖形介面中,有沒有辦法使用文字模式完整的顯示開機訊息呢? ...
- python batch_size_python 實現動態 batch size,多張圖片如何堆疊轉成指針
前陣子有發問,關於 python 動態 batch size 如何實現,目前解決之前問題 現在遇到的問題是當我把兩張圖片直接用 numpy concat 堆疊在一起 進行 acl.util.numpy ...
- 周志華《機器學習》圖4.4和图4.9繪制(轉載+增加熵顯示功能)
代碼來自參考鏈接: https://blog.csdn.net/leafage_m/article/details/79629074 本文的貢獻是: ①修正參考鏈接中,算法第3種情況中的投票問題的相關 ...
- Lotus Notes 和 Crystal Report 的整合應用
一.寫在前面 跟據 Seagate 網站上的說明,要將 Crystal Report 跟 Lotus Notes 整合, 必須要安裝 Crystal Report 7.x以上版本及 Lotus Dom ...
- php iso8601 gmt,如何使用PHP以iso 8601格式顯示日期
I'm trying to display a datetime from my MySQL database as an iso 8601 formated string with PHP but ...
- Asp.net動態添加控件(转)
項目當中有,要用到動態創建控件,以前在Winform中,容易實現,Web中花了半天的時間學習了一上,現在這里記錄一下:基於asp.net2.0,簡要記錄一下頁面的控件如何動態創建的步驟,同時也記錄一下 ...
- 動態修改SiteMapPath路徑
http://www.purecs.net/Threads/t376.aspx 在網頁上放置一個SiteMapPath可以提供使用者一個清楚的瀏覽路標指示,如果你的SiteMap是靜態不會變動的倒是很 ...
- 建立三層之前,我們需要做什麼;建立中間時,我們需要注意什麼;中間層規則是動態連接的好還是編譯鏈入好.日期:2004-05-18...
<引文1> KeyLife富翁笔记 作者: 多层应用<组28> - aleyn 标题: 三层应用中的中间层设计经验.(内存篇) 关键字: 中间层,内存 分类: 组笔记专 ...
最新文章
- Spring+SpringMvc+Hibernate 框架搭建
- Struts和SpringMVC两种MVC框架比较
- 简单BP网络识别数码表字符
- element-ui表格缩略图悬浮放大
- 执行超时已过期。完成操作之前已超时或服务器未响应。_OMG! 云服务器 CPU 100%了!肿么办?...
- linux 查看磁盘空间_Linux下删点日志也能搞死人
- 《Web前端开发最佳实践》——1.2 Web前端开发现状
- 当程序员那么痛苦,我来告诉你他们为什么还没放弃?
- Axure第11享:Axure汉化方法?
- Kaggle:Tabular Playground Series - May 2021
- 记住看小电影前一定要检查网址是不是 HTTPS 的,不然…
- yum 与pip区别
- mt管理器java_MT管理器
- 【SQL注入】 sql注入中的union和limt关键字的使用解析
- 提交到GitHub错误:src refspec 分支名 does not match any
- Elastic的Workplace Search如何使用Gmail或Google Drive等数据源
- php通过邮箱找回密码,PHP邮件验证找回密码
- 摩拜再裁员:主要面对亚太地区
- 潘建中-632007060420
- Android平台根据分辨率计算屏幕尺寸,基于物理尺寸来验证手机和平板应用合并的可行性
热门文章
- 【kibana】kibana node 监控指标 详解
- 95-50-020-java.nio.channels-NIO-NIO概览
- 【Java】为什么java构造函数的构造器只能在第一行写this() 或者super() ?
- 95-150-080-源码-Sink-StreamingFileSinkBucketingSink
- 【Calcite】SQL 形式化语言——关系代数
- Maven多模块打包遇到的问题详解
- Error:scalac: missing or invalid dependency detected while loading class file ‘RDDOperationScope.cla
- spark学习-72-源代码:Endpoint模型介绍(4)-Spark为何使用Netty通信框架替代Akka
- java判断long 大于0,JAVA的一道习题:找出五个大于Long.MAX_VALUE的素数
- 一套组合拳,打造一款 IDEA 护眼方案