1. 目的

根据已有数据,手动(java后台)生成图表至excel并导出。用于后台查询到数据后直接创建图表,可以代替直接使用图表信息字符串。

2. 说明

使用jfree图表绘制类库绘制图表,并生成到本地或读取至输出流用于在excel中生成;

使用poi操作excel;

3. 使用jar包

使用maven管理jar包,主要包含poi和jfree:

3.11

org.apache.poi

poi

${poi-version}

org.apache.poi

poi-ooxml

${poi-version}

org.apache.poi

poi-ooxml-schemas

${poi-version}

org.apache.poi

ooxml-schemas

1.1

jfree

jcommon

1.0.16

jfree

jfreechart

1.0.13

4. 实现

4.1 生成饼图

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 org.jfree.chart.ChartFactory;

import org.jfree.chart.ChartUtilities;

import org.jfree.chart.JFreeChart;

import org.jfree.chart.labels.StandardPieSectionLabelGenerator;

import org.jfree.chart.plot.PiePlot;

import org.jfree.data.general.DefaultPieDataset;

import java.awt.*;

import java.io.ByteArrayOutputStream;

import java.io.FileOutputStream;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

public class TestPoiAndJfreeChart {

public static void main(String[] args) throws Exception {

// excel2003工作表

HSSFWorkbook wb = new HSSFWorkbook();

// 创建工作表

HSSFSheet sheet = wb.createSheet("Sheet 1");

// 创建字节输出流

ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();

//如 果不使用Font,中文将显示不出来

Font font = new Font("新宋体", Font.BOLD, 15);

// 创建数据:饼状图就是名称和值(比例)

Map map=new HashMap();

map.put("录播主机", (double) 1000);

map.put("编码器", (double) 700);

map.put("摄像机", (double) 600);

map.put("流转码服务器", (double) 400);

// 创建JFreeChart

JFreeChart chart = createPort("故障设备类型比例", map, font);

// 读取chart信息至字节输出流

ChartUtilities.writeChartAsPNG(byteArrayOut, chart, 600, 300);

// 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)

HSSFPatriarch patriarch = sheet.createDrawingPatriarch();

// anchor主要用于设置图片的属性

HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 2, (short) 1, (short) 12, (short) 15);

anchor.setAnchorType(3);

// 插入图片

patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_PNG));

// excel2003后缀

FileOutputStream fileOut = new FileOutputStream("h://myExcel4.xls");

wb.write(fileOut);

fileOut.close();

}

public static JFreeChart createPort(String title, Map datas, Font font) {

try {

Set> set = datas.entrySet();

DefaultPieDataset pds = new DefaultPieDataset();

Iterator iterator = set.iterator();

Map.Entry entry;

while (iterator.hasNext()) {

entry = (Map.Entry) iterator.next();

pds.setValue(entry.getKey().toString(), Double.parseDouble(entry.getValue().toString()));

}

// 生成一个饼图的图表:显示图表的标题、组装的数据、是否显示图例、是否生成贴士以及是否生成URL链接

JFreeChart chart = ChartFactory.createPieChart(title, pds, true, false, true);

// 设置图片标题的字体

chart.getTitle().setFont(font);

// 得到图块,准备设置标签的字体

PiePlot plot = (PiePlot) chart.getPlot();

//设置分裂效果,需要指定分裂出去的key

// plot.setExplodePercent("摄像机", 0.1); 分裂效果,可选

// 设置标签字体

plot.setLabelFont(font);

// 设置图例项目字体

chart.getLegend().setItemFont(font);

// 设置开始角度

// plot.setStartAngle(new Float(3.14f / 2f)); 开始角度,意义不大

//设置plot的前景色透明度

plot.setForegroundAlpha(0.7f);

//设置plot的背景色透明度

plot.setBackgroundAlpha(0.0f);

//设置标签生成器(默认{0})

//{0}:key {1}:value {2}:百分比 {3}:sum

plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}({1})/{2}")); // 一般在{1}后面加单位,如:{0}({1}次)/{2}

//将内存中的图片写到本地硬盘

// ChartUtilities.saveChartAsJPEG(new File("H:/a.png"), chart, 600, 300);

return chart;

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

}

饼图.png

4.2 生成折线图

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 org.jfree.chart.ChartFactory;

import org.jfree.chart.ChartUtilities;

