zoukankan      html  css  js  c++  java
  • java后台生成echarts图表并保存图片

    一个围绕统计分析功能的系统,在最后制作统计分析时需要一个批量点击的功能,用以批量制作echarts图形后生成图片并保存图形和图片。方便后续导出。

    public class EchartsUtils {
        private static final String JSpath = "C:\echarts-convert\echarts-convert1.js";
    
    
        public static void main(String[] args) {
            String imgName = "D:/平台/tes" + UUID.randomUUID().toString().substring(0, 4) + ".png ";
            String option = "{xAxis: {type: 'category',data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']},yAxis: {type: 'value'},series: [{data: [820, 932, 901, 934, 1290, 1330, 1320],type: 'line'}]}";
            //String options = "test";
            String base64Img = generateEChart(option,1600,900);
            System.out.println(base64Img);
        }
    
    
        public static String generateEChart(String options,int width,int height) {
    
            String fileName= "test-"+UUID.randomUUID().toString().substring(0, 8) + ".png";
            String imgPath = "D:/平台/img/" +fileName;
    
            String dataPath = writeFile(options);//数据json
            try {
                File file = new File(imgPath);     //文件路径(路径+文件名)
                if (!file.exists()) {   //文件不存在则创建文件,先创建目录
                    File dir = new File(file.getParent());
                    dir.mkdirs();
                    file.createNewFile();
                }
                String cmd = "phantomjs " + JSpath + " -infile " + dataPath + " -outfile " + imgPath + " -width " + width + " -height " + height;
                System.out.println(cmd);
                Process process = Runtime.getRuntime().exec(cmd);
                BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String line = "";
                while ((line = input.readLine()) != null) {
                    //System.out.println(line);
                }
                input.close();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                String base64Img = ImageToBase64(imgPath);
    
                //deleteFile(imgPath);
                //deleteFile(dataPath);
                return base64Img.replaceAll("\s*", "");
            }
        }
    
        public static String writeFile(String options) {
            String dataPath="D:/平台/data/data"+ UUID.randomUUID().toString().substring(0, 8) +".json";
            try {
                /* 写入Txt文件 */
                File writename = new File(dataPath); // 相对路径,如果没有则要建立一个新的output.txt文件
                if (!writename.exists()) {   //文件不存在则创建文件,先创建目录
                    File dir = new File(writename.getParent());
                    dir.mkdirs();
                    writename.createNewFile(); // 创建新文件
                }
                BufferedWriter out = new BufferedWriter(new FileWriter(writename));
                out.write(options); // 
    即为换行
                out.flush(); // 把缓存区内容压入文件
                out.close(); // 最后记得关闭文件
            } catch (IOException e) {
                e.printStackTrace();
            }
            return dataPath;
        }
    
        /**
         * 图片文件转为base64
         * @param imgPath
         */
        private static String ImageToBase64(String imgPath) {
            byte[] data = null;
            // 读取图片字节数组
            try {
                InputStream in = new FileInputStream(imgPath);
                data = new byte[in.available()];
                in.read(data);
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 对字节数组Base64编码
            BASE64Encoder encoder = new BASE64Encoder();
            // 返回Base64编码过的字节数组字符串
            return encoder.encode(Objects.requireNonNull(data));
        }
    
        /**
         * 删除文件
         *
         * @param pathname
         * @return
         * @throws IOException
         */
        public static boolean deleteFile(String pathname){
            boolean result = false;
            File file = new File(pathname);
            if (file.exists()) {
                file.delete();
                result = true;
                System.out.println("文件已经被成功删除");
            }
            return result;
        }
    }
    

      因为是需要保存base64图片。所以在生成并读取完毕后将图片删除。

      附上图片转base64方法:

        /**
         * 图片文件转为base64
         * @param imgPath
         */
        private static String ImageToBase64(String imgPath) {
            byte[] data = null;
            // 读取图片字节数组
            try {
                InputStream in = new FileInputStream(imgPath);
                data = new byte[in.available()];
                in.read(data);
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 对字节数组Base64编码
            BASE64Encoder encoder = new BASE64Encoder();
            // 返回Base64编码过的字节数组字符串
            return encoder.encode(Objects.requireNonNull(data));
        }
    

      转换后的编码没有头,需要在保存时手动添加“data:image/png;base64,”

    转载自:https://blog.csdn.net/zengyif_szu/article/details/81942799

  • 相关阅读:
    无向图判断割点
    C
    连通图 求至少有给几个点信息才能传遍全图,至少添加几条边才能使全图联通
    线段树区间更新(set暴力)
    A
    辗转相除法(数学推理)
    Python List index()方法
    Python List extend()方法
    Python List count()方法
    Python List append()方法
  • 原文地址:https://www.cnblogs.com/emojio/p/12433224.html
Copyright © 2011-2022 走看看