报表的发布

2023-10-29

    各种不同的报表工具,其发布方式是不一样的。现在说说一些报表工具的发布方式.笔者对报表了解不多,可能有些认识上的错误,望大家指明.


    DevExpress公司出品的报表工具 XtraReport ,它的报表设计器就是集成在VS.NET集成开发环境中,在我看来,它的报表设计器就是一种比较特殊的窗体设计器.把报表样式当作窗体表单来设计,于是它也就没有什么报表模板的概念,它的设计信息就保存在VB.NET或C#代码中。这种方法也就避免了写复杂的互换式报表设计器界面,VS.NET已经提供了这种设计器界面的支持,XtraReport也能保存报表到独立的模板文件中,只是加载报表模板对象后将对象以SOAP格式序列化到一个XML文件中。


   
这种发布方式是生成的详细的源代码的,程序员可以动手修改这些源代码来实现更灵活的功能,因此方便编程,报表代码可以编译到程序中,报表加载和运行速度快,而且减少了应用系统的文件个数,方便部署。但是修改报表需要重新编译,维护不方便,而且可移植性不好。当新旧版本的XtraReport编程接口变化比较大时,则报表难于移植。


    一个最简单的XtraReport报表代码文件可能为,它就是XtraReport格式的报表模板文件




using System;

using System.ComponentModel;
using System.Collections;
using System.Diagnostics;
using DevExpress.XtraReports.UI;

namespace WindowsApplication2
{
/// <summary>
/// Summary description for XtraReport1.
/// </summary>
public class XtraReport1: DevExpress.XtraReports.UI.XtraReport
{
private DevExpress.XtraReports.UI.DetailBand Detail;
private DevExpress.XtraReports.UI.PageHeaderBand PageHeader;
private DevExpress.XtraReports.UI.PageFooterBand PageFooter;
private DevExpress.XtraReports.UI.XRLabel xrLabel1;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public XtraReport1()
{
/// <summary>
/// Required for Windows.Forms Class Composition Designer support
/// </summary>
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}

#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.Detail = new DevExpress.XtraReports.UI.DetailBand();
this.PageHeader = new DevExpress.XtraReports.UI.PageHeaderBand();
this.PageFooter = new DevExpress.XtraReports.UI.PageFooterBand();
this.xrLabel1 = new DevExpress.XtraReports.UI.XRLabel();
((
System.ComponentModel.ISupportInitialize)(this)).BeginInit();
//
// Detail
//
this.Detail.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[]
{
this.xrLabel1
}
);
this.Detail.Height = 120;
this.Detail.Name = "Detail";
//
// PageHeader
//
this.PageHeader.Height = 30;
this.PageHeader.Name = "PageHeader";
//
// PageFooter
//
this.PageFooter.Height = 30;
this.PageFooter.Name = "PageFooter";
//
// xrLabel1
//
this.xrLabel1.Location = new System.Drawing.Point(108, 17);
this.xrLabel1.Name = "xrLabel1";
this.xrLabel1.Size = new System.Drawing.Size(238, 24);
this.xrLabel1.Text = "报表中显示的文本";
//
// XtraReport1
//
this.Bands.AddRange(new DevExpress.XtraReports.UI.Band[]
{
this.Detail, this.PageHeader, this.PageFooter
}
);
((
System.ComponentModel.ISupportInitialize)(this)).EndInit();

}
#endregion
}
}

     
当然,更多的报表工具是以报表模板文件的形式进行发布。报表设计器生成各种格式生成报表模板文件,有二进制的,有文本的,还有XML格式的。将这些报表模板文件放在合适的地方,而应用程序从指定位置加载报表模板,使用相对应的报表引擎解析报表模板,访问数据源然后输出报表。



   这里拿旧版本的FastReport说说,FastReport是Delphi编写的,只有报表设计器和报表预览控件,没有独立的报表引擎,报表模板文件是二进制格式。在非Win32的B/S应用中,首先使用报表设计器生成一个个报表模板文件,上传到服务器某个目录中,然后HTML页面中嵌入一个报表预览控件,由于是C/S环境,报表预览控件不能连接数据库,因此服务器端编程序要读取数据,根据这些数据拼凑成javascript和vbscript脚本字符串发往客户端。在客户端的浏览器中,这些服务器程序生成的脚本语言调用报表预览控件的接口,让它下载报表模板文件,并填充数据到报表预览控件中,如此完成报表输出。整个发布过程比较艰难,因此做几张报表还是可以完成的,若要做大量报表,这种发布方式是不明智的。



   微软的Reporting Service