import org.jfree.chart.JFreeChart;

import org.jfree.chart.plot.CategoryPlot;

import org.jfree.chart.plot.PlotOrientation;

import org.jfree.data.category.DefaultCategoryDataset;

import java.awt.*;

import java.io.ByteArrayOutputStream;

import java.io.FileOutputStream;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

public class TestPoiAndJfreeChart1 {

public static void main(String[] args) throws Exception {

// excel2003工作表

HSSFWorkbook wb = new HSSFWorkbook();

// 创建工作表

HSSFSheet sheet = wb.createSheet("Sheet 1");

// 创建字节输出流

ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();

//如 果不使用Font,中文将显示不出来

Font font = new Font("新宋体", Font.BOLD, 15);

// 创建数据

Map> datas =new HashMap>();

Map map1=new HashMap();

Map map2=new HashMap();

Map map3=new HashMap();

Map map4=new HashMap();

Map map5=new HashMap();

map1.put("故障数量", (double) 20);

map2.put("故障数量", (double) 30);

map3.put("故障数量", (double) 25);

map4.put("故障数量", (double) 50);

map5.put("故障数量", (double) 40);

//压入数据

datas.put("一月", map1);

datas.put("二月", map2);

datas.put("三月", map3);

datas.put("四月", map4);

datas.put("五月", map5);

JFreeChart chart = createPort("故障数量-时间曲线", datas, "月份", "故障次数(次)", font);

// 读取chart信息至字节输出流

ChartUtilities.writeChartAsPNG(byteArrayOut, chart, 600, 300);

// 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)

HSSFPatriarch patriarch = sheet.createDrawingPatriarch();

// anchor主要用于设置图片的属性

HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 2, (short) 1, (short) 12, (short) 15);

anchor.setAnchorType(3);

// 插入图片

patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_PNG));

// excel2003后缀

FileOutputStream fileOut = new FileOutputStream("h://myExcel5.xls");

wb.write(fileOut);

fileOut.close();

}

public static JFreeChart createPort(String title, Map> datas, String type, String unit, Font font) {

try {

DefaultCategoryDataset ds = new DefaultCategoryDataset();

Set>> set1 = datas.entrySet();

Iterator iterator1 = set1.iterator();

Iterator iterator2;

HashMap map;

Set> set2;

Map.Entry entry1;

Map.Entry entry2;

while (iterator1.hasNext()) {

entry1 = (Map.Entry) iterator1.next();

map = (HashMap) entry1.getValue();

set2 = map.entrySet();

iterator2 = set2.iterator();

while (iterator2.hasNext()) {

entry2 = (Map.Entry) iterator2.next();

ds.setValue(Double.parseDouble(entry2.getValue().toString()), entry2.getKey().toString(), entry1.getKey().toString());

}

}

//创建折线图,折线图分水平显示和垂直显示两种

// //2D折线图

JFreeChart chart = ChartFactory.createLineChart(title, type, unit, ds, PlotOrientation.VERTICAL, true, true, true);

// //3D折线图

// JFreeChart chart2 = ChartFactory.createLineChart3D(title, type, unit, ds, PlotOrientation.VERTICAL, true, true, false);

//设置整个图片的标题字体

chart.getTitle().setFont(font);

//设置提示条字体

font = new Font("宋体", Font.BOLD, 15);

chart.getLegend().setItemFont(font);

//得到绘图区

CategoryPlot plot = (CategoryPlot) chart.getPlot();

//得到绘图区的域轴(横轴),设置标签的字体

plot.getDomainAxis().setLabelFont(font);

//设置横轴标签项字体

plot.getDomainAxis().setTickLabelFont(font);

//设置范围轴(纵轴)字体

font = new Font("宋体", Font.BOLD, 18);

plot.getRangeAxis().setLabelFont(font);

// plot.setForegroundAlpha(1.0f);

return chart;

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

}

折线图.png

4.3 生成柱状图

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 org.jfree.chart.ChartFactory;

import org.jfree.chart.ChartUtilities;

import org.jfree.chart.JFreeChart;

import org.jfree.chart.labels.StandardPieSectionLabelGenerator;

import org.jfree.chart.plot.CategoryPlot;

import org.jfree.chart.plot.PiePlot;

import org.jfree.chart.plot.PlotOrientation;

import org.jfree.data.category.DefaultCategoryDataset;

import org.jfree.data.general.DefaultPieDataset;

import java.awt.*;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

public class TestPoiAndJfreeChart2 {

public static void main(String[] args) throws Exception {

// excel2003工作表

HSSFWorkbook wb = new HSSFWorkbook();

// 创建工作表

HSSFSheet sheet = wb.createSheet("Sheet 1");

// 创建字节输出流

ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();

//如 果不使用Font,中文将显示不出来

Font font = new Font("新宋体", Font.BOLD, 15);

// 创建数据

Map> datas =new HashMap>();

Map map1=new HashMap();

Map map2=new HashMap();

Map map3=new HashMap();

map1.put("故障数", (double) 1000);

map2.put("故障数", (double) 1300);

map3.put("故障数", (double) 1000);

//压入数据

datas.put("设备网络掉线", map1);

datas.put("CPU利用率高", map2);

datas.put("磁盘占用高", map3);

JFreeChart chart = createPort("故障类型比例",datas,"故障类型","数量单位(个)",font);

// 读取chart信息至字节输出流

ChartUtilities.writeChartAsPNG(byteArrayOut, chart, 600, 300);

// 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)

HSSFPatriarch patriarch = sheet.createDrawingPatriarch();

// anchor主要用于设置图片的属性

HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 2, (short) 1, (short) 12, (short) 15);

anchor.setAnchorType(3);

// 插入图片

patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_PNG));

