让数据成为企业发展的驱动力!

盈帆报表工具之如何第三方集成(报表集成)


盈帆报表工具之如何第三方集成

盈帆报表工具可快速的制作、生成报表可以整体打包,作为整体项目的一个模块,项目内部中使用代码调用进行模块化的项目集成,也可以作为单独的报表系统服务来进行项目集成。

盈帆报表工具作为单独的报表系统服务时,分为设计与展现两部分,设计部分是单独的在线设计器,根据实际需求是否进行设计器的集成。设计器主要负责报表的设计,同时可作为在线EXCEL来使用。展现部分主要是获取展示的报表内容,再进行集成显示。

盈帆报表作为单独系统服务时,提供以下几种方法进行集成:

一、跳过登陆界面直接登陆

直接使用下面请求方式,即可跳过登陆界面,直接登陆到相应的用户界面中。

http://IP:8099/efreport/loginWithoutPage?account=demo&password=123


说明:

account是登陆的账号password是相应用户的密码。


二、获取用户sessionid进行操作

获取sessionid

以JAVA为例:

public String getAuth() throws Exception {

      String sessionid = null;

      // 1、创建HttpClient

      CloseableHttpClient client = HttpClients.createDefault();

      // 2、封装请求参数

      List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>(2);

       //demo”是实际的用户名称

      list.add(new BasicNameValuePair("command", "demo"));

       //使用对称加密,”123”是账号“demo”的实际密码,"123456789ABCDEFG"是对称加密的KEY值。KEY"123456789ABCDEFG"必须是16位的,此KEY需要与webapps\ROOT\WEB-INF\classes\ application.properties文件里的AES.KEY一致

      list.add(new BasicNameValuePair("certificate", AES.encrypt("123", "123456789ABCDEFG")));

      // 3、转化参数

      UrlEncodedFormEntity refe = new UrlEncodedFormEntity(list, "UTF-8");

      // 4、创建HttpPost

      HttpPost post = new HttpPost("http:// IP:8099/efreport/authentication");

      post.setHeader("Accept", "text/plain;charset=UTF-8");

      // 5、设置参数

      post.setEntity(refe);

      // 6、执行请求

      CloseableHttpResponse resp = client.execute(post);

      // 7、获取实体

      HttpEntity entity = resp.getEntity();

      // 8、获取返回实体内数据

      String result = EntityUtils.toString(entity, "UTF-8");

      if ("OK".equals(result)) {

          Header[] headers = resp.getHeaders("Set-Cookie");

          String str = headers[0].getValue();

          sessionid = str.substring(0, str.indexOf(";"));

      }

      // 9、关闭

      resp.close();


      return sessionid;

   }


获取报表菜单树结构

"http:// IP:8099/efreport/r_menu;<%=global_session_id%>"


说明:

“http:// IP:8099/efreport/ r_ menu;”是服务器指定目录。

“<%=global_session_id%>”是获取的sessionid。


下图显示的是通过上述方式,返回的数据界面,用户报表菜单树的JSON格式。


JSON格式说明:

“path”:是当前模板的实际模板路径名称。

“name”:是模板在菜单中显示的名称。

“id”:是当前模板在数据库中的实际id

获取报表区域

通过获取的sessionid、模板名称、参数,获取当前用户可预览的报表。具体步骤如下:


//获取第一步的sessionid

String global_session_id = getAuth();

//实际请求(红色部分是实际的模板名称)

"http:// IP:8099/efreport/r_report;<%=global_session_id%>?file=<%=URLEncoder.encode("日期参数",
"UTF-8")%>&params="

带有实际的模板参数请求如下:

"http:// IP:8099/efreport/r_report;<%=global_session_id%>?file=<%=URLEncoder.encode("日期参数",
"UTF-8")%>&params=<%=URLEncoder.encode("param1=2016-1-10;param2=2018-05-01",
"UTF-8")%>"


下图显示的是通过带有参数的请求方式,返回的界面。


说明:

“http:// IP:8099/efreport/ r_report;”是服务器指定目录。

“<%=global_session_id%>”是获取的sessionid。

“?file=<%=URLEncoder.encode("日期参数", "UTF-8")%>”,其中日期参数是实际的模板名称。

“&param=<%=URLEncoder.encode("param1=361", "UTF-8")%>”实际的模板参数。” <%=URLEncoder.encode("param1=2016-1-10;param2=2018-05-01", "UTF-8")%>”参数值可不填写。” param1=2016-1-10;param2=2018-05-01”实际的模板用到的参数。


获取报表PDF文件

