Java生成圖表(JFreeChart、PhantomJS)

最近領導讓倒騰java生成pdf報告,裏面有幾個圖表須要生成,雷達圖柱狀圖之類的。。。javascript

百度了一會有好幾種方式,我一開始用的JFreeChart效果大概是這樣

貼一哈代碼

package cn.exrick.xboot.common.utils;

import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.SpiderWebPlot;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.RectangleEdge;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * @MethodName: 生成雷達圖、柱狀圖工具類
 * @Description: TODO
 * @Param: 
 * @Return: 
 * @Author: Jiangsy
 * @Date: 2019/8/7
**/
public class JFrameUtils {

    public static void main(String args[]) {
        JFrame jf = new JFrame();
        jf.add(erstelleSpinnenDiagramm());
        jf.pack();
        jf.setVisible(true);//true會彈出預覽的彈層,false就不彈出了
        savePic(jf);
        // jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//退出應用程序
        //你關了窗口線程中止,可是實際項目裏,不會彈出圖片,只是生成,這個是終止線程
        System.exit(0);
    }

    public static JPanel erstelleSpinnenDiagramm() {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        String group1 = "企業信用風險指數(ECRI)";

        dataset.addValue(70, group1, "商業信息(70%)");
        dataset.addValue(80, group1, "財務信息(80%)");
        dataset.addValue(40, group1, "付款信息(40%)");
        dataset.addValue(30, group1, "公共記錄(30%)");
        dataset.addValue(65, group1, "經營信息(65%)");

        //SpiderWebPlot spiderwebplot1 = new SpiderWebPlot(dataset);

        MySpiderWebPlot mySpiderWebPlot = new MySpiderWebPlot(dataset);
        JFreeChart jfreechart = new JFreeChart("企業信用風險指數", TextTitle.DEFAULT_FONT,mySpiderWebPlot, false);
        LegendTitle legendtitle = new LegendTitle(mySpiderWebPlot);
        legendtitle.setPosition(RectangleEdge.BOTTOM);
        jfreechart.addSubtitle(legendtitle);

        ChartPanel chartpanel = new ChartPanel(jfreechart);
        return chartpanel;
    }


    public static void savePic(JFrame jf){
        //獲得窗口內容面板
        Container content=jf.getContentPane();
        //建立緩衝圖片對象
        BufferedImage img=new BufferedImage(
                jf.getWidth(),jf.getHeight(),BufferedImage.TYPE_INT_RGB);
        //獲得圖形對象
        Graphics2D g2d = img.createGraphics();
        //將窗口內容面板輸出到圖形對象中
        content.printAll(g2d);
        //保存爲圖片
        File f=new File("/project/111.jpg");
        try {
            ImageIO.write(img, "jpg", f);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //釋放圖形對象
        g2d.dispose();
    }
}

複製代碼

pom依賴

<dependency>
        <groupId>org.jfree</groupId>
        <artifactId>jfreechart</artifactId>
        <version>1.0.19</version>
    </dependency>
複製代碼

效果不太好看吧,第二種方式是利用phantomjs執行js代碼,調用echarts生成圖表

PhantomJS是一個基於webkit的javascript API。它使用QtWebKit做爲它核心瀏覽器的功能,使用webkit來編譯解釋執行JavaScript代碼html

echarts官網:www.echartsjs.com/java

PhantomJS:phantomjs.org/download.ht…jquery

先看一下雷達圖的demoweb

我是mac,配置一下PhantomJS環境變量先
    
    1.執行  phantomjs echarts-convert.js -infile /project/222.json -outfile /project/echarts-chart1.png -scale 0.01 -width 600
    
    echarts-convert.js  --這是須要用到的echarts轉換的js
    /project/222.json     -- 從echarts官網把左邊的options複製出來新建txt,json文件均可以(本身修改options內容)
    /project/echarts-chart1.png  -- 生成圖表存儲的路徑
    -width 600  -- 圖片寬度
複製代碼

所需文件列表

須要jquerymin.js和echarts的js,放同級目錄就好。json

用java實現 思路就是調起cmd命令,執行,生成的圖片保存到指定路徑,後續邏輯可自行讀取圖片,大概這個意思瀏覽器

String cmd = (代碼裏須要寫完整路徑)"phantomjs " + convert.js的路徑 + " -infile " + option內容的文件路徑 + " -outfile " + 生成圖片保存的路徑;

    Process process = Runtime.getRuntime().exec(cmd);
複製代碼

若是圖片出現方框亂碼的話安裝一下字體支持

yum install bitmap-fonts bitmap-fonts-cjk
複製代碼
相關文章
相關標籤/搜索