Java后台报表尝试了很多,最终发现了一款,而且是开源的,简表地址:http://www.jatools.com/jor/。问题的引入:该报表支持嵌套,钻去,应对excel类似的报表,足够了。但是,报表的图表特别难看,所以想改一下,结合现在流行的图表Echart, 访问地址:http://echarts.baidu.com/, 开源了这个解决方案,和大家一起完善这个报表。

Jor 报表的设计:使用awt 展示报表,最终使用的是graphics 对象,然后使用jreport 等开源组件,实现导出pdf,导出word ,导出excel 等。

Echrt 的引入,Echart 是javascript 组件,然后执行javascript,使用echart 的getDataURL可以得到Echart 展示的图片的base64 编码,这样,结合读取图片,展示grahics ,就可以展示出来,然后顺便导出等等。Js这部分,可以根据绑定的数据源,动态写js 方法,修改html 文件,然后展示即可。

方案1:

使用HtmlUnit组件,即http://htmlunit.sourceforge.net/。 展示html ,加载js,然后导出base64编码。大致源码如下:

final WebClient webClient = new WebClient(BrowserVersion.CHROME);

            final HtmlPage page = webClient.getPage("http://localhost:8000/line2.html");

            System.out.println(" // 1 启动JS ");
webClient.getOptions().setJavaScriptEnabled(true);
System.out.println("// 2 禁用Css,可避免自动二次请求CSS进行渲染 ");
webClient.getOptions().setCssEnabled(false);
System.out.println("// 3 启动客户端重定向 ");
webClient.getOptions().setRedirectEnabled(true);
System.out.println("// 4 js运行错误时,是否抛出异常");
webClient.getOptions().setThrowExceptionOnScriptError(false);
System.out.println("// 5 设置超时 ");
webClient.getOptions().setTimeout(50000);
System.out.println(" 允许绕过SSL认证 ");
webClient.getOptions().setUseInsecureSSL(true);
System.out.println(" 允许启动注册组件 ");
webClient.getOptions().setActiveXNative(true); System.out.println(" //等待JS驱动dom完成获得还原后的网页 ");
webClient.waitForBackgroundJavaScript(5000); webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getCookieManager().setCookiesEnabled(true);
webClient.setAjaxController(new NicelyResynchronizingAjaxController()); webClient.addWebWindowListener( new WebWindowListener() {
@Override
public void webWindowOpened(WebWindowEvent webWindowEvent) {
System.out.println("windows opened");
} @Override
public void webWindowContentChanged(WebWindowEvent webWindowEvent) {
System.out.println("windows changed");
} @Override
public void webWindowClosed(WebWindowEvent webWindowEvent) {
System.out.println("windows closed");
}
}); try {
Thread.sleep(10000);
}catch (Exception exp) { }
final HtmlDivision div = page.getHtmlElementById("text2"); //执行按钮出发的js事件
ScriptResult sr = page.executeJavaScript("javascript:getData();"); try {
String fileStr = "";
String test = sr.getJavaScriptResult().toString();
byte[] b = new BASE64Decoder().decodeBuffer(test); // 生成图片
OutputStream out = new FileOutputStream(new File(fileStr + "\\test.png"));
out.write(b);
out.flush();
out.close();
}catch (Exception exp) {
exp.printStackTrace();
} }catch (Exception exp) {
exp.printStackTrace();
}

结果: 不行,执行不了js,原因没有深入研究。

方案2:

JDIC,https://www.ibm.com/developerworks/cn/java/j-jdic/ ,JDIC 是java 组件,可以展示html,执行javascript。

代码如下:

//BrowserEngineManager bem = BrowserEngineManager.instance();
// bem.setActiveEngine(BrowserEngineManager.IE);
//IBrowserEngine be = bem.getActiveEngine(); //URL url = new URL("http://www.hao123.com");
URL url = new File("http://localhost.:8000/line2.html").toURI().toURL();
final WebBrowser browser = new WebBrowser();
//browser = be.getWebBrowser();//new WebBrowser();
browser.addWebBrowserListener(new WebBrowserListener() {
public void downloadStarted(WebBrowserEvent event) {
System.out.println("27");
}
public void downloadCompleted(WebBrowserEvent event) {
System.out.println("30");
}
public void downloadProgress(WebBrowserEvent event) {
System.out.println("33");
}
public void downloadError(WebBrowserEvent event) {
System.out.println("36");
}
public void documentCompleted(WebBrowserEvent event) {
System.out.println("39");
browser.executeScript("alert('文档下载完毕!')");
String res = browser.executeScript("getData");
System.out.println(res);
}
public void titleChange(WebBrowserEvent event) {
System.out.println("43");
}
public void statusTextChange(WebBrowserEvent event) {
System.out.println("46");
}
public void windowClose(WebBrowserEvent webBrowserEvent) {
System.out.println("49");
}
public void initializationCompleted(WebBrowserEvent arg0) {
System.out.println("52");
} });
browser.setURL(url); JFrame f = new JFrame();
f.setTitle("浏览器");
f.setSize(800,600);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//f.getContentPane().add(browser1);
f.getContentPane().add(browser);
f.setVisible(true);
}

  

结果: 代码跑不起来,dll 都是32 位,没有办法使用,所以放弃。

方案3:

使用c# winform 的webbrowser 控件,加载html, 然后执行js脚本。

代码:

  private void init()
{
InitializeComponent();
CleanTempFiles();
webBrowser1.AllowWebBrowserDrop = false;
webBrowser1.WebBrowserShortcutsEnabled = false;
webBrowser1.IsWebBrowserContextMenuEnabled = false;
webBrowser1.Navigate(htmlurl + "?random=" + DateTime.Now.ToString("yyyyMMddHHmmss"), null, null, null);
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
try
{
var doc = this.webBrowser1.Document;
var ele = doc.GetElementById("text2");
Console.WriteLine(ele.InnerText);
// 读取base64 , 然后转换为图片,保存
string base64 = ele.InnerText.Split(',')[];
byte[] arr = Convert.FromBase64String(base64);
MemoryStream ms = new MemoryStream(arr);
Bitmap bmp = new Bitmap(ms); //bmp.Save(txtFileName + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
//bmp.Save(txtFileName + ".bmp", ImageFormat.Bmp);
//bmp.Save(txtFileName + ".gif", ImageFormat.Gif);
//bmp.Save(txtFileName + ".png", ImageFormat.Png);
// bmp.Save(imageGuid + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
bmp.Save(imageGuid + ".png", System.Drawing.Imaging.ImageFormat.Png);
ms.Close(); }catch(Exception exp)
{
Console.WriteLine(exp.ToString());
}
finally
{
Application.Exit();
}
}

结果: 可行, 导出图片成功, 所以采用。

接下来要做:

1,    实现所有图表,代码中只实现了linechart,其他,饼图,什么的都需要更改。

2,    增加脚步选项,直接在界面中设置js代码,高度定制。

开源地址:

https://github.com/gitsteven/jorreport-echart