算是比较新的重量级的报表工具了,专门做Web报表,不知道它能否方便的用在C/S系统中。它的报表引擎运行在服务器端。它的报表设计器是基于VS.NET集成开发环境,报表模板文件是XML格式。在实际应用中,首先开发者使用VS.NET编制报表模板,然后发布到报表服务器上,然后客户在浏览器中输入报表页面URL就可查看报表了。这种发布方式比较适合WEB应用,部署方便。



  
上面的说明,可以知道,通常有两种发布方式,基于源代码的发布方式和基于报表模板文件的发布方式。这两者的差别主要有



比较项目 报表模板文件发布方式 源代码发布方式
模板设计器 自己开发互换式设计器,设计器可以独立运行,也可嵌入到VS.NET开发环境。 由VS.NET开发环境提供支持,无需编写设计器。
自动生成源代码 VS.NET开发环境自动生成。
保存方式 报表模板文件。 源代码文件。
发布方式 报表模板文件。 可执行代码,包含在EXE或DLL中。
可移植性
灵活性 高,可以深入编程,因此可适应各种情况。
加载和运行速度 低,需要报表引擎加载和解析报表模板文件,动态的生成报表文档对象。 快,可执行代码加载后就可直接使用。
动态报表 可以支持,也可以不支持。 必须支持。

  
笔者正在开发的报表工具尝试着同时支持这两种报表发布模式,报表工具既可使用报表模板进行发布,又可生成源代码。其实写个报表工具,支持第一种方式或支持第二种方式都是可以想象的,但要这两者结合起来则一时还不可想象,因为这两者相差太大了。



  
笔者开发的报表工具的发布是基于报表模板文件的,因此需要进行升级。



   
第一步就是支持动态报表。在笔者看来,所谓动态报表就是报表引擎提供非常丰富的编程接口。应用程序可以使用这些接口,使用一个空白报表模板来动态的构造出一个实用的报表模板,其中无需报表模板编制工具。还好,我的报表工具是基于XDesignerLib的,而XDesignerLib就是一个中间件,就是为了让其他程序扩展的,因此编程接口非常丰富,我对报表引擎小修小改,也就完成了对动态报表的支持了。



   
第二步就是考虑如何生成源代码。此时报表设计器就客串为代码生成器,笔者的一些设计器由代码生成功能,比如笔者编写的数据库设计器XDBDesigner能根据数据结构自动生成各种代码,那里使用了XML+XSLT来生成代码。但根据报表模板来生成代码情况复杂,XSLT技术不够用,因此不采用XSLT方式。此外还能采用拼凑字符串的方式来生成代码,但生成的代码种类单一。因此采用CodeDom的方式来生成代码,其过程是遍历所有的报表元素,为每一个报表元素生成一小段CodeDom结构,然后将这些结构组合在一起就可以生成一个完整的代码树,然后使用
Microsoft.CSharp.CSharpCodeProvider 或 Microsoft.VisualBasic.VBCodeProvider
来生成C#代码或VB.NET代码,如果找到其他种类的编程语言的CodeProvider则还可以生成其他种类的编程代码。



   比如一个报表设计样式为



则报表设计器生成的C#和VB.NET代码为