通过获取的sessionid、模板名称、参数,获取当前用户可预览的报表PDF文件。具体步骤如下:


//获取第一步的sessionid

String global_session_id = getAuth();

//实际请求

"http:// IP:8099/efreport/r_pdf;<%=global_session_id%>?file=<%=URLEncoder.encode("日期参数",
"UTF-8")%>"

带有实际的模板参数请求如下:

"http:// IP:8099/efreport/r_pdf;<%=global_session_id%>?file=<%=URLEncoder.encode("日期参数",
"UTF-8")%>&params=<%=URLEncoder.encode("param1=2016-1-10;param2=2018-05-01",
"UTF-8")%>"


说明:

“http:// IP:8099/efreport/r_pdf;”是服务器指定目录。

“<%=global_session_id%>”是获取的sessionid。

“?file=<%=URLEncoder.encode("日期参数", "UTF-8")%>”实际模板“日期参数”UTF8编码后的链接文本。

“&param=<%=URLEncoder.encode("param1=361", "UTF-8")%>”实际的模板参数。” <%=URLEncoder.encode("param1=2016-1-10;param2=2018-05-01", "UTF-8")%>”参数值可不填写。” param1=2016-1-10;param2=2018-05-01”实际的模板用到的参数。


获取报表EXCEL文件

通过获取的sessionid、模板名称、参数,获取当前用户可预览的报表EXCEL文件。具体步骤如下:


//获取第一步的sessionid

String global_session_id = getAuth();

//实际请求

"http:// IP:8099/efreport/r_excel;<%=global_session_id%>?file=<%=URLEncoder.encode("日期参数",
"UTF-8")%>"

带有实际的模板参数请求如下:

"http:// IP:8099/efreport/r_excel;<%=global_session_id%>?file=<%=URLEncoder.encode("日期参数",
"UTF-8")%>&params=<%=URLEncoder.encode("param1=2016-1-10;param2=2018-05-01",

"UTF-8")%>"


说明:

“http:// IP:8099/efreport/r_excel;”是服务器指定目录。

“<%=global_session_id%>”是获取的sessionid。

“?file=<%=URLEncoder.encode("日期参数", "UTF-8")%>”实际模板“日期参数”UTF8编码后的链接文本。

“&param=<%=URLEncoder.encode("param1=361", "UTF-8")%>”实际的模板参数。” <%=URLEncoder.encode("param1=2016-1-10;param2=2018-05-01", "UTF-8")%>”参数值可不填写。” param1=2016-1-10;param2=2018-05-01”实际的模板用到的参数。


注意事项:

如果是有参数的报表模板,调用时没有写参数,访问的实际地址是带有参数控件的页面。

具体请参照efreport-integration-demo/index.jspmenu.jspdf.jspexcel.jsp例子程序,如需查看效果,修改JSP文件里面的服务器IP地址即可。

三、无权限直接访问

获取公钥

使用http请求获取公钥

http:// IP:8099/efreport/thirdSys/getPublic

获取的公钥如下:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDmVtO9QRTBBVUzDzhtSU9aVjv46dlQUiMGZRt9uz0h/T1Ty6X2nF1on0EG7fUgg3yU+XepD/AQlZFzLtpuI7TPhA67CoecmhRhCdUHN4u6FOGhQjyNl9PPL1gYF4YwW94BX5HPKg1nOdpmkkB/pdJ5cpobjYD0R0xgelmG1nkRWQIDAQAB


说明:

重启tomcat后,公钥随机生成;每次重启tomcat后,请重新获取。


获取token

