【水晶报表内功心法】--完美Excel(上)
但是:
1: Web项目导出时没这个项目,只在Winform下有
2:用户是不会愿意去做这个事情的
下面的方法,是基于字段的边框来实现的,不是线条和框。本篇的目标是实现将报表导出到Excel后,显示成这样一个效果
第一步:基本操作方法
准备一个空的报表
把几个字段拖上去
为了便于精细操作,我们把模板放大一点。
视图-缩放,选一个150%

这样我们的模板就放大了,注意字段和字段之间是有间隙的(当然,不用放大也看得到,呵呵)
大家注意点这个图上有很多小点,这个就是报表的操作精度。
为了精细操作,设置这个精度小一点
进入如下菜单项目,
设置最小单位为0.1,当然还能再小,不过太小了反而操作起来更困难
然后我们再看,那个小点之间的间距明显变小了
保持第1个字段不动,点第2个,平行左移,不要太用力,很容易就拉到前一个字段的右边沿了。
做多了,就会有手感。一拉就行了。表头上的文本也会跟着动
依次操作完后,效果是这样的,注意,两个字段之间的间隙已经没有了
下面简单讲解一下一些简单的操作机器
横线字段的对齐,选中要对齐的字段(可以划拉一下选中,或者是Ctrl选),在其中一个上点右键,可以设置对齐方式和大小比例

纵向字段操作也是类似

好了完成了第一步。
第二步:加格线
选中表头上的所有字段,在其中一个上点右键,格式化多个对象
在出来的界面上,切换到模板标签页,设置边框线。为了方便描述,我就简称为:上下右
也就是上边下边和右边框有边线。
出来的效果如下,左边第一个字段有个小缺口
,补一下。
在第一个字段上点右键,格式化对象,在边框标签页上,设置左边框为单线,其余不要动.
然后选中详细资料节上的字段,设置边线为:下右(下边沿和右边沿单线),
再把第一个字段补一个左边沿单线,出来如下效果。