// excel2003后缀

FileOutputStream fileOut = new FileOutputStream("h://myExcel6.xls");

wb.write(fileOut);

fileOut.close();

}

public static JFreeChart createPort(String title,Map> datas,String type,String danwei,Font font){

try {

//种类数据集

DefaultCategoryDataset ds = new DefaultCategoryDataset();

//获取迭代器:

Set>> set1 = datas.entrySet();

Iterator iterator1= set1.iterator();

Iterator iterator2;

HashMap map;

Set> set2;

Map.Entry entry1;

Map.Entry entry2;

while(iterator1.hasNext()){

entry1=(Map.Entry) iterator1.next();

map=(HashMap) entry1.getValue();

set2=map.entrySet();

iterator2=set2.iterator();

while (iterator2.hasNext()) {

entry2= (Map.Entry) iterator2.next();

ds.setValue(Double.parseDouble(entry2.getValue().toString()), entry2.getKey().toString(), entry1.getKey().toString());

}

}

//创建柱状图,柱状图分水平显示和垂直显示两种

JFreeChart chart = ChartFactory.createBarChart(title, type, danwei, ds, PlotOrientation.VERTICAL, true, true, true);

//设置整个图片的标题字体

chart.getTitle().setFont(font);

//设置提示条字体

font = new Font("宋体", Font.BOLD, 15);

chart.getLegend().setItemFont(font);

//得到绘图区

CategoryPlot plot = (CategoryPlot) chart.getPlot();

//得到绘图区的域轴(横轴),设置标签的字体

plot.getDomainAxis().setLabelFont(font);

//设置横轴标签项字体

plot.getDomainAxis().setTickLabelFont(font);

//设置范围轴(纵轴)字体

plot.getRangeAxis().setLabelFont(font);

plot.setForegroundAlpha(1.0f);

return chart;

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

}

柱状图.png

5. 补充

java生成图表_java实现将数据生成图表至excel导出相关推荐

  1. java传入数据库生成柱状图_Java读取数据库数据生成柱状图

    此案例是用swing显示数据的.须要引入jfreechart相关包.不同版本号可能包不同样.本人用的是 此案例在ssi框架下会报错,不用框架就没问题. Java后台逻辑代码: public class ...

  2. 数据分析可视化04 图表组件:Echarts数据可视化图表基础

    本课时是课程的第二个模块,环境部署篇的第一个课时.在第一部分的基础理论篇,我向你介绍了数据可视化分析的概念定义.方法体系和关键技术.接下来,我会带你了解基于开源框架,如何部署数据可视化分析的开发环境, ...

  3. Excel向数据库插入数据和数据库向Excel导出数据

    为了熟悉java里工作簿的相关知识点,所以找了"Excel向数据库插入数据和数据库向Excel导出数据"的功能来实现. 注意事项:1,mysql数据库: 2,需要导入的jar包有 ...

  4. java 复杂报表_Java+POI+模板”一:打造复杂Excel 报表

    1 设计思路 Java 对于Excel 的操作一般借助于POI 类库,由于有些报表的表头比较复杂,直接用POI 控制报表的生成比较困难,这时可以先制作Excel 报表模板,而后再通过Java 调用PO ...

  5. java excel 注解_Java中注解学习系列教程-5 excel导出优化初级阶段

    在上一篇文章中,我们实现了使用自定义注解导出Excel的小案例.但是有问题的.我们发现,如果对象属性中包含了date类型或者使用了枚举类.这个时候就会出问题.我们来看看问题所在: 是不是已经看到了结果 ...

  6. 根据children动态复杂表头excel导出_Java高级特性-注解:注解实现Excel导出功能

    注解是 Java 的一个高级特性,Spring 更是以注解为基础,发展出一套"注解驱动编程". 这听起来高大上,但毕竟是框架的事,我们也能用好注解吗? 的确,我们很少有机会自己写注 ...

  7. java echarts 生成图片_java如何在后台生成echarts图表?实际代码展示

    学习是一个永无止境的过程,关于java的学习更是如此.今天主要为大家介绍下,如何在java中后台生成echarts图表,并且为大家展示实际的操作流程. 首先说下它的适用情况:⑴.支持echart4.0 ...

  8. java模板变量_java freemarker + word 模板 生成 word 文档 (变量替换,数据的循环,表格数据的循环,以及图片的替换)...

    1,最近有个需求,动态生成 Word 文当并供前端下载,网上找了一下,发现基本都是用 word 生成 xml 然后用模板替换变量的方式 1.1,这种方式虽然可行,但是生成的 xml 是在是太乱了,整理 ...

  9. java webservice序列化_java – 可以用CXF生成可序列化的类吗?

    我在这里找到了解决方案,如果有人在将来需要它: 1.将此插件添加到pom.xml org.apache.cxf cxf-codegen-plugin ${cxf.version} generate-s ...

  10. java xml签名_Java使用DSA密钥对生成XML签名的方法

    本文实例讲述了Java使用DSA密钥对生成XML签名的方法.分享给大家供大家参考.具体实现方法如下: MainClass.java代码如下: import java.security.KeyPair; ...

最新文章

  1. php加图片源码_PHP添加文字水印或图片水印的水印类完整源代码与使用示例
  2. 4)公有成员\私有成员和静态成员
  3. v8 编译 linux,安装与编译 Javascript V8 Engine
  4. 流量分析_安恒八月月赛
  5. 一些常用UI控件汇总
  6. 论文浅尝 \ 联合知识图谱实例和本体概念的通用表示学习
  7. 里面怎么使用import引用_谈谈模块化的 require 和 import
  8. 下轮“双一流”将有高校下车?教育部最新说法来了!
  9. 51单片机交通灯(十字路口演示)
  10. Mac上Fortran环境搭建
  11. Allegro 制作 package
  12. 精简版oracle客户端程序
  13. Python编程实现预剪枝的CART决策树
  14. 关于jxls2.6.0的学习以及遇到的问题(八)
  15. ubuntu安装系分区,挂载磁盘
  16. excel输入 正在计算机,在Excel中输入内容后如何自动填写日期和时间
  17. 信息系统项目管理师考试核心考点汇总
  18. R语言 创建空的数据框
  19. 【WebGIS实例】(1)MapboxGL绘制端点有符号的线
  20. 运维是技术含量最低的岗位吗?自学应该看书还是看视频?答案都在这里!

热门文章

  1. html固定广告位置,创建固定位置弹出浮动广告的实例代码
  2. Linux 在线词典
  3. Office 2010 语言包 Office 2010 En english package 包含office professional plus所有组件,还有viso,project!
  4. 修改 xweibo 的memcache代码,让xweibo支持wincache,加快xweibo速度
  5. 黄山IE修复专家免费版 v9.3
  6. R变量相关性检验(Correlation Test)
  7. crio电压采集 labview_基于LabVIEW和CompactRIO开发的EDM过程控制器
  8. 来拥抱星辰大海吧!中国风云气象卫星系列数字藏品荣耀首发
  9. QT软件开发: 获取CPU序列号、硬盘序列号、主板序列号 (采用wmic命令)
  10. 疯狂Java讲义(阅读笔记)(第一章)