簡表-Java-Echart報表介紹

Java後臺報表嘗試了不少,最終發現了一款,並且是開源的,簡表地址:http://www.jatools.com/jor/。問題的引入:該報表支持嵌套,鑽去,應對excel相似的報表,足夠了。可是,報表的圖表特別難看,因此想改一下,結合如今流行的圖表Echart, 訪問地址:http://echarts.baidu.com/, 開源了這個解決方案,和你們一塊兒完善這個報表。javascript

 

Jor 報表的設計:使用awt 展現報表,最終使用的是graphics 對象,而後使用jreport 等開源組件,實現導出pdf,導出word ,導出excel 等。html

 

Echrt 的引入,Echart 是javascript 組件,而後執行javascript,使用echart 的getDataURL能夠獲得Echart 展現的圖片的base64 編碼,這樣,結合讀取圖片,展現grahics ,就能夠展現出來,而後順便導出等等。Js這部分,能夠根據綁定的數據源,動態寫js 方法,修改html 文件,而後展現便可。java

 

方案1:git

使用HtmlUnit組件,即http://htmlunit.sourceforge.net/。 展現html ,加載js,而後導出base64編碼。大體源碼以下:github

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,緣由沒有深刻研究。web

 

方案2:c#

JDIC,https://www.ibm.com/developerworks/cn/java/j-jdic/ ,JDIC 是java 組件,能夠展現html,執行javascript。windows

代碼以下:瀏覽器

//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 位,沒有辦法使用,因此放棄。echarts

 

方案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(',')[1];
                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

相關文章
相關標籤/搜索