打印水晶报表

本文介绍了打印水晶报表的详细步骤。首先要安装水晶报表包并编写页面,接着获取打印所需数据,设置数据源和设计报表模板,可通过DataTable设计字段。最后在控制器编写打印代码,将查询数据转换为DataTable格式,实例化数据集和报表,加载报表模板并输出文件流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发工具与关键技术:Visual Studio 和  ASP.NET.MVC,
作者:陈鸿鹏
撰写时间:2019年  5月11日

我们在打印水报表前首先要安装好打印水晶包表安装完成后进行页面的编写。
接这是打印水晶报表,先获取到页所要打印的数据
function printAchievement()
{
//获取查询条件
var academeId = $("#sltAcademe").val();
var gradeId = $("#sltGrade").val();
var classId = $("#sltClass").val();

        //判断
        if (academeId == "" || academeId == undefined) {
            academeId = 0;
        }
        if (gradeId == "" || gradeId == undefined) {
            gradeId = 0;
        }
        if (classId == "" || classId == undefined) {
            classId = 0;
        }
        点击弹出提示框。
        layer.confirm("确定要打印当前表格中的数据吗?是请点击确定,否则请先筛选数据再进行打印!", { icon: 3, title: "提示" }, function (layIndex) { window.open("PrintAchievement?AcademeID="+academeId+"&GradeID="+gradeId+"&ClassID="+classId);
          layer.close(layIndex); 点击确定之后打开打印水晶报表的页面进行编写打印

之后呢就要给水晶报表设置他的数据源以及画水晶报表的摸板。 在原来的文件夹上右键添加新建文件夹命名为 PrintReport。再在PrintReport文件夹点击右键新建项,在已安装的里面Visualc#里面找到数据点击找到他里面的数据集如图。
在这里插入图片描述
在这里插入图片描述
创建好之后呢就出现已个空白的页面,我们就在空白处点击右键添加数据源,添加数据源有两种方式一种是TableAdapter通过数据库连接把数据连接过来,由于我们要建的表数库是没有的,所以选另一种是DataTable自己设计里面的字段,然后右键添加列添加你要用到的字段,然后右键字段选到属性,看一下你每个字段的数据类型是否相对应正不正确,注意这步很重要,不然后面出错很难找,然后设计好后保存。
然后再在文件夹右键添加新建项添加水晶报表,如图
在这里插入图片描述
只要你安装了水晶报表就会有这个,没安装是没有的,添加成功后它会弹出下图,,然后选择到作为空白报表,确定,之后就出现右边图形,像似画板的画面
在这里插入图片描述
在这里插入图片描述
然后在画模板之前在它右侧有个数据库字段,右键点击到数据库专家,
然后再找到刚才设计的表双击它就会跑到有边去之后确定,如下图
在这里插入图片描述
确定后再打开左边的字段就会看到你设计表里面的字段,然后自己去画表就行了
画完表之后就到控制器写打印水晶报表
}先进行一轮查询,在这查询就省略了直 接进行下一步,打印前要先掉用一个方法将IEnumerable类型的集合转换为DataTable类型。
//将查询出来的数据转化为DataTable的格式
DataTable dtResult = LINQToDataTable(listResult);
//1、实例化数据集就是文件夹里面的PrintReport
PrintReport.ReportDB dbReport = new PrintReport.ReportDB();
//2、将dtResult放入数据集中名称为“tbAchievement”的表格中
dbReport.Tables[“tbAchievement”].Merge(dtResult);
//3、实例化数据报表也就是水晶报表 这更上面的实例化数据集是一样的
PrintReport.AchievementReport rp = new PrintReport.AchievementReport();
//4、获取报表的物理文件路径
string strRpPath = Server.MapPath("~/") +
在这里的路径为什么是两个反斜杠的呢?实际上在计算机里面为单斜杠。当只用一个反斜杠的
时候回报错就是当一个斜杠与一个拼音在一起表达的是特殊的含义,单斜杠表示的是转义字符双斜杠就是表示单纯的路径符
“Areas\ExaminationManagement\PrintReport\AchievementReport.rpt”;
//5、上面的一系列实例化完成之后就将报表加载到报表模板中
rp.Load(strRpPath);
//6、设置报表的数据源,就是上面实例化的数据集
rp.SetDataSource(dbReport);
//7、返回数据报表将报表转化为文件流输出
Stream dbStream = rp.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
return File(dbStream, “application/pdf”);
到这运行点击查询出数据,点击打印就会将数查出来的数据以你画出来的格式显示出来如下图
}
在这里插入图片描述
/// 将IEnumerable类型的集合转换为DataTable类型
public DataTable LINQToDataTable(IEnumerable varlist)
{
//定义要返回的DataTable对象
DataTable dtReturn = new DataTable();
//保存列集合的属性信息数组
PropertyInfo[] oProps = null;
if (varlist == null)
return dtReturn;//安全性检查
//循环遍历集合,使用反射获取类型的属性信息
foreach (T rec in varlist)
{
//使用反射获取T类型的属性信息,返回一个PropertyInfo类型的集合
#region
if (oProps == null)
{
oProps = ((Type)rec.GetType()).GetProperties();
//循环PropertyInfo数组
foreach (PropertyInfo pi in oProps)
{
//得到属性的类型
Type colType = pi.PropertyType;
//如果属性为泛型类型
if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
{
//获取泛型类型的参数
colType = colType.GetGenericArguments()[0];
}
//将类型的属性名称与属性类型作为DataTable的列数据
dtReturn.Columns.Add(pi.Name, colType);
}
}
#endregion
//新建一个用于添加到DataTable中的DataRow对象
DataRow dr = dtReturn.NewRow();
//循环遍历属性集合
foreach (PropertyInfo pi in oProps)
{
//为DataRow中的指定列赋值
dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue(rec, null);
}
//将具有结果值的DataRow添加到DataTable集合中
dtReturn.Rows.Add(dr);
}
return dtReturn;//返回DataTable对象
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值