简表-Java-Echart报表介绍的更多相关文章

  1. 葡萄城报表介绍:Java 报表

    一.Java 报表定义 Java 是一门面向对象编程语言,不仅吸收了 C++ 语言的各种优点,还摒弃了 C++ 里难以理解的多继承.指针等概念,因此 Java 语言具有功能强大和简单易用两个特征.Ja ...

  2. JAVA基本类库介绍

    我们曾经讲过,Java已经为编程者编制了许多类,这些类已经经过测试,基本上不存在错误,这些类都是我们编程的基础.如果不利用这些已存在的类,我们的 编程工作将变得异常复杂,所以我们应尽可能多的掌握Jav ...

  3. java.util.concurrent介绍【转】

    java.util.concurrent介绍   java.util.concurrent 包含许多线程安全.测试良好.高性能的并发构建块.不客气地说,创建 java.util.concurrent ...

  4. JDK框架简析--java.lang包中的基础类库、基础数据类型

    题记 JDK.Java Development Kit. 我们必须先认识到,JDK不过,不过一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含 ...

  5. EChart报表插件使用笔记(1)

    报表插件Echart java类 package com.spring.controller; import java.io.IOException; import java.util.Arrays; ...

  6. echart报表插件使用笔记(二)--按月统计

    按月统计注冊人数 java类: package com.spring.controller; import java.io.IOException; import java.sql.Connectio ...

  7. 记录面试龙腾简合-java开发工程师经历

    /** * ############ * 变强是会掉光头发的!现在的头发还是很茂盛,是该开心还是难过呢.. * ############ * / 总结下近期面试龙腾简合-java开发岗的经历.附上笔试 ...

  8. Java语言的介绍

    1. 计算机语言 语言:沟通交流的方式 计算机语言:人与计算机之间的交流方式 java是一门计算机编程语言,也是意大利自行车品牌 软件工程师,java开发工程师 <--------------- ...

  9. ionic3引用外部插件--百度地图及echart报表的使用

    前言 ionic3提供的组件已经相当丰富咯,但是事实上有些特殊的需求,比如使用百度地图,或者第三方插件echart报表插件是,就不能用传统的方式去使用第三方插件咯,如何在Ionic3项目中使用第三方J ...

随机推荐

  1. nodejs npm install -g 全局安装

    1. npm install xxx -g 时, 模块将被下载安装到[全局目录]中. [全局目录]通过 npm config set prefix "目录路径" 来设置. 比如说, ...

  2. Codeforces 932 E. Team Work(组合数学)

    http://codeforces.com/contest/932/problem/E 题意:   可以看做 有n种小球,每种小球有无限个,先从中选出x种,再在这x种小球中任选k个小球的方案数 选出的 ...

  3. zsh与oh-my-zsh是什么

    zsh是bash的增强版,其实zsh和bash是两个不同的概念.zsh更加强大. 通常zsh配置起来非常麻烦,且相当的复杂,所以oh-my-zsh是为了简化zsh的配置而开发的,因此oh-my-zsh ...

  4. Codeforces 238 div2 A. Gravity Flip

    题目链接:http://codeforces.com/contest/405/problem/A 解题报告:有n列箱子竖直放置,每列箱子上都有数量不等的箱子,这些箱子之间没有固定,当重力方向改为平行向 ...

  5. 【技巧总结】理解XXE从基础到盲打

    原文:http://agrawalsmart7.com/2018/11/10/Understanding-XXE-from-Basic-to-Blind.html 这篇文章中将讨论以下问题. XXE是 ...

  6. JS脚本病毒调试脚本-Trojan[Downloader]:JS/Nemucod

    1.前言 遇到Trojan[Downloader]:JS/Nemucod需要分析,这款病毒主要为js运行.从网上各种找js调试方法.发现52的帖子还挺沾边的. TrojanDownloader:JS/ ...

  7. GaN助力运营商和基站OEM实现5G sub-6GHz和mmWave大规模MIMO

    到2021年,估计全球会有更多的人拥有移动电话(55亿),将超过用上自来水的人数(53亿).与此同时,带宽紧张的视频应用将进一步增加对移动网络的需求,其会占移动流量的78%.使用大规模多输入多输出(M ...

  8. WPF的EventAggregator的发布和订阅

    EventAggregator是Prism中专门处理ViewModel与ViewModel之间事件传递的类对象,它提供了针对事件的发布方法和订阅方法,所以可以非常方便的来管理事件.下面分几步来实现相关 ...

  9. 浅介HTML DOM

    什么是DOM? DOM是Document Object Model(文档对象模型)的缩写. DOM是W3C(万维网联盟)的标准. DOM定义了访问HTML和XML文档的标准: “W3C文档对象模型(D ...

  10. 浅谈TCP拥塞控制算法

    TCP通过维护一个拥塞窗口来进行拥塞控制,拥塞控制的原则是,只要网络中没有出现拥塞,拥塞窗口的值就可以再增大一些,以便把更多的数据包发送出去,但只要网络出现拥塞,拥塞窗口的值就应该减小一些,以减少注入 ...