namespace MyNamespace {
using System;
using System.Data;
using System.Xml;
using XDesignerDom;
using XDesignerProperty;
using XDesignerGUI;
using XDesignerCommon;
using XDesigner.Report;


/// <summary>新增文档</summary>
public class MyClass : DesignReportDocument {

/// <summary>Initalize document.</summary>
public MyClass() {
// Begin of initalize document
this.Loading = true;
this.Desc = "新增文档";
this.Title = "新增文档";
this.HeadHeight = 72;
this.Bounds = new System.Drawing.Rectangle(0, 0, 601, 300);
this.PageLeftMargin = 96;
this.PageTopMargin = 96;
this.PageRightMargin = 96;
this.PageBottomMargin = 96;
// element reporttable1
DesignReportTable reporttable1 = this.CreateTableElement();
this.AppendChild(reporttable1);
reporttable1.ID = "reporttable1";
reporttable1.Bounds = new System.Drawing.Rectangle(0, 0, 599, 126);
reporttable1.PrintDockStyle = XDesigner.Report.PrintDockStyle.Top;
reporttable1.InnerDataSource = "地区列表";
// element Col0
DesignReportTableColumn Col0 = this.CreateTableColumnElement();
reporttable1.AppendChild(Col0);
Col0.ID = "Col0";
Col0.Width = 119;
// element Col1
DesignReportTableColumn Col1 = this.CreateTableColumnElement();
reporttable1.AppendChild(Col1);
Col1.ID = "Col1";
Col1.Width = 164;
// element Col2
DesignReportTableColumn Col2 = this.CreateTableColumnElement();
reporttable1.AppendChild(Col2);
Col2.ID = "Col2";
Col2.Width = 75;
// element Col3
DesignReportTableColumn Col3 = this.CreateTableColumnElement();
reporttable1.AppendChild(Col3);
Col3.ID = "Col3";
Col3.Width = 122;
// element Col4
DesignReportTableColumn Col4 = this.CreateTableColumnElement();
reporttable1.AppendChild(Col4);
Col4.ID = "Col4";
Col4.Width = 119;
// element Row0
DesignReportTableRow Row0 = this.CreateTableRowElement();
reporttable1.AppendChild(Row0);
Row0.ID = "Row0";
Row0.Height = 41;
Row0.TableHead = true;
// element A1
DesignReportTableCell A1 = this.CreateTableCellElement();
Row0.AppendChild(A1);
A1.ID = "A1";
A1.Bounds = new System.Drawing.Rectangle(0, 0, 599, 41);
A1.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Bold);
A1.ColSpan = 5;
A1.Text = "分组客户列表";
A1.Align = System.Drawing.StringAlignment.Center;
// element B1
DesignReportTableCell B1 = this.CreateTableCellElement();
Row0.AppendChild(B1);
B1.ID = "B1";
B1.Bounds = new System.Drawing.Rectangle(119, 0, 164, 30);
B1.BorderWidth = 1;
B1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular);
B1.Align = System.Drawing.StringAlignment.Center;
// element C1
DesignReportTableCell C1 = this.CreateTableCellElement();
Row0.AppendChild(C1);
C1.ID = "C1";
C1.Bou
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

报表的发布 的相关文章

  • Boost 错误代码参考