获取当前计算机时间GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数,使用RSA算法,获取token


   public String getToken() throws Exception {

//获取当前的毫秒数

      String data = String.valueOf(System.currentTimeMillis());

       //通过时间与公钥,使用RSA算法获取token

      String encryptData = RsaUtils.encrypt(data,RsaUtils.getPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDmVtO9QRTBBVUzDzhtSU9aVjv46dlQUiMGZRt9uz0h/T1Ty6X2nF1on0EG7fUgg3yU+XepD/AQlZFzLtpuI7TPhA67CoecmhRhCdUHN4u6FOGhQjyNl9PPL1gYF4YwW94BX5HPKg1nOdpmkkB/pdJ5cpobjYD0R0xgelmG1nkRWQIDAQAB"));

       

      return encryptData;

   }



获取报表区域

通过获取的token,模板名称,参数获取当前用户可预览的报表。


实际http请求如下:(红色部分是实际的模板名称)

http:// IP:8099/efreport/report/checkSheet?file=<%=URLEncoder.encode("日期参数","UTF-8")%>&params=&token=<%=getToken()%>

带有实际的模板参数请求如下:

http:// IP:8099/efreport/report/checkSheet?file=<%=URLEncoder.encode("日期参数","UTF-8")%>&params=<%=URLEncoder.encode("param1=2016-1-10;param2=2018-05-01","UTF-8")%>&token=<%=getToken()%>


下图显示的是通过带有参数的请求方式,返回的界面。

http:// IP:8099/efreport/report/checkSheet?file=%E6%97%A5%E6%9C%9F%E5%8F%82%E6%95%B0&params=param1%3D2016-1-10%3Bparam2%3D2018-05-01&token=JyraKnXWLabFB/5FYL13wJVhWBjcyAPkgtDySdcZ3xJHqKm7lekK0rbDw7WZ3ISUTcvAIaD4PJX9ynaFX8RDThU8gWow12uiBgmiC49iv2dIByd7vHMR/ml2YChEXs5wc5pxL+1iWxcFlybgX8szjfV0lxlDsa3hwJiLReVbkys=


说明:

http:// IP:8099/efreport/report/checkSheet”是服务器指定的报表目录。

“?file=<%=URLEncoder.encode("日期参数", "UTF-8")%>”,其中日期参数是实际的模板名称

“&param=<%=URLEncoder.encode("param1=361", "UTF-8")%>”实际的模板参数。” <%=URLEncoder.encode("param1=2016-1-10;param2=2018-05-01", "UTF-8")%>”参数值可不填写。” param1=2016-1-10;param2=2018-05-01”实际的模板用到的参数。

“&token=<%=getToken()%>”实际获取到的token


获取报表PDF文件

通过获取的token,模板名称,参数获取当前用户可预览的报表PDF文件。


实际http请求如下:

http:// IP:8099/efreport/report/checkPdf?file=<%=URLEncoder.encode("日期参数","UTF-8")%>&params=&token=<%=getToken()%>

带有实际的模板参数请求如下:

http:// IP:8099/efreport/report/checkPdf?file=<%=URLEncoder.encode("日期参数","UTF-8")%>&params=<%=URLEncoder.encode("param1=2016-1-10;param2=2018-05-01","UTF-8")%>&token=<%=getToken()%>


下图显示的是通过带有参数的实际请求地址:。

http:// IP:8099/efreport/report/ checkPdf?file=%E6%97%A5%E6%9C%9F%E5%8F%82%E6%95%B0&params=param1%3D2016-1-10%3Bparam2%3D2018-05-01&token=JyraKnXWLabFB/5FYL13wJVhWBjcyAPkgtDySdcZ3xJHqKm7lekK0rbDw7WZ3ISUTcvAIaD4PJX9ynaFX8RDThU8gWow12uiBgmiC49iv2dIByd7vHMR/ml2YChEXs5wc5pxL+1iWxcFlybgX8szjfV0lxlDsa3hwJiLReVbkys=


说明:

“http:// IP:8099/efreport/report/checkPdf”是服务器指定的报表目录。

“?file=<%=URLEncoder.encode("日期参数", "UTF-8")%>”实际模板“日期参数”UTF8编码后的链接文本。

“&param=<%=URLEncoder.encode("param1=361", "UTF-8")%>”实际的模板参数。” <%=URLEncoder.encode("param1=2016-1-10;param2=2018-05-01", "UTF-8")%>”参数值可不填写。” param1=2016-1-10;param2=2018-05-01”实际的模板用到的参数。

“&token=<%=getToken()%>”实际获取到的token。


获取报表EXCEL文件

通过获取的token,模板名称,参数获取当前用户可预览的报表EXCEL文件。


实际http请求如下:

http:// IP:8099/efreport/report/checkExcel?file=<%=URLEncoder.encode("日期参数","UTF-8")%>&params=&token=<%=getToken()%>

带有实际的模板参数请求如下:

http:// IP:8099/efreport/report/checkExcel?file=<%=URLEncoder.encode("日期参数","UTF-8")%>&params=<%=URLEncoder.encode("param1=2016-1-10;param2=2018-05-01","UTF-8")%>&token=<%=getToken()%>


下图显示的是通过带有参数的实际请求地址:。

http:// IP:8099/efreport/report/ checkExcel?file=%E6%97%A5%E6%9C%9F%E5%8F%82%E6%95%B0&params=param1%3D2016-1-10%3Bparam2%3D2018-05-01&token=JyraKnXWLabFB/5FYL13wJVhWBjcyAPkgtDySdcZ3xJHqKm7lekK0rbDw7WZ3ISUTcvAIaD4PJX9ynaFX8RDThU8gWow12uiBgmiC49iv2dIByd7vHMR/ml2YChEXs5wc5pxL+1iWxcFlybgX8szjfV0lxlDsa3hwJiLReVbkys=


说明:

“http:// IP:8099/efreport/report/checkExcel”是服务器指定的报表目录。

“?file=<%=URLEncoder.encode("日期参数", "UTF-8")%>”实际模板“日期参数”UTF8编码后的链接文本。

“&param=<%=URLEncoder.encode("param1=361", "UTF-8")%>”实际的模板参数。” <%=URLEncoder.encode("param1=2016-1-10;param2=2018-05-01", "UTF-8")%>”参数值可不填写。” param1=2016-1-10;param2=2018-05-01”实际的模板用到的参数。

“&token=<%=getToken()%>”实际获取到的token


注意事项:

最终获取的http请求页面时效默认是1小时,1小时过后此连接时效,需要重新获取token进行http请求,服务器“/webapps/efreport/WEB-INF/classes”目录下sys.properties文件中,可修改“timeOut”字段值,调整默认有效时间。

具体请参照efreport-integration-demo/ token.jsptokenPdf.jsptokenExcel.jsp例子程序,如需查看效果,先获取服务器的公钥,再修改JSP文件里面的服务器IP地址与相应公钥即可。


公开模板访问

设置模板公开

后台模板管理中,编辑模板,是否公开属性设置为“是”。

获取报表区域

通过模板名称、参数,获取报表。

实际http请求如下:

http://IP:8099/efreport/report/checkSheet?file=<%=URLEncoder.encode("日期参数","UTF-8")%>&params=

带有实际的模板参数请求如下:

http:// IP:8099/efreport/report/checkSheet?file=<%=URLEncoder.encode("日期参数","UTF-8")%>&params=<%=URLEncoder.encode("param1=2016-1-10;param2=2018-05-01","UTF-8")%>


下图显示的是通过带有参数的请求方式,返回的界面。

http:// IP:8099/efreport/report/checkSheet?file=%E6%97%A5%E6%9C%9F%E5%8F%82%E6%95%B0&params=param1%3D2016-1-10%3Bparam2%3D2018-05-01


说明:

“http:// IP:8099/efreport/report/checkSheet”是服务器指定的报表目录。

“?file=<%=URLEncoder.encode("日期参数", "UTF-8")%>”实际模板“日期参数”UTF8编码后的链接文本。

“&param=<%=URLEncoder.encode("param1=361", "UTF-8")%>”实际的模板参数。” <%=URLEncoder.encode("param1=2016-1-10;param2=2018-05-01", "UTF-8")%>”参数值可不填写。” param1=2016-1-10;param2=2018-05-01”实际的模板用到的参数。


注意事项:

如果是有参数的报表模板,调用时没有写参数,访问的实际地址是带有参数控件的页面。

具体请参照efreport-integration-demo/open.jsp例子程序,如需查看效果,修改JSP文件里面的服务器IP地址即可。


token接口访问设计器及报表

获取公钥

使用http请求获取公钥

http:// IP:口/efreport/thirdSys/getPublic

获取的公钥如下:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDmVtO9QRTBBVUzDzhtSU9aVjv46dlQUiMGZRt9uz0h/T1Ty6X2nF1on0EG7fUgg3yU+XepD/AQlZFzLtpuI7TPhA67CoecmhRhCdUHN4u6FOGhQjyNl9PPL1gYF4YwW94BX5HPKg1nOdpmkkB/pdJ5cpobjYD0R0xgelmG1nkRWQIDAQAB


说明:

重启tomcat后,公钥随机生成;每次重启tomcat后,请重新获取。


获取token

获取当前计算机时间GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数,使用RSA算法,获取token


   public String getToken() throws Exception {

//获取当前的毫秒数

      String data = String.valueOf(System.currentTimeMillis());

       //通过时间与公钥,使用RSA算法获取token

      String encryptData = RsaUtils.encrypt(data,RsaUtils.getPublicKey("实际的公钥"));

       

      return encryptData;

   }


获取所有模板

通过接口“http://IP:端口/efreport/template/getAllTemplates?token=&id=”获取所有模板信息。


说明:

token:实际获取到的token。

返回的JSON格式如下:[{name:模板名称,id:101},...],如图:

id:阈值,带上该参数,返回所有ID大于该ID的模板。


新建模板

通过接口“http://IP:端口/efreport/template/newTemplate?token=&name=”新建模板,返回状态信息。


说明:

token:实际获取到的token。

“name”:新的模板名称。需要使用URL编码。

返回的JSON格式如下:“{"state":"success/failed","message":"当state=success时,返回的是新建模板的ID"}”。


克隆模板

通过接口“http://IP:端口/efreport/template/cloneTemplates?token=&ids=”克隆传递的模板ID列表,返回克隆信息。


说明:

token:实际获取到的token。

ids:需要克隆报表的id列表。

返回JSON格式如下:“[{"oldName":"克隆的模板名称","cloneName":"克隆后的模板名称","oldID":90,"cloneID":1063},...]”,如图:


删除模板

通过接口“http://IP:端口/efreport/template/removeTemplate?token=&id=”删除所传递的模板,返回状态信息。


说明:

token:实际获取到的token。

id:需要删除的报表id。

返回的JSON格式如下:“{"state":"success/failed","message":"信息结果"}”。


模板重命名

通过接口“http://IP:端口/efreport/template/renameTemplate?token=&id=&name=”模板重命名,返回状态信息。


说明:

token:实际获取到的token。

id:需要重命名的报表id。

“name”:新的模板名称。需要使用URL编码。

返回的JSON格式如下:“{"state":"success/failed","message":"信息结果"}”。


访问报表

通过接口“http://IP:端口/efreport/report/viewReport?params=&token=&id=&exportJson=&buttonJson=”的方式可直接访问报表。


说明:

params:报表所需要的参数,可不填。传递参数时需要URL编码,参数格式如下:“[{"key":"userName","dataType":"String","value":"admin"}...]”,其中“key”代表实际的参数名称;“dataType”代表参数类型,可设置:“String”、“Int”、“Double”、“DateTime”、“Bool”;value代表实际要传递的值。

“token”:实际获取到的token。

id:访问的报表id。

exportJson:导出文件时的文件名称与sheet页的名称,可不填。传递参数时需要URL编码,参数格式如下:“{name:文件名称,SheetNames:[第一个sheet页名称,第二个sheet页名称,...]}”。

“buttonJson”:预览时工具栏按钮是否显示,可不填。传递参数时需要URL编码,参数内容如下:“{"showPrint":"Y"
,
"showExport":"Y","showPdf":"Y"
,"showExcel":"Y"
,"showExcel1":"Y"
,"showExcel2":"Y"
,"showWord":"Y","showMail":"Y","showSearch":"Y"}”。其中“showPrint”表示打印按钮;“showExport”表示导出按钮,如果此属性直接设置“N”,则导出按钮整体隐藏,并且“showPdf”、“showExcel”、“showExcel1”、“showExcel2”,“showWord”,“showMail”这些属性无效;“showPdf”表示导出PDF按钮;“showExcel”表示导出EXCEL(分页)按钮;“showExcel1”表示导出EXCEL(不分页)按钮;“showExcel2”表示导出EXCEL(分页转SHEET)按钮;“showWord”表示导出WORD按钮;“showMail”表示发送邮件按钮;“showSearch”表示查找按钮。


访问设计器

通过接口“http://IP:端口/efreport/designSys/design?isAdmin=&params=&token=&id=”的方式直接访问设计器。


说明:

“isAdmin”:是否使用管理者权限访问:”Y”是管理者权限,”N”普通设计器权限。管理者权限可以设置数据库连接信息,可以设置模板的数据集,设置服务器数据集等关于数据库层面的操作;普通设计器权限无法看到数据库层面的操作,只能使用。

params实际代入的用户参数。需要URL编码,可以不填写。参数格式如下:“[{"key":"userName","dataType":"String","value":"admin"}...]”,其中“key”代表实际的参数名称;“dataType”代表参数类型,可设置:“String”、“Int”、“Double”、“DateTime”、“Bool”;value代表实际要传递的值。

token实际的token值。

“id”打开设计器时,直接打开模板id。不此参数则认为是新建模板:“http://IP:端口/efreport/designSys/design?isAdmin=&params=&token=


注意事项:

如果是有参数的报表模板,调用时没有写参数,访问的实际地址是带有参数控件的页面。

具体请参照efreport-integration-demo/token1.jsp例子程序,如需查看效果,修改JSP文件里面的服务器IP地址以及公钥部分即可。


总结

通常情况下,如果只需要报表内容,可采取公开模板的方式,使用此方式可快速的获取报表内容,通过HTTP地址,直接查看报表内容。如果需要整体的设计器与相关的内容,可采用token接口方式来集成。

盈帆报表工具提供了以上几种集成方式最终用户可根据实际需求采取不同的方式集成到项目中,解决项目的报表需求。