Archive for 01月, 2009

报表关于filter的影响

01.23.2009 by web报表 - 4 Comments - 0
Posted in web报表

有时候报表用户会采用filter对http请求进行转码,这样可以保证中文被正确的传递。但是由于报表用户可能不是使用gbk作为编码方式,因此在使用润乾报表的一些功能的时候可能会出问题。比如OLAP和即时报表,这些都会传一些中文参数。如果报表用户使用了自己的filter对http请求转码,可能会造成润乾报表得不到正确的参数,这时可建议报表用户先关掉filter的设置,如果这样可以解决问题的话,再修改filter的作用范围即可。 附:filter是在web.xml中设置的,一个标准的filter设置格式如下:
<filter>
  <filter-name>过滤器名称</filter-name>
  <filter-class>过滤器类名</filter-class>
  <init-param>
    <param-name>过滤器参数1</param-name>
    <param-value>参数值1</param-value>
  </init-param>
  </filter>

  <filter-mapping>
    <filter-name>过滤器名称</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>其中蓝色部分就是作用范围。”/*”表示全部路径。

关于报表基础知识

01.15.2009 by web报表 - 5 Comments - 0
Posted in web报表

什么是报表

一提起报表,人们最经常联想到的就是财务报表,象资产负债表、现金流量表、报销单等。其实除了财务报表,工作生活里还有很多报表,比如课程表、成绩表、员工登记表、工资表、物料登记单,银行记账单、手机话费单等等,各行业中的业务报表更是数不胜数。那么,什么是报表?

报表就是将内容信息(一般是数据、文字、图片等)以某种形式组织起来,并将组织结果呈现出来的文件。

对中国用户而言,凡是能打印出来的都可以叫报表。
什么是报表软件

顾名思义,报表软件就是用来制作报表的系统工具,目的是使做表工作简单化,提高总体工作效率。

报表软件有什么用?
报表软件可以帮助用户快速开发出自己想要的报表。这里的用户主要是指企业级用户市场,是除个人桌面级应用以外的市场。

企业级的用户一般有这么几个特征:
(1)应用复杂。企业级用户因为所处行业以及业务的不同,其应用软件涉及到财务、人员、物料、生产等各环节;
(2)数据量大,因为日常的业务往来会产生大量的生产数据;
(3)报表多且种类不同,处于不同生产环节上的人对报表有不同程度的要求。

专业的报表工具可以帮助企业级用户迅速定制出业务需要的报表。

润乾报表出了新版统计图

01.13.2009 by web报表 - 12 Comments - 0
Posted in web报表

润乾报表应该算是国内web报表的领先者,无论从产品性能、专业程度、企业规模来说都优于其他同行业软件,也正因为如此,之前做项目都是用他们的产品。但和大多数java工具一样,做出来的东西不好看,一直是其最大缺陷。但前段时间下了他们新的安装包突然发现他们的统计图有了很大的改过。

先看一下润乾报表旧版的统计图效果:

润乾报表旧版统计图

 

大概从润乾报表V4.1.40之后的产品都对统计图功能进行了改进,新程序中图形美观程度大大提高,下面是优化后的各类图形的显示效果:

柱形统计图:

润乾报表柱形统计图

折线统计图:

润乾报表折线统计图

饼统计图:

润乾报表饼统计图

区域统计图:

润乾报表区域统计图

其它图表效果:

润乾报表其它统计图表效果1

润乾报表其它统计图表效果2

统计图效果应该说比之前的好了很多,这让我们用起来更舒服些了,客户也对该改进有了不错评价,并因此顺利拿下了近期的那个项目。

Web报表工具的绘制方案

01.10.2009 by web报表 - 1 Comment - 0
Posted in web相关技术

目前市场上大多数Web报表开发工具的绘制方案不外乎有两种: Excel式和拖拽式(也有称画布式)。

前者与EXCEL类似,由单元格组成报表,单元格的边框组成报表的格线。

拖拽式则是通过控件摆放,用控件的矩形边框重合摆出报表的格线。

国内报表对样式要求非常复杂而且严格,它决定了报表样式的复杂度和绘制效率,以及导出 EXCEL 的能力(这是用户很强调的功能)。

Excel式在这方面有明显的优势,能够画出样式很复杂的报表,绘制效率也比控件拖拽式高出 10 倍以上,而且导出 EXCEL 时格式上不会失真,个别产品还可以直接读入 EXCEL 画好的表以进一步提高效率。

拖拽式则显得非常笨拙,常见的复杂多层表头画起来非常繁琐,某些纵向合并格甚至无法绘制出来,屏幕上对齐的表在打印时或在 WEB 上显示时又可能不整齐,生成 EXCEL 时经常丧失格式或导致格线太多太细而无法应用,读入 EXCEL 格式则更是完全不可能有的功能。

填报-web报表工具必不可少的功能

01.09.2009 by web报表 - 6 Comments - 0
Posted in web相关技术

现在很多web报表工具都声称支持在线填报,如StyleReport、润乾报表、FineReport、数巨、快逸报表等,但有些web报表工具其实只是能生成可以填写的HTML而已,距离真正需要的填写上报功能相去甚远。
如果你有填报的需求,在选择web报表工具的时候,可以着重考察以下几个方面 :

1. web报表工具能够处理数据入库。开发者不用为每个报表编写入库程序,数据能自动写入事先设计好的、能反映业务规则的数据结构中,而不是报表工具指定的固定数据结构。需要填写的web报表可能是行式的或交叉式的,数据入库的规则在报表定义时应当只定义一行(或一格),其它行(格)能够自动按规则重复;

2. 填报方案能够支持多级汇总填报,即填报表格首先是从基层数据库汇总而来,然后再回填入上级数据库中,而不是总是对着一个空表填写;

3. 最好能支持离线填写,即不联网时也可以填写,在联网后再上报数据;

4. 提供合法性检查功能,判断事先定义好的检查条件是否满足,如不满足则拒绝接收数据且给出提示;在页面端提供类EXCEL的自动计算功能,某个数据修改后,关联的数据立即变动,计算关系可以在报表中事先定义;合法性检查和自动计算关系都与入库定义类似需要能够自动按规则重复而不必为每个字段单独设计;

5. 提供多种多种编辑风格,如编辑框、下拉框、CheckBox等;下拉框的内容可以是固定列表,也可以来自数据库,另外,还应当支持两个下拉框之间的关联过滤(如部门和子部分之间自动过滤);

将Excel转换为SQL Server数据库

01.06.2009 by web报表 - 4 Comments - 0
Posted in .net报表相关

Excel是一种非常灵活的电子表格软件,用它可以存储各种数据,本节将对如何将Excel转换为SQL Server数据库进行详细介绍。

1.方案分析

通过Microsoft.Jet.OLEDB.4.0方式可实现使用ADO.NET访问Excel的目的,如以下示例代码为连接Excel数据的字符串:

string strOdbcCon = @”Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=D:”2010年图书销售情况.xls;Extended Properties=Excel 8.0″;

2.实施过程

程序开发步骤:

(1)新建一个网站,命名为25,其主页默认为Default.aspx。

(2)Default.aspx页面中添加一个Table表格,用来布局页面,然后在该Table表格中添加一个iframe框架、两个Button控件和一个GridView控件,其中,iframe框架用来显示原始Excel数据表中的数据;Button控件分别用来将指定Excel中的数据表导入到SQL Server数据库中和将导入SQL Server数据库中的Excel数据绑定到GridView控件上;GridView控件用来显示导入SQL Server数据库中的Excel数据。

(3)程序主要代码如下。

Default.aspx页面中,首先自定义一个LoadData方法,该方法为无返回值类型方法,主要用来将Excel数据表中的数据导入到SQL Server数据库中。LoadData方法实现代码如下:

public void LoadData(string StyleSheet)
{
string strCon = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source =” + Server.MapPath
(”usersdb.xls”) + “;Extended Properties=Excel 8.0″;
OleDbConnection myConn = new OleDbConnection(strCon);
myConn.Open(); //打开数据链接,得到一个数据集
DataSet myDataSet = new DataSet(); //创建DataSet对象
string StrSql = “select * from [" + StyleSheet + "$]“;
OleDbDataAdapter myCommand = new OleDbDataAdapter(StrSql, myConn);
myCommand.Fill(myDataSet, “[" + StyleSheet + "$]“);
myCommand.Dispose();
DataTable DT = myDataSet.Tables[ "[" + StyleSheet + "$]“];
myConn.Close();
myCommand.Dispose();
string strConn = “Data Source=(local);DataBase=Usersdb;Uid=sa;Pwd=”;
SqlConnection conn = new SqlConnection(strConn);
conn.Open();
for (int j = 0; j < DT.Rows.Count; j++)
{
string UserID = DT.Rows[j][0].ToString();
string EmailAddress = DT.Rows[j][1].ToString();
string FirstName = DT.Rows[j][2].ToString();
string LastName = DT.Rows[j][3].ToString();
string Address1 = DT.Rows[j][4].ToString();
string Address2 = DT.Rows[j][5].ToString();
string City = DT.Rows[j][6].ToString();
string strSql = “insert into Usersdb(EmailAddress,FirstName,
LastName,Address1,Address2,City) “;
strSql = strSql + “values(’” + EmailAddress + “‘,’” + FirstName + “‘,
‘” + LastName + “‘,’” + Address1 + “‘,’” + Address2 + “‘,’” + City + “‘)”;
SqlCommand comm = new SqlCommand(strSql, conn);
comm.ExecuteNonQuery();
if (j == DT.Rows.Count - 1)
{
Label1.Visible = true;
}
else
{
Label1.Visible = false;
}
}
conn.Close();
}

单击【Excel数据写入数据库中】按钮,定义一个string类型的变量,用来为LoadData传入参数,然后调用LoadData自定义方法将指定的Excel中的数据表导入到SQL Server数据库中。【Excel数据写入数据库中】按钮的Click事件代码如下:

protected void Button1_Click(object sender, EventArgs e)
{
string StyleSheet = “Sheet1″;
LoadData(StyleSheet);
}

单击【显示导入SQL的Excel数据】按钮,将导入SQL Server数据库中的Excel数据绑定到GridView控件上,显示在页面中。【显示导入SQL的Excel数据】按钮的Click事件代码如下:

protected void Button2_Click(object sender, EventArgs e)
{
string strConn = “Data Source=(local);DataBase=Usersdb;Uid=sa;Pwd=”;
string sqlstr= “select * from Usersdb”;
SqlConnection conn = new SqlConnection(strConn);
SqlDataAdapter myda = new SqlDataAdapter(sqlstr,conn);
DataSet ds = new DataSet();
conn.Open();
myda.Fill(ds, “Usersdb”);
GridView1.DataSource = ds;
GridView1.DataBind();
conn.Close();
}

说明:程序中进行与Excel和SQL Server数据库相关的操作时,首先需要分别添加System.Data.OleDb和System.Data.SqlClient命名空间。

3.补充说明

除了可以将Excel中数据导入到SQL Server数据库外,还可以将其转换为.txt文本文件格式,或者导入到Access或Oracle等数据库中。

象EXCEL一样冻结web报表表头

01.05.2009 by web报表 - 1 Comment - 0
Posted in web报表

报表很大,看的时候就需要滚动条了,但是一滚整个报表都动了,表头也看不到了,这看着就太麻烦了,老要来回来去地拖上拖下拖左拖右。

EXCEL想到了这个问题,提供了冻结窗格的功能,可以把上边或左边的几列固定下来,这样,再怎么滚动表头总是不动,就不会看走眼了。

可惜的是,在WEB上的HTML表格却没直接提供这个功能,它的TABLE只能整个地滚。怎么能做出象EXCEL那样冻结表头的效果呢?

简单的想法,是把表格人为地分为上下两块,上半截表头不动,下半截表体自己滚动,这不就完了吗?看起来也不算多麻烦了。

可别高兴得太早,这仅仅解决了上边的表头,如果我们足够不幸的话,会碰到即长且宽的表格(概率不小),这时还需要有个左表头。分两块显然不够了,那分四块行吗?左上角一小块不同的,其右边是上表头,下边是左表头,右下部分是表体。

事还没算完,这几块之间还会有关联。比如表体横向滚动时,需要让上表头跟着一起滚动,否则上下就错位了;同样,纵向滚动时左表头也要与表体同步。这就还要写一堆JS代码让这几片表格一起滚动。

哎,可麻烦死了。

幸运的是采用润乾报表,这事就轻松多了,只要两步:

1.在设计报表时将需要冻结的行和列选中,设为表头行和表头列。

2.在发布报表时的tag属性中设置needScroll=”yes”,还可以用scrollWidth和scrollHeight设置滚动区域的大小。

上面说的麻烦事都被润乾报表做完了。

看一下效果:

一切OK,搞定!

国内企业级应用中的报表需求

01.02.2009 by web报表 - 0 Comment - 0
Posted in web报表

在国内的企业级应用系统中,报表经常是应用中很重要的部分。但是,报表工具的应用情况却不够理想,现有的报表工具不能很好地适应国内的报表需求,报表制作和维护的自动化、专业化程度不够,导致报表及相关应用的开发和维护的工作量,仍然在整个企业级应用系统的开发和维护当中占据了相当大的比重。

因此,提供一个专业的、适合于中式报表需求的高效率的报表工具,对于提高报表应用的开发和维护效率,有着很重要的现实意义。

国内企业级应用系统中报表的需求,有着鲜明的特点:

  • 数据复杂一个报表中的数据可能同时来源于多个不同类型的数据源,并且这些数据之间可能存在着反复汇总、交叉引用等多种复杂的运算关系
  • 展现复杂多以表格方式展现报表,一个表格又可以拆分成若干个相关联的子表格;报表的打印要求比较高
  • 运行效率要求高企业级应用中报表的数量、报表中的数据量都比较大,且运行频繁,对报表的运行效率、稳定性要求很高
  • 开发工作量大、难维护目前,大多数报表工具都使用了大量的代码来解决数据和展现的问题,导致报表应用的开发成为应用开发人员的一大负担,且一旦报表需求发生变化,报表应用往往难以维护
  • 需求变化快企业级应用中报表的需求变化很快,并且随时会有新的报表需求产生出来,实际上企业中的业务人员最希望能够自己维护应用中的报表
  • 功能点多有很多应用功能都被放到了报表的需求中,而不同的项目对报表有几乎完全不同的需求,导致现有报表工具中的的功能点多而杂,但没有能解决报表开发的核心问题
  • 集成麻烦很多报表工具是以独立产品的形式出现的,有自己的用户管理、权限管理、报表管理等功能,需要与企业级应用中主要的开发环境和运行平台做集成,带来很多集成方面的问题
  • web报表工具的制表效率分析

    01.02.2009 by web报表 - 3 Comments - 0
    Posted in web报表

    所谓报表工具,最核心最本质的功能,就是它的制表能力,即是否能够不写代码而制作出自己需要的各种web报表工具。但用户在考察报表工具时往往很注重打印输出、绘制方案、管理调度等外围因素,而忽视了报表工具最本质的制表能力。当然不可否认这些外围的功能对一个报表工具来说也是很重要的衡量标准,但是报表工具的主要用途是制作报表,而且事实上,市场上的主流产品在处理复杂报表时确实存在明显缺陷,并不能很好地制作出我们需要的报表,半数以上报表仍需编写代码准备数据,导致工具失去意义。因此,考察制表效率对于选择报表工具是至关重要的。

    扔掉条子
    报表绘制的方法一般有 网格式 和 控件拖拽式 两种,前者采用和EXCEL类似的方案,用网格线围出报表;而后者则是用矩形框等元素拼出报表。国内报表对样式要求非常复杂而且严格,绘制方案是报表工具相当重要的指标,它决定了报表样式的复杂度和绘制效率,特别是对于格线比较多的表。

    传统的报表绘制,大多数是呈条带状,用的拖拽式,拿部件拖来拽去。表格线需要靠矩形边框重合摆放拼接出来,常见的复杂多层表头画起来非常繁琐,数据区某些纵向合并格甚至无法绘制出来(或者需要特定程序控制才能实现),拼出的格线还与分辨率相关,屏幕上对齐的表在打印时或在WEB上显示时又可能不整齐。

    网格式在这方面有明显的优势,能够画出样式很复杂的报表,绘制效率也比控件拖拽式高出许多。由于MS Excel软件的普及,在大多数人心中画表软件就是Excel,对于Excel软件的操作也都很熟悉。这样也能节省许多学习成本。

    所以,类EXCEL的方法明显优于拖拽式,或者说,画报表就应该是用象Excel那样的方法。大概稍有点常识的人,都会拿Excel画表吧。所以,类Excel是必然的方向。

    因为Excel很早就已普及了。所以提及报表工具,自然首先都会想到用类Excel方式,而为什么控件拖拽式的报表工具会这么多呢?
    这是因为Excel虽然具有强大的绘表能力,但数据处理能力非常弱,除非用“A2+B3=D4”这样的公式将单元格联系起来,否则单元格之间是相互独立的,没有任何关系的。如果要从数据库或数据文件中取数,需要程序员一个单元格一个单元格去定义,工作量相当繁重。需要靠程序员编程来实现动态行列报表的制作。

    因为报表格式只是报表工具要解决的一部分问题。我们用报表工具的目的,是要能从数据库中读出数据,从而自动产生报表,数据才是报表要解决的核心问题。报表格式用Excel可以解决得很好,但是Excel没有良好的从数据库中进行数据汇总方案,除非编程序往格子里填数据,基本上没法从数据库中读出数据自动产生报表。因此这种报表几乎都只能做静态报表。

    而拖拽式的格式虽然解决得一般,但从数据库中取数进行数据统计能力方面要比Excel强得很多,两害相权取其轻,堆框虽费劲,慢慢堆就行了,但统计汇总不行的话那就没办法了。

    报表工具软件和其它软件一样都是国外先做出来的,而国外的报表的样式非常规整,没有格线,表头非常简单,没有斜线表头、没有分层分组。一张报表提供的信息有限,如果要看所有信息,就只能几张表对照着看了。因而国外的报表工具采用控件拖拽式能弱化报表样式绘制能力弱的缺点。而国内的报表工具基本上都是学习国外的报表工具模型来设计的。而中国式报表的样式相当复杂,所以很多报表工具都被迫再辅以大量的程序代码来处理中国式报表,这也使得用户在买了报表工具后,做报表的工作量还是很大。

    z

    多源分片
    多源是指一个报表的数据来源来自多个物理数据表,甚至是多个物理数据库。这里的“多个”指的两个以上的物理数据库。
    传统的报表工具只支持单源报表,即使是数据来自于多个物理数据表或者物理数据库,也需要在报表设计前将多源转化成单源处理。两三个源尚可写SQL语句完成,但多到五六个源以上时,一方面对应的SQL语句过于复杂难以维护,另一方面其运行效率降低,这时常常要编写存储过程或其它代码来准备数据了。这还只是单数据库的情况,如果多源来自多库,则更为复杂,无法直接写出复杂SQL或存储过程,需要架构专门的数据库桥后才可以完成。
    某些传统报表工具也声称可支持多源,实际上指的是多数据库支持,只是把数据库桥功能集成进入报表工具中,但真正到报表设计时仍然是单源的。和我们所说的多源有很大差别。
    多源往往带来分片,正是由于分片,使得报表设计必须直接基于多源进行,而不能先将多源转成单源进行。有相当一部分分片报表无论如何也不可能换成单源处理,部分能转成单源的报表处理也非常繁琐。
    分片是指报表的纵向或横向或双向同时被分成了多个区域,每个区域重复规则不同,而又可能相互运算。
    传统工具能够处理的上下格式一致和列方向固定的分片报表(即可由多源转成单源的报表),但会迫使用户编写复杂的SQL(UNION+JOIN)和代码准备数据,导致工作量大且维护困难;而且对于横向分片数较多报表,由于必须采用JOIN方式准备数据,导致运算性能极低,复杂度为O(Nk),k为分片数。

    不规则划分

    几乎所有的报表工具都支持独立的分组报表格式,即传统的通过一个绑定数据的过程来完成分组报表的设计,这种分组是完全规则划分的,即划分标准一致且有规则(一般都按某个字段或表达式),所有字段都必须出现且只出现一次,分组值次序与原数据记录次序一致。
    但是与完全划分相对应的,在报表汇总中却常常需要不规则划分,即划分标准看不出规律(常常只能穷举),所有事实不一定全部出现在分组结果中、个别事实还可能重复出现,次序也与原数据记录无关。固定分组是不规则划分的常见表现。
    例如下面这张报表。年龄段的分组就是个不规则划分,划分规律不明确,只能穷举出来;分组不完全,50岁以上的则被整合到一个组内。

    zx
    这个报表用传统工具实现很困难,虽然报表格式并不复杂,但由于出现了不规则划分,无法直接用报表工具的分组功能完成,只能编程把数据准备成一个单层的二维表数据源,即加大了工作量,又很难体现数据之间的层次关系。

    动态格间运算

    所有的报表工具都会提供一些计算列的功能,在原始数据基础上再计算出一些别的列值或统计值,这是报表展现中是不可缺少的功能。
    传统工具一般只提供同行内的格间运算和针对某组(或全体)的集合运算,对于常见的跨行组运算则相当困难。个别传统工具提供了简单的跨行能力,如可以引用上一行数据,而跨组则无能为力;对于集合运算只提供个别固定的函数,如取第一名、算累计值等,无法组合出的通用集合运算则无计可施,如取第二名、算累计的乘积等。某些带条件的运算更是无法可想,如计算语文成绩在90分以上的同学的数学成绩总和。
    除了有规律的跨行组运算外,报表中还可能会有一些随意的独立格运算,其值可能是报表中的任意几个其它格运算出来,甚至还可能会引用到报表外的数据(比如和数据库中的数据再次运算等)。由于传统工具没有很好的运算后报表数据项命名机制(传统工具只能用列名命名设计的数据单元),很难精确描述数据引用关系,只能写出规律性很强的表达式,但随意的独立格运算会就使传统工具无法处理,而报表外的数据引用更是只能借助脚本或外围应用程序,导致代码极为混乱。
    下面这张报表是个典型的跨行组运算报表,其中有比上期(跨行)和比去年同期(跨组)运算,这种报表在传统工具中常常又必须编程准备数据。这个报表的样式并不复杂,但这些格间运算会让传统工具非常为难。只能再次依靠程序代码,把数据事先计算好直接往报表里填。

    zxc
    另外,所有以上的讨论中还贯穿了一点,即行列对称。纵方向上拥有的自动复制扩展的能力需要完全实现在横方向上。报表可以横向分组、横向分片,对于横向变化的报表可以定义跨列组运算等。
    我们知道,报表的上述复杂性常常是混合在一起的,同一张报表中很可能包含了所有的问题,这要求我们给出完整的解决方案,而不能单独分别处理。当这几种困难交织到一起时,整个问题的复杂度要远比解决几个单个问题的总和要大得多。
    由此可见,只有采用支持上述特点的web报表工具,才能真正提高制表的效率。