    有谁知道在哪里可以找到升压错误代码的参考 特别是 异步套接字处理程序返回的错误代码 Google 和 grep 头文件已调为空 我从 Linux 上的 asio error hpp 中提取了错误值 顺便说一句 我仅使用标头 asio 而不是
  • 寻求有关 cs50“现金”问题集的 C 贪婪算法的帮助[已关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 目标是创建一种算法 该算法接受输入并给出从输入中减去值 25 10 5 1 的次数的输出 代码需要以尽可能贪婪的方式执行此操作 尽可能获取最
  • 动态库使用静态库,出现未定义的符号

    我一直在寻找解决问题的方法 只是得到了一些线索 但我找不到任何一致的解决方案 我有一个动态库 libdyna so 的代码 它使用3个静态库 libone a libtwo a lib Three a 和log4cpp库的功能 当我第一次构
  • 具有自动返回类型推导的 Friend 函数模板无法访问私有成员

    抱歉这个问题的标题太复杂了 我试图描述我为这个问题构建的最小 SSCCE 我有以下代码 include
  • 带有成员 (operator[]) 函数的 invoke_result

    如何为成员函数正确调用invoke result 或者专门用于运算符成员函数 我试过std invoke result
  • 从 pdf 和 word 文件中提取文本

    如何在 C 中从 pdf 或 word 文件中提取文本 删除粗体 图像和其他富文本格式媒体 您可以使用专为索引服务设计 由索引服务使用的过滤器 它们旨在从各种文档中提取纯文本 这对于在文档内部进行搜索非常有用 您可以将其用于 Office
  • C#:如何计算纵横比

    我对编程比较陌生 我需要根据给定尺寸 例如 axb 计算纵横比 16 9 或 4 3 我如何使用 C 来实现这一点 任何帮助将不胜感激 public string AspectRatio int x int y code am lookin
  • “双免”是什么意思?

    正如标题所暗示的那样 我是 C 语言的新手 并且很快就会有期中考试 我目前正在修改过去的论文 一个反复出现的主题是双重自由问题 我理解就是调用的过程free 在同一个内存位置两次 但我有几个问题我不能 100 确定如何回答 问题1 C中双重
  • dotnet core 创建文件名中不含“CoreFxPipe_”的命名管道

    使用以下命令创建命名管道时命名管道客户端流 or 命名管道服务器流dotnet core 的类中 关联的 管道 看起来实际上是一个套接字 已自动将 CoreFxPipe 添加到文件名的前面 有没有一种非黑客的方法来防止这种行为 我只是希望文
  • 从 Windows 选择声音并播放它们

    我有一个 WinForms 应用程序 该应用程序有一个 首选项 部分 用户可以在其中选择显示警报时播放哪些声音 是否可以有一个组合框 用户可以从 Windows 存储的声音中进行选择 例如 紧急停止 紧急蜂鸣 等 这些可以在 控制面板 gt
  • 静态成员函数中的封闭类的 C++ 类型

    我认为这是完全不可能的 但如果呢 在任何版本的 C 中 是否有可能以某种方式获取静态成员函数中封闭类的类型 class Impossible public static void Fun typedef Impossible Enclosi
  • 在多个线程中添加和删除时 List 中的 null 值

    我知道 C System Collections Generic List 对象不是线程安全的 但我想知道为什么这段代码会生成空值 Task Run gt for var i 0 i lt 10 i var str Test i list
  • 如何根据条件退出 PostSharp 方面的 OnEntry 方法中的方法

    我希望方面根据如下条件退出方法调用 AttributeUsage AttributeTargets Method public class IgnoreIfInactiveAttribute OnMethodBoundaryAspect p
  • 获取上下文菜单的控制

    我有一个如下所示的上下文菜单 A 1 2 3 选择 1 2 或 3 后 我需要访问调用上下文菜单的对象 意思是如果这是 textbox1 的上下文菜单 那么我需要访问该对象 我该怎么做 忘了说了 这是一个WPF应用程序 所以我使用 Syst
  • 将变量传递给 SSIS 中的项目参数

    我是这个网络的新手 希望我能找到这个问题的答案 我有一个 SSIS 项目 其中包含多个使用项目参数的包 我正在尝试更新项目参数 例如 PeriodStart 2014年5月31日 我找不到动态写入项目参数的方法 我在 4 0 框架中使用 V
  • 成员函数的Decltype

    class A int f int x int j return 2 decltype f p 给我错误 error decltype cannot resolve address of overloaded function 我不明白为什
  • Cmake:在自定义目录中查找 protobuf 包

    我有 cmake 3 10 x 并下载了当前的 protobuf 源 3 6 1 使用 cmake 我创建了 bin 目录 PROTOBUF SOURCE DIR bin 在其中成功构建了该库 下一步我想在我的基于 cmake 的项目中使用
  • 对数据绑定组合框进行排序的最佳方法是什么?

    我对此做了一些研究 似乎对数据绑定组合框进行排序的唯一方法是对数据源本身进行排序 在本例中为数据集中的数据表 如果是这种情况 那么问题就变成对数据表进行排序的最佳方法是什么 组合框绑定在设计器中设置初始化使用 myCombo DataSou
  • 类型与创建 CLR 存储过程不匹配

    我在程序集中有一个如下所示的方法 namespace MyNameSpace public class MyClass Microsoft SqlServer Server SqlProcedure public static void M
  • 系统.安全.加密与 PCLCrypto

    我们正在删除系统中的许多共享功能并将其移植到 PCL 库中 我在使用 PCLCrypto 时遇到问题 我正在获取数据库中的一些现有数据 并尝试使用相同的算法对其进行解密 我得到了值 但末尾有 16 个额外字节 这些字节都是垃圾 参见下面的代

随机推荐

  • C语言小游戏:猜数字小游戏(猜1-100的数字)

    初学c语言循环部分的萌新可以看看 内含有详细讲解 试着自己去理解会有很大帮助 include
  • 基于MATLAB的指纹识别算法仿真实现

    FPGA教程目录 MATLAB教程目录 目录 一 理论基础 二 核心程序 三 测试结果 一 理论基础 在指纹图像预处理部分 论文对预处理的各个步骤包括规格化 图像分割 中值滤波 二值化 细化等以及各个步骤的方法进行了深入的分析和研究 选择了
  • MySQL数据库实现本地数据库和远程服务器数据库数据同步

    项目中有两个数据库 本地数据库和远程服务器数据库 数据要在本地经过数据洗涤后才传上服务器数据库 之前用的Navicat工具 但是速度慢 且无法设置定时同步 后来改用Datax 它的效率真的非常高 DataX 是阿里巴巴集团内被广泛使用的离线
  • 大语言模型未来会是数据工程吗

    作者 养生的控制人 整理 NewBeeNLP https zhuanlan zhihu com p 654959483 大家好 这里是 NewBeeNLP 分享符尧博士关于大语言模型的数据工程方面的一些见解 原文链接 1 take home
  • Docker基础篇6:Dockerfile指令(1)

    1 Dockerfile指令 1 FROM指令 构建的新镜像是基于那个镜像 例如 FROM centos 7 2 MAINTAINER指令 镜像维护者姓名或者邮件地址 3 RUN指令 构建镜像时运行的shell命令 写法一 RUN yum
  • vue 获取 指定元素的高度宽度等(使用vue中的 ref 获取到的是 dom 元素高度或者宽度)

    使用 vue 的时候 想要获得一个指定的元素的高度时 可以使用 vue 中的 ref 当 ref 加在普通的元素上 使用 this ref name 获取到的是 dom 元素 示例 写在 页面 html 部分的 div div 写在 页面
  • 从零开始搭二维激光SLAM --- Hector论文公式推导与相关代码解析

    这篇文章将带领大家推导一下hector slam论文中的公式 之后再对这部分公式对应的代码进行讲解下 markdown打公式太费劲了 所以我用手写了 懒 然后csdn又限制了图片文件大小 我是照完照片又截图才传上来的 所以图片有点不清晰 1
  • 实现最小栈

    题目要求 实现一个栈 要求实现Push 出栈 Pop 入栈 Min 返回最小值的操作 的时间复杂度为O 1 首先针对这道题有多重解决方案 1 定义两个栈 一个正常栈 另一个栈的栈顶始终保存整个栈内的最小值 思路如下 无论Push什么数据 正
  • BGI::detail::content用法详解及示例代码

    BGI detail content用法详解及示例代码 在C C 编程中 BGI Borland Graphics Interface 是一个用于图形绘制的库 它提供了一系列函数和工具 使开发者能够在DOS和Windows环境下创建图形界面
  • NumPy——输出向量和矩阵

    微信公众号 龙跃十二 我是小玉 一个平平无奇的小天才 我们都知道 NumPy是python学习和机器学习中非常重要的库 我们在学习过程中不可避免的使用到这个库 NumPy是Python中科学计算的基础包 它提供多维数组对象 各种派生对象 如
  • 一文搞懂Python的文件路径操作

    如果你要在代码里读取一个文件 那么你首先要知道这个文件的路径 如果只有一个文件 那么很简单 直接复制这个文件所在的文件夹路径及其文件名即可 而在很多情况下 我们会处理大量的文件 这些文件一般都会按一定的规则存放在一个或几个文件夹里 本文便是
  • cesium timeline时间改为系统时间(北京时间) vue版本

    效果图 初始化三维球后 追加如下代码 修改timeline时间 从珠联时间改为北京时间 initGlobel 省略初始化 this viewer animation viewModel dateFormatter this DateTime
  • linux卸载openjdk并安装jdk

    1 java version 查看是否安装 2 查看有哪些java安装文件 3 开始卸载 卸载掉下面两个 java version查看找不到java版本 就说明卸载成功了 如果卸掉下面两个还能看到java版本的话 就可以把第一个和第二个一起
  • python中字符串大小写判断和转换函数(upper,lower,capitalize,istitle)

    S为一字符串 可以使用python的内建函数对S中的字母大小写做判断和改变 supper lower和capitalize是转换函数 可以把字符串中的字母做相应的处理 istitle isupper和islower是判断函数 它们对字符串做
  • opencv+mfc搭建框架

    环境 vs2012 opencv2 49 功能 加载图片 保存 二值化 放大 缩小 旋转 实现方法 用opencv来实现相应的图像处理功能 用mfc的对话框来搭建框架 难点 在Mfc框架下显示图片 解决办法 根据父窗口与子窗口的关系 将op
  • VuforiaAR扫描3d物体

    Unity版本为2020 3 20 Vuforia版本为9 6 3 有偿demo 链接 https pan baidu com s 1YlmKeMWvMFRYPhieP3OrqQ 3D物体数据扫描 安卓机扫描3D物体的Scanner工具包下
  • C#的线性规划代码

    using System using System Collections Generic using System Linq using System Text using System Threading Tasks namespace
  • C语言实现RAND函数的方法

    C语言使用rand 一个值就可以实现生成一个伪随机数供我们使用 那么rand函数是如何实现的呢 我们自己可不可以编辑出来 其实是可以的 rand作为伪随机数发生器产生的是一个伪随机数 一般的用途能够满足 要想实现这个函数 需要用一个公式 x
  • Springboot使用Thymeleaf模板引擎无法加载css样式等静态资源

    我的项目文件目录如下 在使用thymeleaf模板引擎时访问不到css样式文件如下 其原因是Thymeleaf模板引擎引用文件需要按照规定的写法 如下 需使用th href属性 路径需使用 文件路径 包裹 加上后就可以看见样式了
  • 报表的发布

    各种不同的报表工具 其发布方式是不一样的 现在说说一些报表工具的发布方式 笔者对报表了解不多 可能有些认识上的错误 望大家指明 DevExpress公司出品的报表工具 XtraReport 它的报表设计器就是集成在VS NET集成开发环境中