阿泰的软件实用主义

水晶报表/BOE 第3季 Only 2008.5 [万众一心,众志成城]

博客园 首页 新随笔 联系 订阅 管理
  137 Posts :: 9 Stories :: 1613 Comments :: 15 Trackbacks

现有报表项目中,一般有把报表导出成Excel的要求
而对于水晶报表来说,虽然带了导出Excel的功能,但是能导出一个能用的excel表格却不容易
因为很容易就会出现跨行跨列的情况,默认导出是没有格线的,手工(或者导出时选了格线)加上格线后,会显得很难看
最主要的是没法直接在上面用,这给报表的再处理也带来了很大的不便。

很长一段时间以来,我一直是这么认为的,但是实际上,这是可以实现的。(非常感谢IBM的周勇)

我们一般做格子状的显示,都是用大框加线条或者单纯线条来做的,其实只要换个方式,用字段的边框来实现就可以了。
先来看一下最终效果


需要说明的是,这个表格导出的时候,是没有选择“显示网格线”的


以上制作方法同样适用于infoview/web方式地导出。

我做了个操作视频,所以这里只是简单地说明一下。
把要使用的字段全划拉上,右键,格式化,选边框


注意,不是把字段的四个边全选上,比如在本例中,对于页眉上的几个表头字段,使用了左上下三边,最右边一个字段多了个右边
这是因为前一个字段把后一个字段的左边框作为自己的右边框了
同样的,对于详细资料节上的字段,只用左下两个边,最右边的加一个右边框即可
这样详细资料节的每行的下边沿作为下一行的上边沿,对于第一行来说,它使用页眉上那一行的下边沿作为自己的上边沿

比较绕口,呵呵,不过做几次就熟悉了。

以下为视频文件及模板(本文附带了一个按条件更改背景色的效果,是为了解决另外一个网友的问题,不是必须的)
http://files.cnblogs.com/babyt/CR2008040401.rar
解压缩密码为:babyt

鉴于本文中的评论很多已经脱离主题,所以关闭该文章的评论权限

posted on 2008-04-04 13:42 阿泰 阅读(731) 评论(16)  编辑 收藏 所属分类: CR报表设计

Feedback

這個方法不錯!
不過,當某些字段有Null值的時候,可能會出問題,就是少一個小方格。
可以考慮用IsNull(,)函數先處理下。
  回复  引用    

#2楼 [楼主] 2008-04-05 11:07 阿泰      
@rockyvan

多谢你的补充,呵呵~~ Null的情况确实需要特别处理一下
  回复  引用  查看    

#3楼  2008-04-07 11:39 songyg510 [未注册用户]
你好.啊泰.水晶报表中如何才能实现每行的行高是根据字段的高度自动调整的
  回复  引用    

#4楼 [楼主] 2008-04-07 11:53 阿泰      
@songyg510

字段上点右键,格式化字段,把里面的“可以扩大”勾选上
  回复  引用  查看    

#5楼  2008-04-07 12:03 songyg510 [未注册用户]
谢了。还有个问题,就是我现在做个报表需要一起打印出所有的页面,但每个页面都是独立的数据源,我想用子报表来完成,但子报表又不能在新的页面上生成(另外就是自己写他的分页来弄,但这样太麻烦了)。有没有别的方法来解决.
  回复  引用    

#6楼 [楼主] 2008-04-07 13:03 阿泰      
@songyg510

子报表的限制就如你所说,似乎没有其他的好办法了~~
  回复  引用  查看    

#7楼  2008-04-07 17:04 songyg510 [未注册用户]
如果我只要控制其中的一个主报表最后一页的行数,把最后一页的行数填满,那子报表就会被自动挤到第2页了.子报表中也能用同理的方法了。这个具体要怎么做,我就不知道了。麻烦啊泰给详细解释下。最好给点例子.可以的话发到我邮箱
song_yg@163.com 谢谢了
  回复  引用    

#8楼  2008-04-08 10:36 songyg510 [未注册用户]
设置文本对象格式能不能设置他的上下格式的居中,里面只可以设置左右格式的居中
  回复  引用    

#9楼  2008-04-08 13:36 songyg510 [未注册用户]
@阿泰

在文本对象格式上设置 可以扩大 里面的文本是可以自动换了,但不能把行给挤大,字会超出下边的线..能不能设置了直接把行挤大
  回复  引用    

#10楼 [楼主] 2008-04-08 13:49 阿泰      
@songyg510

7楼的问题:我没看明白
8楼的问题:如果你是WEB方式的话,可以通过设置字段的CSS来实现
9楼的问题:横向上不可以自动扩大
  回复  引用  查看    

#11楼  2008-04-08 17:04 songyg510 [未注册用户]
@阿泰

7楼 问题 假如子报表中有N条数据,能不能只控制最后一页上行数的显示数量(假如显示12条就建新页面,不足12填充到12建新页)
  回复  引用    

#12楼 [楼主] 2008-04-08 17:14 阿泰      
@songyg510


11楼:

假设一共有N条记录,要保证最后一页上有12行数据,就要在N-12上做控制

详细资料节上,后面页新建页

Recordnumber mod (count({字段})-12)=0
  回复  引用  查看    

#13楼  2008-04-08 17:36 songyg510 [未注册用户]
OnLastRecord

是不是判断整个报表的最后一条记录,还是每一页的最后记录
  回复  引用    

#14楼 [楼主] 2008-04-08 17:39 阿泰      
@songyg510

整个报表的最后一条

  回复  引用  查看    

#15楼  2008-04-10 17:13 songyg510 [未注册用户]
现在遇到一个棘手的问题.
一张报表中有多个数据源(我是用存储过程做数据源),多个数据源无联系,要怎么才能融合到一张报表中,直接绑定后会出现无数据显示 或 有多少条数据就显示多撒页.(注:这张报表中是需要数据的唯一性,只能有一条数据来对应)
  回复  引用    

#16楼  2008-04-10 17:25 songyg510 [未注册用户]
为什么这样写会出现页面第一次加载时候不用填写登陆信息,但点了翻页就需要输入登陆信息,才能浏览....

private void EnPluralityReport() //打印企业外聘人员
{
oRpt = new ReportDocument();
oRpt.Load(Server.MapPath("EnterprisePluralityPersonnelReport.rpt"));
SetDBLogonForReport(oRpt);
oRpt.SetParameterValue(0, "001");
this.EnterpriseAllInfoViewer.ReportSource = oRpt;
this.EnterpriseAllInfoViewer.DataBind();
}


private void SetDBLogonForReport(ReportDocument reportDocument)
{
string ConString = null;

ConString = ExecuteMessage.GetDefaultContenxtString();

ConnectionInfo connectionInfo = new ConnectionInfo();
connectionInfo.ServerName = ConString.Split(new string[] { "data source", "=", ";" }, StringSplitOptions.RemoveEmptyEntries)[0];
connectionInfo.DatabaseName = ConString.Split(new string[] { "Initial Catalog", "=", ";" }, StringSplitOptions.RemoveEmptyEntries)[2];
connectionInfo.UserID = ConString.Split(new string[] { "User ID", "=", ";" }, StringSplitOptions.RemoveEmptyEntries)[4];
connectionInfo.Password = ConString.Split(new string[] { "Password", "=", ";" }, StringSplitOptions.RemoveEmptyEntries)[6];

Tables tables = reportDocument.Database.Tables;
foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
{
TableLogOnInfo tableLogonInfo = table.LogOnInfo;
tableLogonInfo.ConnectionInfo = connectionInfo;
table.ApplyLogOnInfo(tableLogonInfo);
}
}
  回复  引用