资源描述
如何集成e表 2
e表 for .NET版的集成 2
1复制系统文件 2
2数据库连接 2
3 集成到2003和 2005之间的不同 2
e表 for .J2EE版的集成 2
1复制系统文件 2
2数据库连接 2
运行报表 3
在运行报表时动态指定数据源 4
在运行报表时控制权限 4
配置运行报表的工具栏 5
在iframe中运行报表 6
修改报表 6
接口开发 7
将报表格式文件保存到数据库中 7
自定义数据集 7
定期运行报表的实现 9
装入已存好的报表结果页面 11
含参数的报表的运算结果保存 13
从运行报表工具栏上保存报表的运算结果 14
如何实现在运行报表时调整统计图功能 15
实现自定义函数功能 15
报表运行时改变参数或宏的事件 17
报表运行时改变数据集配置的事件 19
如何集成e表
e表 for .NET版的集成
1复制系统文件
将ebiao/bin 目录下的所有dll文件复制到自己系统的bin目录下。
将ebiao/ebsys 目录复制到自己的虚拟目录下。
将ebiao/log4net.config 文件复制到自己的虚拟目录下。
2数据库连接
系统可以配置一个默认的数据库连接,当数据集中没有指定连接串时用它。默认的数据库连接串在web.config文件中的此处配置:
<appSettings>
<add key="strOleDbConn" value="Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=ebtest;User ID=sa;pwd=;" />
</appSettings>
在自己系统的web.config文件中加上此配置。
数据库连接串的写法格式常用有以下几种:
Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=ebtest;User ID=sa;pwd=;
表示用oledb方式来连接sql server库
Data Source=localhost;Initial Catalog=ebtest;User Id=sa;Password=;
表示用sqlclient方式来连接sql server库
Provider=OraOLEDB.Oracle;Data Source=sys;User ID=eboracle;Password=eboracle;
表示用oledb方式来连接oracle库
Data Source=sys; Integrated Security=no; User Id=eboracle;Password=eboracle;
表示用oracleclient方式来连接oracle库
3 集成到2003和 2005之间的不同
集成到vs2003时应将bin目录下的 WebBill.dll 文件删除,因为它是当前工程生成出来的dll,同时应将bin目录中的所有dll文件添加引用到当前项目中。同时应将当前目录的设置为可写,即象安装时做的这一步一样: 3、从资源管理器中选中C:\Inetpub\wwwroot\ebiao目录(假如你的IIS装在C:\下),按右键,点属性菜单,点安全页签,在名称列表中选中Everyone,然后将下面的权限列表中的允许这一列都勾上,按确定即可. (注:此步不做的话,则无法保存报表文件) 。
e表 for .J2EE版的集成
1复制系统文件
将ebiao 目录下的所有文件复制到自己系统的webapps目录下。
2数据库连接
系统可以配置一个默认的数据库连接,当数据集中没有指定连接串时用它。默认的数据库连接串在fc.properties文件中配置:
driver=oracle.jdbc.driver.OracleDriver
ccerp.url=jdbc:oracle:thin:@localhost:1521:sys
ccerp.user=fcdemo
ccerp.password=fcdemo
ccerp.maxconn=100
ccerp.normalconn=2
conntimeout=3000
debug=false
mailhome=d:/
pagesize=15
addresssize=10
注意:如果是连oracle数据库,则应将
D:\fcsoft\tomcat\webapps\ebiao\ebsys\fceform\js\fcpub.js 文件,将第6行的
databaseTypeName : "sqlserver",
改成
databaseTypeName : "oracle",
然后保存即可.
运行报表
在报表设计器中设计好了报表文件后,可以通过在IE地址栏上直接输入:
http://localhost/ebiao/ebsys/fceform/ereport/ebrun.htm?file=/ebiao/ebsys/ebfile/test.htm
(注意:这个路径一般是对于e表 for .NET版而言的,对于e表 for J2EE版而言,往往需要加上端口号,如:http://localhost:8080/ebiao/ebsys/fceform/ereport/ebrun.htm?file=/ebiao/ebsys/ebfile/test.htm ,下同)
来运行,其中 test 为报表文件名。
/ebiao/ebsys/ebfile/为报表所在的路径。
如是含报表参数的报表,要在运行时自动带上报表参数,即不出一个界面来输入报表参数。这种情况下运行报表的格式如下:
http://localhost/ebiao/ebsys/fceform/ereport/ebrun.htm?file=/ebiao/ebsys/ebfile/samples/s_参数表单.htm&startdate=2005-02-01&urlpara=yes
在运行报表的URL中含有urlpara=yes 表示不会出现报表参数的输入界面。
startdate=2005-02-01 表示报表参数startdate的值为2005-02-01 ,在URL中未给值的报表参数将为报表中定义的默认值。
也可以
http://localhost/ebiao/ebsys/fceform/ereport/ebrun.htm?file=/ebiao/ebsys/ebfile/samples/s_参数表单.htm&startdate=2005-02-01
表示运行报表时先给好了startdate的参数值,但同时出报表参数输入界面,供操作员输入其它报表参数值。
在运行报表的URL后加上 &e_runsavefile=a1 则表示运行报表时会在服务器端将当前报表的运行结果保存为文件,主文件名为a1,具体是当报表结果分多页时,文件名为 a1_1.htm,a1_2.htm,a1_3.htm 等等,还同时保存 a1.xls a1.xlt和a1.pdf,对应为excel和pdf的报表内容。这些文件保存在默认的路径下,即 ebsys/fceform/ereport/js/loadreport.js 中配置的 fcpub.tempFilePath 。
通过运行报表的URL中也可以用 &宏变量名=宏值 的方式预置放宏变量的值。
在运行报表的URL后面加上 &e_pageno=2 表示直接显示报表结果中的第二页的内容,这个值为从1开始的整数,但当 &e_pageno=-1 表示将分页前的整个报表运算结果显示出来。而且以固定行列的方式显示,即非数据区固定不动,数据区超过窗口的宽度或高度时可以来回滚动查看。
用 &e_pageno=-1 来运行报表,一般用只需要显示报表运行结果的场合,此时不考虑分页和打印,因为是不分页输出,所以当数据量大时可能会很慢。
在运行报表时动态指定数据源
在同一个报表文件上要实现动态指定数据库连接串,这个可通过在运行报表的URL后面加上 &urldatasource=值 的方式来实现。这个值的格式是:
default //如有default表示要打开默认的数据库连接
<datasources>
<ds
dbencoding=\"GBK\"
dbtype=\"2\"
drivername=\"Provider=SQLOLEDB\"
encodesql=\"false\"
name=\"sqlserver1\"
password=\"\"
url=\"Data Source=localhost;Initial Catalog=ebtest\"
userid=\"sa\"
/>
… //可能有多个象上述ds格式的数据库连接串
</datasources>
上述格式的值因为直接写在URL上会不合法,所以需要用javascript函数escape后才行。例如:在URL后加上:
urldatasource=default%3Cdatasources%3E%3Cds%20dbencoding%3D%22GBK%22%20dbtype%3D%222%22%20drivername%3D%22Provider%3DSQLOLEDB%22%20encodesql%3D%22false%22%20name%3D%22sqlserver1%22%20password%3D%22%22%20url%3D%22Data%20Source%3Dlocalhost%3BInitial%20Catalog%3Debtest%22%20userid%3D%22sa%22/%3E%3C/datasources%3E
在运行报表时控制权限
在运行报表时常常需要控制权限,比如张三能运行A报表,李四则不能运行A报表。在e表中实现此功能是通过在 ebsys/fceformext/js/userfunc.js 中的
/**
* 控制能不能运行某个报表
**/
function EbiaoEnterStatus(callback)
函数中写代码来实现的。如运行报表的URL中是用name=报表名称的方式,则在此函数中就要用
parent.Request.QueryString("name").toString()
来取得当前运行报表的名称,如是用file=报表文件的方式,则在此函数中就要用
parent.Request.QueryString("file").toString()
来取得当前运行报表的文件,它是包含全路径的。
在此函数中先取session变量来取得当前用户信息。再判断能不能正常运行报表,如最后运行:
callback(true); //执行此命令表示能正常运行报表.
表示可以正常运行此报表,如最后运行:
callback(false); //通知关闭窗口
表示不可以正常运行此报表。
示例代码如下:
GetSession("username",function (arrRet){
var sessionValue = arrRet["username"];
if(sessionValue == "liuxm" && parent.Request.QueryString("name").toString() == "销售汇总报表" ){
alert("你无权运行此报表!");
callback(false); //通知关闭窗口
return;
}
callback(true);
})
配置运行报表的工具栏
运行报表的工具栏可以通过ebsys/fceform/ereport/js/loadreport.js 中的 fcpub.toolbar 变量的值来配置。也可加上自定义的功能按钮。
运行报表的工具栏的样式可以通过ebsys/fceform/ereport/js/loadreport.js 中的 fcpub.toolbarstyle 变量的值来配置。然后通过运行报表的URL后加上 &tbcss=red 之类的方式来指定工具栏的样式。共有:red, yellow, light, Office, blue, green, white, CoolBlue 等样式名称。
也可以在 ebsys/fceformext/js/userfunc.js 中的
/**
* 控制能不能运行某个报表
**/
function EbiaoEnterStatus(callback)
函数中写代码来实现根据不同的操作员的权限来显示不同的运行报表的工具栏按钮。即实现比如操作员为 张三 时不能有导出excel的功能。
写的代码的大体是通过取session变量的值来得到操作员的信息。然后再对 fcpub.toolbar 全局变量赋值,以控制运行报表的工具栏上出哪些按钮。
在iframe中运行报表
在ebsys/ebsamples/iframerun.htm中做了一个简单运行报表的示例页面,在一个htm文件中加上:
<iframe id=iframe1 src="../fceform/ereport/ebrun.htm?name=samples/s_数据集函数" width=0 height=0 ></iframe>
如你不需要看到报表的运行界面则让iframe的width height都为0,否则的话可以根据需要给定width height值。
然后在页面中加一个按钮:<button onclick="uf_test()">打印</button>
JS代码是:
function uf_test(){
//要调用运行报表工具栏的函数,可以用如下方式:
//其中,Print(4) 为运行报表工具栏窗口的全局的js函数.
window.frames("iframe1").toolbar.execScript("Print(4)");
}
现在的代码的功能是直接打印报表。
也可以做其它的工作,比如导出PDF文件等等。运行报表工具栏窗口提供的js函数有:
MovePage(1) 上一页
MovePage(2) 上一页
MovePage(3) 第一页
MovePage(4) 最后一页
Print(1) 打印预览
Print(2) 打印
Print(3) 直接打印
Print(4) 直接打印所有页
SaveasExcel(true) 分页导出到excel文件中
SaveasExcel(false) 不分页导出到excel文件中
SaveasPdf() 导出所有页到pdf文件中
实际上也就是工具栏上提供的功能函数。
修改报表
在报表设计器中设计好了报表文件后,可以通过在IE地址栏上直接输入:
http://localhost/ebiao/ebsys/fceform/ereport/ebdesign.htm?name=samples/s_simplelist
来直接在报表设计器中打开此报表来修改,其中 s_simplelist 为报表文件名,samples/为它的路径。
接口开发
将报表格式文件保存到数据库中
要将报表格式文件保存到数据库中,可以利用e表已写好的程序。作如下步骤的设置:
1 在默认数据源所对应的数据库中,建一个如下的表:
表名: e_reportfile
字段:
sName varchar(100) not null 主键
sText text null
sName 保存报表名,sText保存报表格式文件的内容
2 在下图界面上:
勾上[从数据库中读写报表格式文件],然后按确定。
这样报表格式文件的打开保存和运行就都是指从数据库的e_reportfile表中了。
自定义数据集
数据集的内容一般来说都是来自于一个SQL语句或存储过程的运行结果,但有时可能需要能自定义,比如来自一个xml数据,来自一个程序的运行结果。下面以报表格式文件: s_自定义数据集.htm 为例来说明。
打开s_自定义数据集.htm文件,进入数据集的[详细属性]中,可见到如下的界面图:
在此定义了两个参数:key,xmlfile。xmlfile标识 userds.xml文件的路径,此文件和s_自定义数据集 报表文件在同一目录下。要想运行此表,应修改 xmlfile 后的路径值,让它正确地找到userds.xml文件。
在e表 for .Net版本中的做法是:
然后再看看ebiaoext工程中的DesignReportEvent.cs文件中的如下函数:
/// 自定义数据集时会回调此函数,由参数来得到数据集的字段名列表和整个数据集的数据
/// <param name="prop">设置自定义数据集时定义的参数</param>
/// <param name="colNameList">字段名列表</param>
/// <param name="dataList">整个数据集的数据</param>
public static void UserDefineDataSet(System.Collections.Hashtable prop, out System.Collections.ArrayList colNameList,out System.Collections.ArrayList dataList )
在这个函数中输入prop参数,此参数能收到在自定义数据集时定义的参数及参数内容。如key和xmlfile, (string)prop["key"] == "loadxml" , (string)prop["xmlfile"] =="C:/Inetpub/wwwroot/WebBill/userds.xml" ;
在e表 for J2EE版本中的做法是:
在.fcsoft.report.ext包下有一个UserDs.java的示例文件中定义如下函数:
/// <summary>
/// 自定义数据集时会回调此函数,由参数来得到数据集的字段名列表和整个数据集的数据
/// </summary>
/// <param name="prop">设置自定义数据集时定义的参数</param>
/// <param name="colNameList">返回字段名列表</param>
/// <param name="dataList">返回整个数据集的数据</param>
public static void UserDefineDataSet(Hashtable prop ,ArrayList colNameList,ArrayList dataList)
在这个函数中输入prop参数,此参数能收到在自定义数据集时定义的参数及参数内容。如key和xmlfile, (String)prop.get("key") == "loadxml" , (String)prop.get("xmlfile") =="C:/Inetpub/wwwroot/WebBill/userds.xml" ;
在这个函数中输出 colNameList(字段名列表)和 dataList(整个数据集的数据),这两个都是ArrayList 型,但dataList的每个元素的内容是 Object[]。
由用户自已在这个函数中添加代码来实现由前台用户定义的参数(如key,xmlfile)来得到数据集的结果(即colNameList,dataList),
在这个示例中是实现读入xmlfile指定的xml文件来得到数据集。用户在自定义数据集时可以参考这个函数的内容来写。
定期运行报表的实现
e表内部提供了函数来实现成批的运行报表,并将报表结果保存为文件(含html ,xls,pdf等三种格式的文件)。
这个函数的输入参数为:
格式:
<filenames> <fn><in>原文件名</in><out>生成的文件名(不带.htm)</out>
<params> <p><name>参数名</name><value>参数值</value></p>
...
</params>
</fn>
...
</filenames>
<paths>
<config>econfig文件的路径</config>
<gen>生成的相对路径</gen>
<fromdb>yes/no</fromdb> //报表文件是否存在数据库中
<exptype>htm/xls/xlt/pdf/ *</exptype> //生成文件的类型,为*表示全部类型
</paths>
输入参数举例为:
<filenames>
<fn><in>/WebBill/ebsys/ebfile/samples/s_simplelist.htm</in><out>s_simplelist</out><params></params></fn>
<fn><in>/WebBill/ebsys/ebfile/samples/s_排名.htm</in><out>s_ordername</out><params></params></fn>
</filenames>
<paths>
<config>/WebBill/ebsys/fceform/ereport/econfig.xml</config>
<gen>/WebBill/ebsys/ebexpfile/</gen>
<fromdb>no</fromdb>
<exptype>htm</exptype>
</paths>
输出参数为:
格式:
<reportfile>
<name>报表文件名</name>
<pages>总页数</pages>
<errmsg>运行的错误信息</errmsg>
<genname>生成后的文件名(多页的为加上 _1...)</genname>
</reportfile>
...
输出参数举例为:
<reportfile>
<name>/WebBill/ebsys/ebfile/samples/s_simplelist.htm</name>
<pages>2</pages>
<errmsg></errmsg>
<genname>s_simplelist</genname>
</reportfile>
<reportfile>
<name>/WebBill/ebsys/ebfile/samples/s_排名.htm</name>
<pages>1</pages>
<errmsg></errmsg>
<genname>s_ordername</genname>
</reportfile>
此函数的调用方式为:
在前台的js的代码中调用,其中 txtXml.value 为输入参数值,运行后的输出参数也返回到 txtXml.value 中。
SendHttp(location.protocol+"//"+location.host + fcpubdata.servletPath + "/RunReport"+fcpubdata.dotnetVersion+"?key=genHtmlFile",txtXml.value,
function (result){
var sRet = result.value;
txtXml.value = sRet;
}
);
上述示例可以通过URL http://localhost/ebiao/ebsys/fceform/common/djframe.htm?djsn=eb_gen&djtype=PR
来运行。
装入已存好的报表结果页面
一般是先用上节的方式,成批的运行报表,并将报表结果保存为文件(含html ,xls,pdf等)。这步工作一般是在网络不忙时(如半夜)运行。当白天用户要看报表结果时就可以直接查看已经生成好的报表结果文件。
要查看已经生成好的报表结果文件,需要做如下工作:
1 生成的报表结果页面时,应将报表结果文件生成到ebsys\ebexpfile\目录下。且文件名为:,WebBill,ebsys,ebfile,samples,s_simplelist.xls 格式。其中WebBill中当前虚拟目录的名称。即为报表文件的路径中的/替换为,作为主文件名。当htm文件时,应为:,WebBill,ebsys,ebfile,samples,s_simplelist_1.htm 格式,主文件名加上_1表示第一页的内容。为:,WebBill,ebsys,ebfile,samples,s_simplelist_2.htm 表示第二页的内容,以此类推。报表结果文件按这种方式生成好。如下图:
2 按上述生成好后,只需要在IE的地址栏中输入:
http://localhost/WebBill/ebsys/fceform/ereport/ebrun.htm?file=/WebBill/ebsys/ebfile/samples/s_simplelist.htm&e_directrun=yes&e_pages=2
注意:此处假定虚拟目录名为:WebBill,需要根据自己的环境而变化。
得到如下的界面图:
在其中点击鼠标右键,点属性,可以看出是直接链接到:
http://localhost/WebBill/ebsys/ebexpfile/,WebBill,ebsys,ebfile,samples,s_simplelist_1.htm
即报表结果不是当时计算出来的,而是直接打开以前生成好的报表结果页面。
在这个报表运行工具栏上点导出到Excel文件和导出为pdf文件时也将是直接调用以前生成的Excel文件和pdf文件。
要点: 在运行报表URL中加上&e_directrun=yes表示直接打开已经生成好的报表结果文件。在运行报表URL中加上&e_pages=2表示这个报表的总页数为2,一般的流程是在生成报表结果文件时的返回的XML信息中含有报表的总页数,用户可以用程序将这报表的总页数先保存起来,可以保存到一个xml文件中,也可以保存到数据库的表中。然后在装入已存好的报表结果页面时再把这个报表的总页数取出来,拼成这种带&e_pages=2的URL运行报表串去运行。运行报表URL中有&e_pages=2必须在有&e_directrun=yes时才起作用。
含参数的报表的运算结果保存
对于含参数的报表来说,往往一个报表文件会对应多个报表结果文件。在这种情况下,需要这样做。
1 保存报表结果文件。在运行报表的URL后加上 &e_runsavefile=testsave 则表示会将本次报表的运行结果保存为文件(含多页的每个htm文件,两个excel文件,pdf文件),一般会在运行报表的URL上同时带上报表参数值(比如日期为:2007-08-01),则表示testsave文件(注意:testsave是主文件名)是日期为:2007-08-01时的报表运行结果文件。它默认情况下保存在ebsys\ebtmpfile\目录下。
2 上面说的是保存一个报表结果的情况,在现实中往往需要同时保存多个,这意味着要在一个报表运算完成后自动运算下一个。一般来说将报表放在iframe中运行,而且需要利用报表运算结束事件。如下:
*运行报表结束后事件
HandleAfterInitReport 函数名是固定名称,是在运行报表结束后就会调用此函数.
* oRet 用来返回一些报表运算结果数据给事件中供后续处理
* 现有: oRet.pages 可用来取得这个报表运算后的总页数
function HandleAfterInitReport(oRet)
成批保存报表结果的示例详见:\ebsys\ebsamples\iframesave.htm 文件。
3 运行报表的url后加上 e_directrun=主文件名, 表示直接读出在ebsys\ebtmpfile\目录下保存当前报表结果的文件。比如在 \ebsys\ebtmpfile\下保存了几个testsave的文件。它是 samples\s_simplelist 报表的运行结果文件。可以在IE的地址栏上写:
http://localhost/ebiao/ebsys/fceform/ereport/ebrun.htm?file=/ebiao/ebsys/ebfile/samples/s_simplelist.htm&e_directrun=testsave&e_pages=2
来调出来
4 如果要将报表结果保存到其它目录下,不保存到ebsys\ebtmpfile\目录下,可以这样做,比如先在ebsys目录下手工建一个子目录ebtmpfile1,让ebtmpfile1目录具有可写文件的权限。然后在 fceformext/js/userfunc.js 文件的function EbiaoEnterStatus(callback) 的开始处加上:
if(parent.Request.QueryString("e_runsavefile").toString() != "undefined" || (parent.Request.QueryString("e_directrun").toString() != "undefined" && parent.Request.QueryString("e_directrun").toString() != "yes") ){
fcpub.tempFilePath = GetUrlFirstPart() + "/ebsys/ebtmpfile1/";
}
其意思是在运行报表前调整全局变量 fcpub.tempFilePath的值到你的子目录。这样便可以将报表结果生成到自己指定的目录了。if(parent.Request.QueryString("e_runsavefile").toString() != "undefined" || (parent.Request.QueryString("e_directrun").toString() != "undefined" && parent.Request.QueryString("e_directrun").toString() != "yes") ){ 这个条件判断可以根据自己的需要而变动。
从运行报表工具栏上保存报表的运算结果
本节介绍如何实现在运行报表工具栏上加一个保存按钮,点此按钮后将运算结果保存为文件。
1 修改ebsys/fceform/ereport/js/loadreport.js文件的开始处的fcpub.toolbar变量的值,由:
"firstpage,prevpage,curpage,pages,nextpage,lastpage,|,preview,print,printdirect,printall,|,query,pageset,refresh,|,expexcel,expexcelall,exppdf"
改为
"firstpage,prevpage,curpage,pages,nextpage,lastpage,|,preview,print,printdirect,printall,|,query,pageset,refresh,save,|,expexcel,expexcelall,exppdf"
即在运行工具栏上加上了一个保存按钮。
2 点此保存按钮时,会执行 ebsys/fceformext/js/userfunc.js 文件中的 EbiaoSaveEvent() 函数,
此函数的内容如下:
/**
* 从工具栏上点保存按钮时执行此函数,它用保存当前报表运行结果时
**/
function EbiaoSaveEvent() {
//此处做弹出一个输入窗口工作,按确定关闭窗口后,将要保存的文件名传给下面的saveFileName变量,要保存的路径传给fcpub.tempFilePath变量,
var saveFileName = "curSave";//要保存的主文件名
RunReport(1,"保存",saveFileName,function (result){
var TotalPages = result.pages ; //总页数
var sRetValue = result.value ; //本次报表运行的参数与宏的xml字符串.
var sReportFile = parent.sPubPath; //本次运行的报表文件.
});
}
在此函数中,执行RunReport(1,"保存",saveFileName,function (result){}); 时会调用后台程序来保存文件,即相当于一个保存报表结果的方法,供你在需要的地方调用。保存完后会运行函数:
function (result){
var TotalPages = result.pages ; //总页数
var sRetValue = result.value ; //本次报表运行的参数与宏的xml字符串.
var sReportFile = parent.sPubPath; //本次运行的报表文件.
}
在此函数中可以取到后台返回的信息,这些信息可以保存起来供后面使用。
保存报表结果文件时注意:
1 报表结果文件的主文件名不能叫 yes ,因为当打开报表时用 &e_directrun=yes 表示固定打开“,”分割路径的报表结果文件。
2 报表结果文件的主文件名不能叫 undefined,因为它表示不存在。
3 报表结果文件的保存路径的层次是有规定的,因为当保存的报表是含有超级链接的话,一般这个超链接的地址是用相对路径来链接到 ebsys\fceform\ereport\ebrun.htm的.而要保证一致,就需要报表结果文件的保存路径的深度和ebrun.htm是一样的,即通过 ../../fceform/ereport/ebrun.htm 能找到ebrun.htm文件.
如何实现在运行报表时调整统计图功能
在ebfile/samples/动态统计图.htm 这个报表是实现在运行报表时调整统计图功能的,它主要是通过在单元格类型为统计图的单元格中,将它的公式定义为一个宏,如B5 =${macro1},然后通过在运行报表时动态地传递这个宏变量的值来达到动态统计图的目的。如用:
http://localhost/WebBill/ebsys/fceform/ereport/ebrun.htm?file=/WebBill/ebsys/ebfile/samples/动态统计图.htm¯o1=chart%28%22title%3Dxx%u793A%u4F8B%26xlabel%3Dc3%26title
展开阅读全文