大功告成,预览一下
导出来看看,注意选第一个XLS格式
如果出来这个界面,不要管,点确定然后继续
看一下效果吧
看这效果我来具体说一下原理。
竖线的部分我就不讲了,单独讲讲横线的为什么这么设。
我们知道页眉是每页固定的,每页只出现一次因为我们设置了上下边框都是横线。那么他的下边沿就是显示为一条横线,仅贴在页眉的下边沿。
而我们在设置详细资料节的时候,设置了下边沿。因为详细资料节是循环的,于是每行的下边沿又刚好是下一行的上边沿。
只有第一条记录上边沿是没有的,而刚好页眉下边沿的线就成为这条记录的上边沿。
所以整个数据就闭合起来了。
第三步:稍微完善一下
左边空出来一列?再改进一下吧。
进入模板,把所有的字段全选中,然后平行往左拖,拖到最左边为止。
实际上不是绝对的左边,还是有个小缝隙的,不过没关系,只要不能再拖了就行
继续向着我们的目标(第一个图迈进)
选中表头上的所有字段,点右键,格式化多个对象,进入边框标签页
下面的颜色处,勾选“背景”,我们选个银色,然后确定
界面是这样的,线条没了。这样操作,从第2个字段开始,在字段上点右键,移动,移动到底层
设置好了就是这个模板效果
然后再预览一下(为了便于显示,我稍微改了下一些字段的样式)
导出来,效果就是我们要的
补充说明:
1:不适用于“自动换行”需求的报表
2:在Web项目中可能会出现边框不显示的情况,这是VS2005里版本的BUG,这样修正
HTML模式下,删除aspx页面内的
4:特别说明一下数据如果分页的话,要把表头放在页眉上。不然导出的文件里页眉会重复。实际上放到页眉上也可以(某些情况可能确实需要放到页眉上),这个时候导出的时候用代码控制一下
基本原理如下:
报表页眉上方一个同样的表头,抑制显示掉。页眉上放一个表头,正常显示。页面展示和打印时,按原样打印。
而导出时,控制模板的报表页眉显示,页眉抑制显示,然后用代码导出,从而实现导出效果。
5:NULL值的处理
如果数据中存在NULL值,那么导出和显示的时候,边线都就没有了。
报表中户多了很多不规则的“窟窿”。
这个时候有两种解决方法,一是传入报表之前,把数据处理成非NULL值,二是在报表端处理
针对有NULL的字段,做一个公式,如xx,把报表里的原始字段删掉,把这个xx拖到原来的位置,设置大小位置边线,跟原始字段的设置一样
公式xx这样写:
[解决办法]
没人顶 我来顶
向阿泰学习 阿泰真是热心人
[解决办法]
学习,不知道这位知道如何将图片导出到EXCEL不
[解决办法]
文明顶帖,支持楼主。
[解决办法]
还没占到sf
[解决办法]
可能我网速问题,
所以图片都是叉叉图,公司网速越来越不好了
[解决办法]
这次速度蛮快的,才推出来两天,这一篇就出来了
这样导出也很麻烦的,
去年这个时侯,做报表,导出excel,当时在网上搜了很多,画表格的,都没有很好的
也是后来才看到你之前的在博客园里面的一篇《水晶报表导出完美表格》
才知道用字段的边框,这样也是一个个单元格,和excel里面的一样,这样就ok了
我当时找不到好的办法,看到一篇操作excel的,然后下载
告别excel操作烦恼
一直这样用模板,建好excel表头,然后写数据,但是说实话,这样太慢了。
不过当时功能总算完成了
后来找到一篇导出,下载的,也不错,也有表格,现在一直这么用
public bool ExportToExcel(string ReportFile, object ReportDataSource, string ExcelFileName)
{
try
{
FileOPS.DiskFileName = ExcelFileName;
ReportDocument cr = CrystalReportSource1.ReportDocument;
ExportOptions ExOPS = cr.ExportOptions;
ExOPS.ExportDestinationOptions = FileOPS;
ExOPS.ExportDestinationType = CrystalDecisions.Shared.ExportDestinationType.DiskFile;
ExOPS.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.ExcelRecord;
CrystalReportSource1.ReportDocument.Export();
System.Web.HttpResponse Response = System.Web.HttpContext.Current.Response;
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "attachment;filename=" + ExcelFileName);//下载时要保存的默认文件名
Response.WriteFile(ExcelFileName);
Response.Flush();
Response.Close();
return true;
}
catch (Exception ex)
{
throw ex;
}
}
#region 下载服务器上的文件
/// <summary>
/// 下载服务器上的文件
/// </summary>
/// <param name="PageResponse">程序中可以设置参数:HttpResponse ht=Page.Response;</param>
/// <param name="serverPath">服务器上的文件路径</param>
public void DownloadFile(HttpResponse response, string serverPath)
{
FileStream fs = null;
try
{
fs = File.OpenRead(serverPath); //打开文件
byte[] buffer = new byte[1024];
long count = 1024;
response.Buffer = true;
response.AddHeader("Connection", "Keep-Alive"); //添加文件标头
response.ContentType = "application/octet-stream";
response.AddHeader("Content-Disposition", "attachment;filename=" + Path.GetFileName(serverPath));//下载时要保存的默认文件名
response.AddHeader("Content-Length", fs.Length.ToString());
while (count == 1024)
{
count = fs.Read(buffer, 0, 1024);
response.BinaryWrite(buffer);
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
response.End();
response.Close();
fs.Close();
}
}
#endregion
protected void Button1_Click(object sender, EventArgs e)
{
try
{
//创建Excel文件以及路径
string map = Server.MapPath(@"../ExcelReport");
string url = map + "/MonthReport{0:yyyyMMddHHmmss}.xls";
string ExcelFileName = string.Format(url, DateTime.Now); //字符格式化
bool msg = ExportToExcel("", "", ExcelFileName); //将水晶报表的信息保存到指定文件里
if (msg == true)
{
string URL = "DownLoad.aspx?Path=" + url;
Server.Transfer(URL);
}
}
catch (Exception ex)
{
ShowMessage(ex.Message);
}
}
[解决办法]
我调节那个位置的时候,用一个笨一点的方法,调坐标,
经常一拉就过,拖动的最小单位太大了
我的做法是设置属性里面的【左边】,【宽度】这些属性,毕竟纯数字的东西还是准确的
[解决办法]
看来我功力还不够
跟踪学习
[解决办法]
看了一篇
下班了,回去再仔细研究一遍
[解决办法]
跟踪学习,对我很有帮助
[解决办法]
.
[解决办法]
学习ing
[解决办法]
不错
[解决办法]
Tag!
[解决办法]
这段时间我天天修改报表的样式,那个导出excel让我很头疼,上次问你的样式,现在又有新问题出现,在这里贴几张图跟大家一起分享,可能大家也会遇到跟我同样的问题。[img=http://http://album.hi.csdn.net/app_uploads/lyin378/20090707/193203473.p.JPG?d=20090707193404632][/img]
[解决办法]
不好意思,第一贴图片,不太清楚,这就导出excel出现的多行显示,看旁边的序号就知道,我在贴几张应该就明白
[img=http://album.hi.csdn.net/app_uploads/lyin378/20090707/192442655.p.JPG?d=20090707193840315][/img]+分享 展开设计报表页面 ,我已经按阿泰的方法,在设计详细资料按下去,往上拖,然后下边沿就往上走了
[img=http://album.hi.csdn.net/app_uploads/lyin378/20090707/192442780.p.JPG?d=20090707193730414][/img]+分享 我用的水晶报表2008,在第一个字段“计划周报告时间段”写公式是为在这个上下居中显示,这是设计页面
[img=http://album.hi.csdn.net/app_uploads/lyin378/20090707/192017505.p.JPG?d=20090707194122981][/img],但是页面还是显示这种状况,内容顶在最上面横线上
http://album.hi.csdn.net/app_uploads/lyin378/20090707/192442780.p.JPG?d=20090707194244212,在第一个字段“计划周报告时间段”写公式是为在这个上下居中显示,这是设计页面
[img=http://album.hi.csdn.net/app_uploads/lyin378/20090707/192339849.p.JPG?d=20090707194423415][/img]这就是上下居中显示的效果,但是导出excel还有会多一行,就是我最先发的图片显示
[解决办法]
阿泰的水晶报表1+1教程~~~~~~~~~~~
[解决办法]
好意思,下班了心哈飞了,图片顺序发的有点乱了,你们仔细看还是会明白了,走咯。。。
[解决办法]
阿泰,你还在家还是在公司啊
[解决办法]
我好懒的,反正内容都相似,而且在你这里面回答还有分,嘻嘻,走咯,这会真的走咯!
[解决办法]