【原创】为你的水晶报表加载本地图片

阿泰 2009-05-26 08:08:09
加精
本文为解答该贴所做:http://topic.csdn.net/u/20090524/15/911fd15a-32c6-4be9-9aa1-3ee95365e7e3.html 

并没有什么新内容,主要是如何读取本地图片显示在报表中。

如果是CR XI及以上版本,可以用更简便的方法,参考:水晶报表图片动态加载的另一种简单方案

本文的方法是:水晶报表中如何动态加载图片(图片文件版本及数据库版本) 中的图片文件版本。

本文适用于VS2003及VS2005自带版本的水晶报表,当然同样适用于CR XI及以上版本,就是烦了点。

本文使用VS2005及自带版本的水晶报表。



在这里,我把命题重新提炼一下:

已经有一个完整的报表,现在报表需要加载一个本地磁盘图片做为logo。报表中的logo随着本地图片的变化自动变化。

一般我们通过插入一个pictureobject来插入磁盘图片,但是插入后,图片就成为报表的一份,达不到变化的目的。
1:首先我们已经有了一个单表的完整水晶报表应用





2:为了能挂接我们的本地图片,在dataset里新建立一个表mylogo。

里面放上两个字段,字段类型为System.Byte[]或System.sByte[]

注意,默认类型里只有System.Byte和System.SByte,要自己输入的。
这个mylogo就是一个中介,我们把本地图片读到这个表里,水晶报表从这个表里读到图片显示。

3:在现有报表里加入一个子报表,数据源就是这个mylogo.



把两个字段拖到子报表上。


4:代码段是这样的

//设置数据源信息
DataSet1 ds1 = new DataSet1();
OleDbDataAdapter da = new OleDbDataAdapter();
String connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath ("~/app_data/test.mdb")+";";
OleDbConnection cn = new OleDbConnection(connstr);


//获取记录集,注意,最终获取的记录集需要与xsd的结构一致!
da = new OleDbDataAdapter("SELECT EmployeeId1 as EmployeeId,EmployeeName1 as EmployeeName From Employee1", cn);
da.Fill(ds1, "Employee");

//把本地图片先写入到数据集

//将图片读到stream,并转换为byte[]
//图片1
FileStream fs1 = new FileStream(@"c:\1.bmp", FileMode.Open, FileAccess.Read);
BinaryReader br1 = new BinaryReader(fs1);
byte[] bt1 = br1.ReadBytes((int)fs1.Length);
//图片2
FileStream fs2 = new FileStream(@"c:\a2.jpg", FileMode.Open, FileAccess.Read);
BinaryReader br2 = new BinaryReader(fs2);
byte[] bt2 = br2.ReadBytes((int)fs2.Length);

fs1.Close();
fs2.Close();
//写入到ds1中(仅1行)
ds1.myLogo.AddmyLogoRow(bt1, bt2);


//以上为数据部分,与报表无关
//-----------------------------------------------------------
//以下为报表部分

//使用报表对象加载报表

string reportPath = Server.MapPath("~/app_data/crystalreport1.rpt");
myReport.Load(reportPath);
//绑定数据集,注意,一个报表用一个数据集。
myReport.SetDataSource(ds1);
CrystalReportViewer1.ReportSource = myReport;

5:效果是这样的

...全文
3298 51 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
waddan 2011-07-18
  • 打赏
  • 举报
回复
/// <summary>
/// 返回图片的字节数组
/// </summary>
/// <param name="strFilePath">文件路径</param>
/// <returns></returns>
protected System.Byte[] getBinaryArray(string strFilePath)
{
string smaplefilepath = string.Empty;
System.Byte[] img = null;
if (strFilePath != "" && strFilePath != null)
{
smaplefilepath = Server.MapPath(strFilePath);
}
else
{
return img;
}
FileStream fs = new FileStream(smaplefilepath, FileMode.Open, FileAccess.Read, FileShare.Read);
BinaryReader br = new BinaryReader(fs);
img = br.ReadBytes((int)br.BaseStream.Length);
fs.Close();
br.Close();

return img;
}

我寫了一個方法,但返回的值直接傳給image字段,在SQL數據庫中是binary(2000)類型的,
ds.Tables[0].Rows[0]["image"] = getBinaryArray(ds.Tables[0].Rows[0]["picture"].ToString());
為什么顯示不出圖片
qwertyuioplm 2010-06-17
  • 打赏
  • 举报
回复
我想请问一下,在水晶报表里面动态加载图片了,但是我想限定一个大小,比如宽度是8,长度是5,如果图片比这个限定小的话,让它按图片大小正常显示,如果图片比这个限定大的话,让他按这个限定缩放显示,有没有这样的功能了?谢谢!
liuyu520hong 2010-01-15
  • 打赏
  • 举报
回复
阿泰,可以加我QQ吗?我QQ是470442417,目前正在做水晶报表,遇到问题了,想私下请教一下,可以吗?
jenny0810 2009-08-08
  • 打赏
  • 举报
回复
学习
QQ376971729 2009-06-10
  • 打赏
  • 举报
回复
学习!
leihentulong 2009-06-10
  • 打赏
  • 举报
回复
备用
FaxLovers 2009-06-09
  • 打赏
  • 举报
回复
中国人自己的 opensource Fax Server http://www.zhengdus.com/
ChinaITOldMan 2009-06-02
  • 打赏
  • 举报
回复
learn
手抓饼加辣 2009-05-30
  • 打赏
  • 举报
回复
路过
xuzysun 2009-05-30
  • 打赏
  • 举报
回复
学习一下!
bowlingljf 2009-05-28
  • 打赏
  • 举报
回复
学习了
longshi33 2009-05-27
  • 打赏
  • 举报
回复
在学习
saddemon 2009-05-27
  • 打赏
  • 举报
回复
怎么得到积分?
mengxj85 2009-05-27
  • 打赏
  • 举报
回复
收藏
lwkua1888 2009-05-27
  • 打赏
  • 举报
回复
...........................
dj7456 2009-05-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 babyt 的帖子:]
本文为解答该贴所做:http://topic.csdn.net/u/20090524/15/911fd15a-32c6-4be9-9aa1-3ee95365e7e3.html 

并没有什么新内容,主要是如何读取本地图片显示在报表中。

如果是CR XI及以上版本,可以用更简便的方法,参考:水晶报表图片动态加载的另一种简单方案

本文的方法是:水晶报表中如何动态加载图片(图片文件版本及数据库版本) 中的图片文件版本。

本文适用于VS2003及VS2005自带版本的水晶报表,当然同…
[/Quote]顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
快乐无边 2009-05-27
  • 打赏
  • 举报
回复
ds1.myLogo.AddmyLogoRow(bt1, bt2);
这个己经成功,为什么在页面显示不出来。
快乐无边 2009-05-27
  • 打赏
  • 举报
回复
对,是这样的。
lclichao2006 2009-05-27
  • 打赏
  • 举报
回复
太强了,偶像啊
阿泰 2009-05-27
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 ajaxchen_615 的回复:]
“dsJob.MyLogoDataTable.AddMyLogoRow(byte, sbyte)”最匹配的重载方法具有一些无效参数
dsjob.MyLogo.AddMyLogoRow(bt1,bt2);
[/Quote]

定义字段类型的时候,应该定义成byte[],而不是byte
加载更多回复(29)

4,819

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