温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么通过java实现highcharts导出图片至excel

发布时间:2021-09-26 16:30:08 来源:亿速云 阅读:165 作者:小新 栏目:编程语言

这篇文章主要为大家展示了“怎么通过java实现highcharts导出图片至excel”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么通过java实现highcharts导出图片至excel”这篇文章吧。

1. 目的

通过java后台实现将前端页面的highcharts图表导出至生成的excel文件中。使用于报表页面导出类功能。

2. 说明

前端页面将图表的svg信息字符串作为参数传递后台使用batik工具包生成图片使用poi工具包操作excel

3. 使用jar包

1.batik-all-1.7.jar

2.poi-3.12.jar

3.commons-codec-1.12.jar

不导入不会报错,但使用时异常,提示信息:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/codec/digest/DigestUtils at org.apache.poi.hssf.usermodel.HSSFWorkbook.addPicture(HSSFWorkbook.java:1575)

4. 实现

第一部分实现svg生成图片到磁盘;第二部分实现将磁盘上的图片读取到创建的excel;第三部分直接将svg信息读取并输出到excel,是上面二者的合并,省略了存至磁盘的过程。

4.1 将svg导出图片

代码:

import org.apache.batik.transcoder.TranscoderException;import org.apache.batik.transcoder.TranscoderInput;import org.apache.batik.transcoder.TranscoderOutput;import org.apache.batik.transcoder.image.PNGTranscoder;import java.io.*;/***@Description: 将svg转换为png格式的图片*/public class SvgPngConverter {/***@Description: 将svg字符串转换为png*@Author:*@param svgCode svg代码*@param pngFilePath 保存的路径*@throws IOException io异常*@throws TranscoderException svg代码异常*/public static void convertToPng(String svgCode,String pngFilePath) throws IOException,TranscoderException {File file = new File (pngFilePath);FileOutputStream outputStream = null;try {file.createNewFile ();outputStream = new FileOutputStream (file);convertToPng (svgCode, outputStream);} finally {if (outputStream != null) {try {outputStream.close ();} catch (IOException e) {e.printStackTrace ();}}}}/***@Description: 将svgCode转换成png文件,直接输出到流中*@param svgCode svg代码*@param outputStream 输出流*@throws TranscoderException 异常*@throws IOException io异常*/public static void convertToPng(String svgCode,OutputStream outputStream) throws TranscoderException,IOException{try {byte[] bytes = svgCode.getBytes ("UTF-8");PNGTranscoder t = new PNGTranscoder ();ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);TranscoderInput input = new TranscoderInput (byteArrayInputStream);TranscoderOutput output = new TranscoderOutput (outputStream);t.transcode (input, output);outputStream.flush ();} finally {if (outputStream != null) {try {outputStream.close ();} catch (IOException e) {e.printStackTrace ();}}}}public static void main(String[] args) {StringBuilder svgStr = ""; // 图表的svg字符串,一般较长,此处省略String path = "H:\\svg1.png";try {convertToPng(svgStr, path);} catch (IOException e) {e.printStackTrace();} catch (TranscoderException e) {e.printStackTrace();}}}

效果:

图片内容:

4.2 读取图片输出至excel

代码:

import org.apache.poi.hssf.usermodel.HSSFClientAnchor;import org.apache.poi.hssf.usermodel.HSSFPatriarch;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;/***@Description: 读取磁盘中图片到excel*/public class ExcelImageTest {public static void main(String[] args) {FileOutputStream fileOut = null;BufferedImage bufferImg = null;//先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArraytry {ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();bufferImg = ImageIO.read(new File("H:/svg1.png"));ImageIO.write(bufferImg, "png", byteArrayOut);HSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet1 = wb.createSheet("test picture");//画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)HSSFPatriarch patriarch = sheet1.createDrawingPatriarch();//anchor主要用于设置图片的属性HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 255, 255,(short) 1, 1, (short) 7, 10);anchor.setAnchorType(3);//插入图片patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));fileOut = new FileOutputStream("H:/测试Excel.xls");// 写入excel文件wb.write(fileOut);System.out.println("----Excle文件已生成------");} catch (Exception e) {e.printStackTrace();}finally{if(fileOut != null){try {fileOut.close();} catch (IOException e) {e.printStackTrace();}}}}}

说明:

方法中HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 255, 255,(short) 1, 1, (short) 7, 10)表示要将图片插入至excel时的位置。

方法为:public HSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2) {},

参数如下:

int row 1:图片左上角所在单元格行数(值为1,即2行);short col1:图片左上角所在单元格列数(值为1,即B列);int row2:图片右下角所在单元格行数(值为10,即11行);short col2:图片右下角所在单元格列数(值为7,即H列);int dx1:图片左上角距(B,2)单元格左上角行向距离;int dy1:图片左上角距(B,2)单元格左上角列向距离;int dx2:图片右下角距(H,11)单元格左上角的行向距离;int dy2:图片右下角距(H,11)单元格左上角的列向距离;

4.3 直接将图表导出至excel

代码:

import org.apache.batik.transcoder.TranscoderInput;import org.apache.batik.transcoder.TranscoderOutput;import org.apache.batik.transcoder.image.PNGTranscoder;import org.apache.poi.hssf.usermodel.HSSFClientAnchor;import org.apache.poi.hssf.usermodel.HSSFPatriarch;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import java.io.*;/***@Description: 直接将svg信息转为图片添加至excel*/public class SvgToExcelPng {public static void main(String[] args) {FileOutputStream fileOut;try {String svgStr = ""; // 图表的svg字符串,一般较长,此处省略byte[] bytes = svgStr.getBytes ("UTF-8");ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();PNGTranscoder t = new PNGTranscoder ();TranscoderInput input = new TranscoderInput (new ByteArrayInputStream(bytes));TranscoderOutput output = new TranscoderOutput (byteArrayOut);t.transcode (input, output);HSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet1 = wb.createSheet("test picture");//画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)HSSFPatriarch patriarch = sheet1.createDrawingPatriarch();//anchor主要用于设置图片的属性HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 255, 255,(short) 1, 1, (short) 7, 10);anchor.setAnchorType(3);//插入图片patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));fileOut = new FileOutputStream("H:/测试Excel2.xls");// 写入excel文件wb.write(fileOut);System.out.println("----Excle文件已生成------");} catch (Exception e) {e.printStackTrace();}}}

以上是“怎么通过java实现highcharts导出图片至excel”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI