Java后台批量生产echarts图表并保存图片

 更新时间:2020年05月28日 14:42:43   作者:zengyif_szu  
这篇文章主要介绍了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); // \r\n即为换行
      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,”

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • redisson实现分布式锁原理

    redisson实现分布式锁原理

    本文将详细介绍redisson实现分布式锁原理。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • SpringCloud中的Seata基本介绍与安装教程

    SpringCloud中的Seata基本介绍与安装教程

    Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务,这篇文章主要介绍了SpringCloud之Seata基本介绍与安装,需要的朋友可以参考下
    2024-01-01
  • Java中replace与replaceAll的区别与测试

    Java中replace与replaceAll的区别与测试

    replace和replaceAll是JAVA中常用的替换字符的方法,下面这篇文章主要给大家介绍了关于Java中replace与replaceAll的区别与测试,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Java结构型设计模式中的适配器模式与桥接模式解析

    Java结构型设计模式中的适配器模式与桥接模式解析

    这篇文章主要介绍了Java结构型设计模式中的适配器模式与桥接模式,结构型设计模式是从程序的结构上解决模块之间的耦合问题,需要的朋友可以参考下
    2016-02-02
  • Java图片批量压缩像素的实现方法

    Java图片批量压缩像素的实现方法

    我们开发中经常会遇到原图清晰度高,考虑到效率问题,我们不可能拿原图进行显示,服务端一般都要对图片进行压缩处理,然后发送给客户端显示,这篇文章主要给大家介绍了关于Java图片批量压缩像素的实现方法,需要的朋友可以参考下
    2021-12-12
  • 如何解决Spring MVC中响应乱码问题

    如何解决Spring MVC中响应乱码问题

    这篇文章主要介绍了如何解决Spring MVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • SpringBoot @ExceptionHandler与@ControllerAdvice异常处理详解

    SpringBoot @ExceptionHandler与@ControllerAdvice异常处理详解

    在Spring Boot应用的开发中,不管是对底层数据库操作,对业务层操作,还是对控制层操作,都会不可避免的遇到各种可预知的,不可预知的异常需要处理,如果每个处理过程都单独处理异常,那么系统的代码耦合度会很高,工作量大且不好统一,以后维护的工作量也很大
    2022-10-10
  • Java报错Java.net.SocketTimeoutException的几种解决方法

    Java报错Java.net.SocketTimeoutException的几种解决方法

    在 Java 网络编程中,SocketTimeoutException 通常表示在进行网络操作时,等待响应的时间超过了设定的超时时间,本文将深入探讨 Java.net.SocketTimeoutException 的问题,并为开发者和环境配置者提供详细的解决方案,需要的朋友可以参考下
    2024-10-10
  • Java实现文件上传的方法总结

    Java实现文件上传的方法总结

    这篇文章主要为大家介绍了三种Java实现文件上传的方法,文中的示例代码讲解详细,对我们的学习或工作有一定的借鉴价值,感兴趣的可以了解一下
    2023-04-04
  • Java并发CopyOnWrite容器原理解析

    Java并发CopyOnWrite容器原理解析

    这篇文章主要介绍了Java并发CopyOnWrite容器原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01

最新评论