重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要为大家展示了“怎么通过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”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!