|
|
|
@ -3,26 +3,37 @@ package com.hnac.hzims.operational.util;
|
|
|
|
|
import cn.afterturn.easypoi.entity.ImageEntity; |
|
|
|
|
import cn.hutool.core.lang.Assert; |
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
import org.apache.poi.xwpf.usermodel.XWPFTable; |
|
|
|
|
import org.jfree.chart.ChartFactory; |
|
|
|
|
import org.jfree.chart.ChartUtils; |
|
|
|
|
import org.jfree.chart.JFreeChart; |
|
|
|
|
import org.jfree.chart.StandardChartTheme; |
|
|
|
|
import org.jfree.chart.axis.CategoryAxis; |
|
|
|
|
import org.jfree.chart.axis.CategoryLabelPositions; |
|
|
|
|
import org.jfree.chart.axis.NumberAxis; |
|
|
|
|
import org.jfree.chart.axis.ValueAxis; |
|
|
|
|
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; |
|
|
|
|
import org.jfree.chart.labels.StandardCategoryToolTipGenerator; |
|
|
|
|
import org.jfree.chart.labels.StandardPieSectionLabelGenerator; |
|
|
|
|
import org.jfree.chart.plot.CategoryPlot; |
|
|
|
|
import org.jfree.chart.plot.DatasetRenderingOrder; |
|
|
|
|
import org.jfree.chart.plot.PiePlot; |
|
|
|
|
import org.jfree.chart.plot.PlotOrientation; |
|
|
|
|
import org.jfree.chart.renderer.category.BarRenderer; |
|
|
|
|
import org.jfree.chart.renderer.category.CategoryItemRenderer; |
|
|
|
|
import org.jfree.chart.renderer.category.LineAndShapeRenderer; |
|
|
|
|
import org.jfree.chart.renderer.category.StandardBarPainter; |
|
|
|
|
import org.jfree.data.category.DefaultCategoryDataset; |
|
|
|
|
import org.jfree.data.general.DefaultPieDataset; |
|
|
|
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVMerge; |
|
|
|
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge; |
|
|
|
|
|
|
|
|
|
import java.awt.*; |
|
|
|
|
import java.io.ByteArrayOutputStream; |
|
|
|
|
import java.io.File; |
|
|
|
|
import java.io.FileInputStream; |
|
|
|
|
import java.io.IOException; |
|
|
|
|
import java.text.DecimalFormat; |
|
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
|
|
@Slf4j |
|
|
|
@ -57,6 +68,44 @@ public class JFreeUtil {
|
|
|
|
|
file.delete(); |
|
|
|
|
return buffer; |
|
|
|
|
} |
|
|
|
|
public static ImageEntity pieChartByDouble(String title, Map<String, Double> datas, int width, int height) { |
|
|
|
|
|
|
|
|
|
//创建主题样式
|
|
|
|
|
StandardChartTheme standardChartTheme = new StandardChartTheme("CN"); |
|
|
|
|
//设置标题字体
|
|
|
|
|
standardChartTheme.setExtraLargeFont(new Font("宋体", Font.BOLD, 20)); |
|
|
|
|
//设置图例的字体
|
|
|
|
|
standardChartTheme.setRegularFont(new Font("宋体", Font.PLAIN, 15)); |
|
|
|
|
//设置轴向的字体
|
|
|
|
|
standardChartTheme.setLargeFont(new Font("宋体", Font.PLAIN, 15)); |
|
|
|
|
//设置主题样式
|
|
|
|
|
ChartFactory.setChartTheme(standardChartTheme); |
|
|
|
|
|
|
|
|
|
//根据jfree生成一个本地饼状图
|
|
|
|
|
DefaultPieDataset pds = new DefaultPieDataset(); |
|
|
|
|
datas.forEach(pds::setValue); |
|
|
|
|
//图标标题、数据集合、是否显示图例标识、是否显示tooltips、是否支持超链接
|
|
|
|
|
JFreeChart chart = ChartFactory.createPieChart(title, pds, true, false, false); |
|
|
|
|
//设置抗锯齿
|
|
|
|
|
chart.setTextAntiAlias(false); |
|
|
|
|
PiePlot plot = (PiePlot) chart.getPlot(); |
|
|
|
|
plot.setNoDataMessage("暂无数据"); |
|
|
|
|
//忽略无值的分类
|
|
|
|
|
plot.setIgnoreNullValues(true); |
|
|
|
|
plot.setBackgroundAlpha(0f); |
|
|
|
|
//设置标签阴影颜色
|
|
|
|
|
plot.setShadowPaint(new Color(255, 255, 255)); |
|
|
|
|
//设置标签生成器(默认{0})
|
|
|
|
|
plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}({1})/{2}")); |
|
|
|
|
try { |
|
|
|
|
ChartUtils.saveChartAsJPEG(new File(tempImgPath), chart, width, height); |
|
|
|
|
} catch (IOException e1) { |
|
|
|
|
log.error("生成饼状图失败!"); |
|
|
|
|
} |
|
|
|
|
ImageEntity imageEntity = new ImageEntity(imgToByte(tempImgPath), width, height); |
|
|
|
|
Assert.notNull(imageEntity.getData(), "生成饼状图对象失败!"); |
|
|
|
|
return imageEntity; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static ImageEntity pieChart(String title, Map<String, Integer> datas, int width, int height) { |
|
|
|
|
|
|
|
|
@ -96,7 +145,8 @@ public class JFreeUtil {
|
|
|
|
|
Assert.notNull(imageEntity.getData(), "生成饼状图对象失败!"); |
|
|
|
|
return imageEntity; |
|
|
|
|
} |
|
|
|
|
// public static ImageEntity lineChart(String title, Map<String, Integer> datas, int width, int height) {
|
|
|
|
|
|
|
|
|
|
// public static ImageEntity lineChart(String title, Map<String, Integer> datas, int width, int height) {
|
|
|
|
|
//
|
|
|
|
|
// //创建主题样式
|
|
|
|
|
// StandardChartTheme standardChartTheme = new StandardChartTheme("CN");
|
|
|
|
@ -137,8 +187,40 @@ public class JFreeUtil {
|
|
|
|
|
// Assert.notNull(imageEntity.getData(),"生成饼状图对象失败!");
|
|
|
|
|
// return imageEntity;
|
|
|
|
|
// }
|
|
|
|
|
public static ImageEntity lineChart(String title, DefaultCategoryDataset dataset, double[] value, int width, int height) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 创建CategoryPlot对象
|
|
|
|
|
CategoryPlot plot = new CategoryPlot(); |
|
|
|
|
|
|
|
|
|
// 添加第一个数据集并渲染为line
|
|
|
|
|
CategoryItemRenderer lineRenderer = new LineAndShapeRenderer(); |
|
|
|
|
plot.setDataset(0, dataset); |
|
|
|
|
plot.setRenderer(0, lineRenderer); |
|
|
|
|
|
|
|
|
|
public static ImageEntity lineChart( String title,String[] monthArray,double[] value,int width, int height) { |
|
|
|
|
// 添加第二个数据集并渲染为线条bar
|
|
|
|
|
CategoryItemRenderer baRenderer = new BarRenderer(); |
|
|
|
|
plot.setDataset(1, dataset); |
|
|
|
|
plot.setRenderer(1, baRenderer); |
|
|
|
|
|
|
|
|
|
// 设置坐标轴
|
|
|
|
|
plot.setDomainAxis(new CategoryAxis("数量")); |
|
|
|
|
plot.setRangeAxis(new NumberAxis("票据类型")); |
|
|
|
|
// 创建JFreeChart对象
|
|
|
|
|
JFreeChart chart = new JFreeChart(plot); |
|
|
|
|
// todo 标题验证
|
|
|
|
|
chart.setTitle(title); |
|
|
|
|
try { |
|
|
|
|
ChartUtils.saveChartAsJPEG(new File(tempImgPath2), chart, width, height); |
|
|
|
|
} catch (IOException e) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} |
|
|
|
|
ImageEntity imageEntity = new ImageEntity(imgToByte(tempImgPath2), width, height); |
|
|
|
|
Assert.notNull(imageEntity.getData(), "生成柱状图对象失败!"); |
|
|
|
|
return imageEntity; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static ImageEntity lineChartV1(String title, String[] monthArray, double[] value, int width, int height) { |
|
|
|
|
// 创建数据
|
|
|
|
|
DefaultCategoryDataset dataset = new DefaultCategoryDataset(); |
|
|
|
|
dataset.addValue(1.0, "A", "Ⅰ"); |
|
|
|
@ -176,537 +258,224 @@ public class JFreeUtil {
|
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} |
|
|
|
|
ImageEntity imageEntity = new ImageEntity(imgToByte(tempImgPath2), width, height); |
|
|
|
|
Assert.notNull(imageEntity.getData(),"生成饼状图对象失败!"); |
|
|
|
|
Assert.notNull(imageEntity.getData(), "生成饼状图对象失败!"); |
|
|
|
|
return imageEntity; |
|
|
|
|
} |
|
|
|
|
// public static ImageEntity lineChart( String title,String[] monthArray,double[] value,int width, int height) {
|
|
|
|
|
// //如果不使用Font,中文将显示不出来
|
|
|
|
|
// Font font = new Font("新宋体", Font.BOLD, 15);
|
|
|
|
|
// // 创建数据
|
|
|
|
|
// Map<String, Map<String, Double>> datas = new HashMap<String, Map<String, Double>>();
|
|
|
|
|
// for (int i = 0; i < monthArray.length; i++) {
|
|
|
|
|
// Map<String, Double> map = new HashMap<String, Double>();
|
|
|
|
|
// map.put("故障数量", value[i]);
|
|
|
|
|
// datas.put(monthArray[i], map);
|
|
|
|
|
// }
|
|
|
|
|
// JFreeChart chart = createLineChart(title, datas, "月份", "故障次数(次)", font);
|
|
|
|
|
// try {
|
|
|
|
|
// ChartUtils.saveChartAsJPEG(new File(tempImgPath), chart, 800, 600);
|
|
|
|
|
// } catch (IOException e) {
|
|
|
|
|
// e.printStackTrace();
|
|
|
|
|
// }
|
|
|
|
|
// ImageEntity imageEntity = new ImageEntity(imgToByte(), 800, 600);
|
|
|
|
|
// Assert.notNull(imageEntity.getData(),"生成饼状图对象失败!");
|
|
|
|
|
// return imageEntity;
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// public static JFreeChart createLineChart(String title, Map<String, Map<String, Double>> data, String type, String unit, Font font) {
|
|
|
|
|
// try {
|
|
|
|
|
// DefaultCategoryDataset ds = new DefaultCategoryDataset();
|
|
|
|
|
// Set<Map.Entry<String, Map<String, Double>>> set1 = data.entrySet();
|
|
|
|
|
// Iterator iterator1 = set1.iterator();
|
|
|
|
|
// Iterator iterator2;
|
|
|
|
|
// HashMap<String, Double> map;
|
|
|
|
|
// Set<Map.Entry<String, Double>> set2;
|
|
|
|
|
// Map.Entry entry1;
|
|
|
|
|
// Map.Entry entry2;
|
|
|
|
|
// while (iterator1.hasNext()) {
|
|
|
|
|
// entry1 = (Map.Entry) iterator1.next();
|
|
|
|
|
// map = (HashMap<String, Double>) 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.setBackgroundAlpha(0.1f);
|
|
|
|
|
// // 设置网格横线颜色
|
|
|
|
|
// plot.setRangeGridlinePaint(Color.gray);
|
|
|
|
|
// // 设置网格横线大小
|
|
|
|
|
// plot.setDomainGridlineStroke(new BasicStroke(0.2F));
|
|
|
|
|
// plot.setRangeGridlineStroke(new BasicStroke(0.2F));
|
|
|
|
|
//
|
|
|
|
|
// //设置横轴标签项字体
|
|
|
|
|
// plot.getDomainAxis().setTickLabelFont(font);
|
|
|
|
|
//
|
|
|
|
|
// // 生成折线图上的数字
|
|
|
|
|
// //绘图区域(红色矩形框的部分)
|
|
|
|
|
// LineAndShapeRenderer lineAndShapeRenderer = (LineAndShapeRenderer) plot.getRenderer();
|
|
|
|
|
// lineAndShapeRenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
|
|
|
|
|
// //设置图表上的数字可见
|
|
|
|
|
// lineAndShapeRenderer.setBaseItemLabelsVisible(true);
|
|
|
|
|
// //设置图表上的数字字体
|
|
|
|
|
// lineAndShapeRenderer.setBaseItemLabelFont(new Font("宋体", Font.BOLD, 15));
|
|
|
|
|
//
|
|
|
|
|
// //设置折线图拐角上的正方形
|
|
|
|
|
// //创建一个正方形
|
|
|
|
|
// Rectangle shape = new Rectangle(4, 4);
|
|
|
|
|
// lineAndShapeRenderer.setSeriesShape(0, shape);
|
|
|
|
|
// //设置拐角上图形可见
|
|
|
|
|
// lineAndShapeRenderer.setSeriesShapesVisible(0, true);
|
|
|
|
|
//
|
|
|
|
|
// /*// 获取显示线条的对象
|
|
|
|
|
// LineAndShapeRenderer lasp = (LineAndShapeRenderer) plot.getRenderer();
|
|
|
|
|
// // 设置拐点是否可见/是否显示拐点
|
|
|
|
|
// lasp.setBaseShapesVisible(true);
|
|
|
|
|
// // 设置拐点不同用不同的形状
|
|
|
|
|
// lasp.setDrawOutlines(true);
|
|
|
|
|
// // 设置线条是否被显示填充颜色
|
|
|
|
|
// lasp.setUseFillPaint(true);
|
|
|
|
|
// // 设置拐点颜色
|
|
|
|
|
// lasp.setBaseFillPaint(Color.blue);//蓝色*/
|
|
|
|
|
// //设置范围轴(纵轴)字体
|
|
|
|
|
// font = new Font("宋体", Font.BOLD, 18);
|
|
|
|
|
// plot.getRangeAxis().setLabelFont(font);
|
|
|
|
|
//// plot.setForegroundAlpha(1.0f);
|
|
|
|
|
// return chart;
|
|
|
|
|
// } catch (Exception e) {
|
|
|
|
|
// e.printStackTrace();
|
|
|
|
|
// return null;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 生成折线图
|
|
|
|
|
// * 1.解析数据<br>
|
|
|
|
|
// * 2.迭代数据,产出图片数据流,并添加到List<br>
|
|
|
|
|
// *
|
|
|
|
|
// * @throws IOException
|
|
|
|
|
// */
|
|
|
|
|
// public ArrayList createLineAndShapeChart(double[][] data, String[] rowKeys, String[] columnKeys, ChartEntity entity) throws IOException {
|
|
|
|
|
// ArrayList list = new ArrayList();
|
|
|
|
|
// byte[] bytes = new byte[]{};
|
|
|
|
|
// // 解析数据
|
|
|
|
|
// Map map = this.parseDataForBarPage(data, rowKeys, columnKeys);
|
|
|
|
|
// int pageNum = Integer.parseInt("" + map.get("pageNum"));
|
|
|
|
|
// // 迭代,产生图片数据流
|
|
|
|
|
// for (int i = 0; i < pageNum; i++) {
|
|
|
|
|
// bytes = createSingleLineAndShapeChart((double[][]) (map.get("data" + i)), (String[]) (map.get("rowKeys" + i)),
|
|
|
|
|
// (String[]) (map.get("columnKeys" + i)), entity);
|
|
|
|
|
// list.add(bytes);
|
|
|
|
|
// }
|
|
|
|
|
// return list;
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 生成单个折线图数据流
|
|
|
|
|
// *
|
|
|
|
|
// * @param data
|
|
|
|
|
// * @param rowKeys
|
|
|
|
|
// * @param columnKeys
|
|
|
|
|
// * @param entity
|
|
|
|
|
// * @return
|
|
|
|
|
// * @throws IOException
|
|
|
|
|
// */
|
|
|
|
|
// public byte[] createSingleLineAndShapeChart(double[][] data, String[] rowKeys, String[] columnKeys, ChartEntity entity) throws IOException {
|
|
|
|
|
// CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
|
|
|
|
|
// JFreeChart chart = createTimeXYChar(dataset, entity);
|
|
|
|
|
// byte[] bytes = this.createImage(chart, entity);
|
|
|
|
|
// return bytes;
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 生成柱状图<br>
|
|
|
|
|
// * 1.解析数据<br>
|
|
|
|
|
// * 2.迭代数据,产出图片数据流,并添加到List<br>
|
|
|
|
|
// *
|
|
|
|
|
// * @param data 数据
|
|
|
|
|
// * @param rowKeys 行
|
|
|
|
|
// * @param columnKeys 列
|
|
|
|
|
// * @param entity 图片配置对象
|
|
|
|
|
// * @return 包含多个图片数据流的List
|
|
|
|
|
// * @throws IOException
|
|
|
|
|
// */
|
|
|
|
|
// public ArrayList createStackedBarChart(double[][] data, String[] rowKeys, String[] columnKeys, ChartEntity entity) throws IOException {
|
|
|
|
|
// // 解析数据
|
|
|
|
|
// ArrayList list = new ArrayList();
|
|
|
|
|
// byte[] bytes = new byte[]{};
|
|
|
|
|
// Map map = this.parseDataForBarPage(data, rowKeys, columnKeys);
|
|
|
|
|
// int pageNum = Integer.parseInt("" + map.get("pageNum"));
|
|
|
|
|
// // 迭代数据,产出图片数据流,并添加到List
|
|
|
|
|
// for (int i = 0; i < pageNum; i++) {
|
|
|
|
|
// bytes = createSingleStackedBarChart((double[][]) (map.get("data" + i)), (String[]) (map.get("rowKeys" + i)),
|
|
|
|
|
// (String[]) (map.get("columnKeys" + i)), entity);
|
|
|
|
|
// list.add(bytes);
|
|
|
|
|
// }
|
|
|
|
|
// return list;
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 解析生成柱状图分页数据
|
|
|
|
|
// *
|
|
|
|
|
// * @param data
|
|
|
|
|
// * @param rowKeys
|
|
|
|
|
// * @param columnKeys
|
|
|
|
|
// * @return
|
|
|
|
|
// */
|
|
|
|
|
// private Map parseDataForBarPage(double[][] data, String[] rowKeys, String[] columnKeys) {
|
|
|
|
|
// Map map = new HashMap();
|
|
|
|
|
//
|
|
|
|
|
// double[][] pageData = null;
|
|
|
|
|
// String[] pageColumn = null;
|
|
|
|
|
//
|
|
|
|
|
// int sumColumnNum = columnKeys.length; // 总列数
|
|
|
|
|
// int indexNum = Config.getInt("image.export.pagesize", 10);// 分页的列数
|
|
|
|
|
// int pageNum = sumColumnNum % indexNum == 0 ? sumColumnNum / indexNum : sumColumnNum / indexNum + 1; // 分页数
|
|
|
|
|
// int rowNum = rowKeys.length;
|
|
|
|
|
//
|
|
|
|
|
// // log.debug("data.length="+data.length+"sumColumnNum="+sumColumnNum+" indexNum="+indexNum+" pageNum="+pageNum+" rowNum="+rowNum+" ");
|
|
|
|
|
//
|
|
|
|
|
// // 解析传递过来的数据
|
|
|
|
|
// for (int i = 0; i < pageNum; i++) {
|
|
|
|
|
// int columnNum = (sumColumnNum - i * indexNum) / indexNum > 0 ? indexNum : (sumColumnNum - i * indexNum) % indexNum;//当前页列数
|
|
|
|
|
// pageData = new double[rowNum][columnNum];
|
|
|
|
|
// // 取数据值
|
|
|
|
|
// for (int j = 0; j < rowNum; j++) {
|
|
|
|
|
// pageColumn = new String[columnNum];
|
|
|
|
|
// for (int k = 0; k < columnNum; k++) {
|
|
|
|
|
// pageData[j][k] = data[j][k + i * indexNum]; // 数据
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// // 取列值
|
|
|
|
|
// for (int j = 0; j < columnNum; j++) {
|
|
|
|
|
// pageColumn[j] = columnKeys[j + i * indexNum]; // 列
|
|
|
|
|
// }
|
|
|
|
|
// // 保存数据并返回
|
|
|
|
|
// map.put("data" + i, pageData);
|
|
|
|
|
// map.put("rowKeys" + i, rowKeys);
|
|
|
|
|
// map.put("columnKeys" + i, pageColumn);
|
|
|
|
|
// }
|
|
|
|
|
// // 保存分页数
|
|
|
|
|
// map.put("pageNum", pageNum);
|
|
|
|
|
// return map;
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 解析生成折线图分页数据
|
|
|
|
|
// *
|
|
|
|
|
// * @param data
|
|
|
|
|
// * @param rowKeys
|
|
|
|
|
// * @param columnKeys
|
|
|
|
|
// * @return
|
|
|
|
|
// */
|
|
|
|
|
// private Map parseDataForLinePage(double[][] data, String[] rowKeys, String[] columnKeys) {
|
|
|
|
|
// Map map = new HashMap();
|
|
|
|
|
//
|
|
|
|
|
// double[][] pageData = null;
|
|
|
|
|
// String[] pageColumn = null;
|
|
|
|
|
//
|
|
|
|
|
// int sumColumnNum = columnKeys.length; // 总列数
|
|
|
|
|
// int indexNum = Config.getInt("image.export.pagesize", 10);// 分页的列数
|
|
|
|
|
// int pageNum = sumColumnNum % indexNum == 0 ? sumColumnNum / indexNum : sumColumnNum / indexNum + 1; // 分页数
|
|
|
|
|
// int rowNum = rowKeys.length;
|
|
|
|
|
//
|
|
|
|
|
// // log.debug("data.length="+data.length+"sumColumnNum="+sumColumnNum+" indexNum="+indexNum+" pageNum="+pageNum+" rowNum="+rowNum+" ");
|
|
|
|
|
//
|
|
|
|
|
// // 解析传递过来的数据
|
|
|
|
|
// for (int i = 0; i < pageNum; i++) {
|
|
|
|
|
// int columnNum = (sumColumnNum - i * indexNum) / indexNum > 0 ? indexNum : (sumColumnNum - i * indexNum) % indexNum;//当前页列数
|
|
|
|
|
// pageData = new double[rowNum][columnNum];
|
|
|
|
|
// // 取数据值
|
|
|
|
|
// for (int j = 0; j < rowNum; j++) {
|
|
|
|
|
// pageColumn = new String[columnNum];
|
|
|
|
|
// for (int k = 0; k < columnNum; k++) {
|
|
|
|
|
// pageData[j][k] = data[j][k + i * indexNum]; // 数据
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// // 取列值
|
|
|
|
|
// for (int j = 0; j < columnNum; j++) {
|
|
|
|
|
// pageColumn[j] = columnKeys[j + i * indexNum]; // 列
|
|
|
|
|
// }
|
|
|
|
|
// // 保存数据并返回
|
|
|
|
|
// map.put("data" + i, pageData);
|
|
|
|
|
// map.put("rowKeys" + i, rowKeys);
|
|
|
|
|
// map.put("columnKeys" + i, pageColumn);
|
|
|
|
|
// }
|
|
|
|
|
// // 保存分页数
|
|
|
|
|
// map.put("pageNum", pageNum);
|
|
|
|
|
// return map;
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 生成单个堆栈柱状图
|
|
|
|
|
// *
|
|
|
|
|
// * @return 图片数据流
|
|
|
|
|
// * @throws IOException
|
|
|
|
|
// */
|
|
|
|
|
// public byte[] createSingleStackedBarChart(double[][] data, String[] rowKeys, String[] columnKeys, ChartEntity entity) throws IOException {
|
|
|
|
|
// CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
|
|
|
|
|
// JFreeChart chart = createStackedBarChart(dataset, entity);
|
|
|
|
|
// byte[] bytes = this.createImage(chart, entity);
|
|
|
|
|
// return bytes;
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// // 柱状图,折线图 数据集
|
|
|
|
|
// private CategoryDataset getBarData(double[][] data, String[] rowKeys,
|
|
|
|
|
// String[] columnKeys) {
|
|
|
|
|
// return DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
|
|
|
|
|
//
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 判断文件夹是否存在,如果不存在则新建
|
|
|
|
|
// *
|
|
|
|
|
// * @param chartPath
|
|
|
|
|
// */
|
|
|
|
|
// private void isChartPathExist(String chartPath) {
|
|
|
|
|
// File file = new File(chartPath);
|
|
|
|
|
// if (!file.exists()) {
|
|
|
|
|
// file.mkdirs();
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 折线图
|
|
|
|
|
// */
|
|
|
|
|
// private JFreeChart createTimeXYChar(CategoryDataset xyDataset, ChartEntity entity) {
|
|
|
|
|
//
|
|
|
|
|
// JFreeChart chart = ChartFactory.createLineChart(
|
|
|
|
|
// entity.getTitle(),
|
|
|
|
|
// entity.getXname(),
|
|
|
|
|
// entity.getYname(),
|
|
|
|
|
// xyDataset,
|
|
|
|
|
// PlotOrientation.VERTICAL,
|
|
|
|
|
// true,
|
|
|
|
|
// true,
|
|
|
|
|
// false);
|
|
|
|
|
//
|
|
|
|
|
// chart.setTextAntiAlias(false);
|
|
|
|
|
// chart.setBackgroundPaint(Color.WHITE);
|
|
|
|
|
//
|
|
|
|
|
// CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
|
|
|
|
|
// // 没有数据时显示
|
|
|
|
|
// this.configNoData(chart, "没有查询到数据 !");
|
|
|
|
|
//
|
|
|
|
|
// // x轴 // 分类轴网格是否可见
|
|
|
|
|
// categoryplot.setDomainGridlinesVisible(true);
|
|
|
|
|
// // y轴 //数据轴网格是否可见
|
|
|
|
|
// categoryplot.setRangeGridlinesVisible(true);
|
|
|
|
|
//
|
|
|
|
|
// categoryplot.setRangeGridlinePaint(Color.WHITE);// 虚线色彩
|
|
|
|
|
//
|
|
|
|
|
// categoryplot.setDomainGridlinePaint(Color.WHITE);// 虚线色彩
|
|
|
|
|
//
|
|
|
|
|
// categoryplot.setBackgroundPaint(Color.lightGray);
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// // 配置字体
|
|
|
|
|
// this.configFont(chart);
|
|
|
|
|
//
|
|
|
|
|
// // x轴设置
|
|
|
|
|
// CategoryAxis domainAxis = categoryplot.getDomainAxis();
|
|
|
|
|
//
|
|
|
|
|
// // 设置距离图片左端距离
|
|
|
|
|
// domainAxis.setLowerMargin(0.0);
|
|
|
|
|
// // 设置距离图片右端距离
|
|
|
|
|
// domainAxis.setUpperMargin(0.0);
|
|
|
|
|
// domainAxis.setTickLabelPaint(Color.BLUE);
|
|
|
|
|
// domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的label斜显示
|
|
|
|
|
//
|
|
|
|
|
// NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
|
|
|
|
|
// numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
|
|
|
|
|
// numberaxis.setAutoRangeIncludesZero(true);
|
|
|
|
|
//
|
|
|
|
|
// // 获得renderer 注意这里是下嗍造型到lineandshaperenderer!!
|
|
|
|
|
// LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot.getRenderer();
|
|
|
|
|
// lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见
|
|
|
|
|
// lineandshaperenderer.setBaseLinesVisible(true); // series 点(即数据点)间有连线可见
|
|
|
|
|
//
|
|
|
|
|
// // 显示折点数据
|
|
|
|
|
// lineandshaperenderer.setBaseItemLabelGenerator(new
|
|
|
|
|
// StandardCategoryItemLabelGenerator());
|
|
|
|
|
// lineandshaperenderer.setBaseItemLabelsVisible(true);
|
|
|
|
|
//
|
|
|
|
|
// return chart;
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 堆栈柱状图
|
|
|
|
|
// */
|
|
|
|
|
// private JFreeChart createStackedBarChart(CategoryDataset dataset, ChartEntity entity) {
|
|
|
|
|
//
|
|
|
|
|
// JFreeChart chart = ChartFactory.createStackedBarChart3D(
|
|
|
|
|
// entity.getTitle(),
|
|
|
|
|
// entity.getXname(),
|
|
|
|
|
// entity.getYname(),
|
|
|
|
|
// dataset,
|
|
|
|
|
// PlotOrientation.VERTICAL,
|
|
|
|
|
// true,
|
|
|
|
|
// false,
|
|
|
|
|
// false);
|
|
|
|
|
//
|
|
|
|
|
// // 没有数据配置
|
|
|
|
|
// this.configNoData(chart, "没有查询到数据 !");
|
|
|
|
|
//
|
|
|
|
|
// // 配置字体
|
|
|
|
|
// this.configFont(chart);
|
|
|
|
|
//
|
|
|
|
|
// // 配置 Renderer
|
|
|
|
|
// this.configBarRenderer(chart);
|
|
|
|
|
//
|
|
|
|
|
// // 其他配置
|
|
|
|
|
// this.configOtherForBar(chart);
|
|
|
|
|
//
|
|
|
|
|
// return chart;
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 配置字体
|
|
|
|
|
// *
|
|
|
|
|
// * @param chart JFreeChart 对象
|
|
|
|
|
// */
|
|
|
|
|
// private void configFont(JFreeChart chart) {
|
|
|
|
|
// // 配置字体
|
|
|
|
|
// Font xfont = new Font("宋体", Font.PLAIN, 12);// X轴
|
|
|
|
|
// Font yfont = new Font("宋体", Font.PLAIN, 12);// Y轴
|
|
|
|
|
// Font kfont = new Font("宋体", Font.PLAIN, 12);// 底部
|
|
|
|
|
// Font titleFont = new Font("隶书", Font.BOLD, 25); // 图片标题
|
|
|
|
|
// CategoryPlot plot = chart.getCategoryPlot();// 图形的绘制结构对象
|
|
|
|
|
//
|
|
|
|
|
// // 图片标题
|
|
|
|
|
// chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));
|
|
|
|
|
//
|
|
|
|
|
// // 底部
|
|
|
|
|
// chart.getLegend().setItemFont(kfont);
|
|
|
|
|
//
|
|
|
|
|
// // X 轴
|
|
|
|
|
// CategoryAxis domainAxis = plot.getDomainAxis();
|
|
|
|
|
// domainAxis.setLabelFont(xfont);// 轴标题
|
|
|
|
|
// domainAxis.setTickLabelFont(xfont);// 轴数值
|
|
|
|
|
// domainAxis.setTickLabelPaint(Color.BLUE); // 字体颜色
|
|
|
|
|
// domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的label斜显示
|
|
|
|
|
//
|
|
|
|
|
// // Y 轴
|
|
|
|
|
// ValueAxis rangeAxis = plot.getRangeAxis();
|
|
|
|
|
// rangeAxis.setLabelFont(yfont);
|
|
|
|
|
// rangeAxis.setLabelPaint(Color.BLUE); // 字体颜色
|
|
|
|
|
// rangeAxis.setTickLabelFont(yfont);
|
|
|
|
|
//
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 配置柱状图
|
|
|
|
|
// *
|
|
|
|
|
// * @param chart
|
|
|
|
|
// */
|
|
|
|
|
// private void configBarRenderer(JFreeChart chart) {
|
|
|
|
|
//
|
|
|
|
|
// CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
|
|
|
|
|
// // 自定义显示柱子上的总值
|
|
|
|
|
// ExtendedStackedBarRenderer extendedstackedbarrenderer = new ExtendedStackedBarRenderer();
|
|
|
|
|
// extendedstackedbarrenderer.setBaseItemLabelsVisible(true);
|
|
|
|
|
// extendedstackedbarrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
|
|
|
|
|
// extendedstackedbarrenderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
|
|
|
|
|
// categoryplot.setRenderer(extendedstackedbarrenderer);
|
|
|
|
|
//
|
|
|
|
|
// BarRenderer barrenderer = (BarRenderer) categoryplot.getRenderer();
|
|
|
|
|
// barrenderer.setDrawBarOutline(false);
|
|
|
|
|
// barrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
|
|
|
|
|
// barrenderer.setBaseItemLabelsVisible(true);
|
|
|
|
|
// barrenderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER));
|
|
|
|
|
// barrenderer.setBaseNegativeItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER));
|
|
|
|
|
//
|
|
|
|
|
// // 柱子显示数值
|
|
|
|
|
// // barrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}",new DecimalFormat("0.0%")));
|
|
|
|
|
// // barrenderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
|
|
|
|
|
// barrenderer.setItemLabelFont(new Font("Arial Unicode MS", Font.PLAIN, 9));
|
|
|
|
|
// barrenderer.setItemLabelsVisible(true);
|
|
|
|
|
//
|
|
|
|
|
// // 如果数值没有显示空间,设置显示格式
|
|
|
|
|
// // ItemLabelPosition itemLabelPositionFallback=new ItemLabelPosition(
|
|
|
|
|
// // ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_LEFT,
|
|
|
|
|
// // TextAnchor.HALF_ASCENT_LEFT,0D);
|
|
|
|
|
// // barrenderer.setPositiveItemLabelPositionFallback(itemLabelPositionFallback);
|
|
|
|
|
// // barrenderer.setNegativeItemLabelPositionFallback(itemLabelPositionFallback);
|
|
|
|
|
//
|
|
|
|
|
// categoryplot.setRenderer(barrenderer);
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 配置没有数据时的显示信息
|
|
|
|
|
// *
|
|
|
|
|
// * @param chart
|
|
|
|
|
// */
|
|
|
|
|
// private void configNoData(JFreeChart chart, String message) {
|
|
|
|
|
// CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
|
|
|
|
|
// // 没有数据时的显示
|
|
|
|
|
// categoryplot.setNoDataMessage(message);
|
|
|
|
|
// categoryplot.setNoDataMessageFont(new Font("黑体", Font.BOLD, 25));
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 其他配置
|
|
|
|
|
// *
|
|
|
|
|
// * @param chart
|
|
|
|
|
// */
|
|
|
|
|
// private void configOtherForBar(JFreeChart chart) {
|
|
|
|
|
//
|
|
|
|
|
// chart.setTextAntiAlias(false); // 图例字体清晰
|
|
|
|
|
//
|
|
|
|
|
// chart.setBackgroundPaint(Color.WHITE); // 背景颜色
|
|
|
|
|
//
|
|
|
|
|
// CategoryPlot plot = chart.getCategoryPlot();// 图形的绘制结构对象
|
|
|
|
|
// NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis();
|
|
|
|
|
// numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
|
|
|
|
|
// numberaxis.setAutoRangeIncludesZero(true);
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 创建图片的数据流
|
|
|
|
|
// *
|
|
|
|
|
// * @param chart
|
|
|
|
|
// * @param entity 图片配置对象
|
|
|
|
|
// * @return 图片数据流
|
|
|
|
|
// * @throws IOException
|
|
|
|
|
// */
|
|
|
|
|
// private byte[] createImage(JFreeChart chart, ChartEntity entity) throws IOException {
|
|
|
|
|
// return ChartUtilities.encodeAsPNG(chart.createBufferedImage(entity.getWidth(), entity.getHeight()));
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// /**
|
|
|
|
|
// * 创建图片文件到硬盘
|
|
|
|
|
// *
|
|
|
|
|
// * @param chart
|
|
|
|
|
// * @param entity
|
|
|
|
|
// * @throws IOException
|
|
|
|
|
// */
|
|
|
|
|
// private void createImageFile(JFreeChart chart, ChartEntity entity) throws IOException {
|
|
|
|
|
// FileOutputStream fos_jpg = null;
|
|
|
|
|
// try {
|
|
|
|
|
// isChartPathExist(tempImgPath);
|
|
|
|
|
// String chartName = tempImgPath + entity.getFileName();
|
|
|
|
|
// fos_jpg = new FileOutputStream(chartName);
|
|
|
|
|
// ChartUtilities.writeChartAsJPEG(fos_jpg, chart, entity.getWidth(), entity.getHeight());
|
|
|
|
|
// } catch (Exception e) {
|
|
|
|
|
// e.printStackTrace();
|
|
|
|
|
// } finally {
|
|
|
|
|
// try {
|
|
|
|
|
// fos_jpg.close();
|
|
|
|
|
// } catch (Exception e) {
|
|
|
|
|
// e.printStackTrace();
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 创建柱状+折现统计复合图 |
|
|
|
|
* |
|
|
|
|
* @param isAddLine |
|
|
|
|
* @param title |
|
|
|
|
* @param domainAxisLabel |
|
|
|
|
* @param rangeAxisLabel |
|
|
|
|
* @param dataset |
|
|
|
|
* @param datasetLine |
|
|
|
|
* @param width |
|
|
|
|
* @param height |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
public static ImageEntity iCreateBarLineChart(Boolean isAddLine, String title, String domainAxisLabel, String rangeAxisLabel, |
|
|
|
|
DefaultCategoryDataset dataset, DefaultCategoryDataset datasetLine, int width, int height) { |
|
|
|
|
// TODO Auto-generated method stub
|
|
|
|
|
JFreeChart chart = ChartFactory.createBarChart(title, |
|
|
|
|
domainAxisLabel, rangeAxisLabel, dataset, PlotOrientation.VERTICAL, // 图表方向:水平、垂直
|
|
|
|
|
true, // 是否显示图例(对于简单的柱状图必须是false)
|
|
|
|
|
false, // 是否生成工具
|
|
|
|
|
false); |
|
|
|
|
iSetBarChart(chart); |
|
|
|
|
if (isAddLine) { |
|
|
|
|
CategoryPlot categoryplot = chart.getCategoryPlot(); |
|
|
|
|
categoryplot.setDataset(1, datasetLine); |
|
|
|
|
LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer(); |
|
|
|
|
lineandshaperenderer.setDefaultToolTipGenerator(new StandardCategoryToolTipGenerator()); |
|
|
|
|
lineandshaperenderer.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator()); |
|
|
|
|
lineandshaperenderer.setDefaultLinesVisible(true); |
|
|
|
|
lineandshaperenderer.setSeriesPaint(0, Color.decode("#9BBB59")); |
|
|
|
|
categoryplot.setRenderer(1, lineandshaperenderer); |
|
|
|
|
NumberAxis numberaxis = new NumberAxis("平均值"); |
|
|
|
|
numberaxis.setLabelFont(new Font("宋体", Font.TRUETYPE_FONT, 12)); |
|
|
|
|
categoryplot.setRangeAxis(1, numberaxis); |
|
|
|
|
categoryplot.mapDatasetToRangeAxis(1, 1); |
|
|
|
|
categoryplot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD); |
|
|
|
|
} |
|
|
|
|
// JFreeChart lineChart = ChartFactory.createLineChart(title,
|
|
|
|
|
// domainAxisLabel, rangeAxisLabel, dataset);
|
|
|
|
|
try { |
|
|
|
|
ChartUtils.saveChartAsJPEG(new File(tempImgPath2), chart, width, height); |
|
|
|
|
} catch (IOException e) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} |
|
|
|
|
ImageEntity imageEntity = new ImageEntity(imgToByte(tempImgPath2), width, height); |
|
|
|
|
Assert.notNull(imageEntity.getData(), "生成柱状+折现统计复合图对象失败!"); |
|
|
|
|
return imageEntity; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 双色柱状图 |
|
|
|
|
* |
|
|
|
|
* @param title |
|
|
|
|
* @param domainAxisLabel |
|
|
|
|
* @param rangeAxisLabel |
|
|
|
|
* @param dataset |
|
|
|
|
* @param width |
|
|
|
|
* @param height |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
public static ImageEntity iCreateBarChart(String title, String domainAxisLabel, String rangeAxisLabel, |
|
|
|
|
DefaultCategoryDataset dataset, int width, int height) { |
|
|
|
|
// TODO Auto-generated method stub
|
|
|
|
|
JFreeChart chart = ChartFactory.createBarChart(title, |
|
|
|
|
domainAxisLabel, rangeAxisLabel, dataset); |
|
|
|
|
iSetBarChartDouble(chart); |
|
|
|
|
try { |
|
|
|
|
ChartUtils.saveChartAsJPEG(new File(tempImgPath2), chart, width, height); |
|
|
|
|
} catch (IOException e) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} |
|
|
|
|
ImageEntity imageEntity = new ImageEntity(imgToByte(tempImgPath2), width, height); |
|
|
|
|
Assert.notNull(imageEntity.getData(), "生成柱状+折现统计复合图对象失败!"); |
|
|
|
|
return imageEntity; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void iSetBarChart(JFreeChart chart) { |
|
|
|
|
CategoryPlot categoryplot = chart.getCategoryPlot();// 图本身
|
|
|
|
|
ValueAxis rangeAxis = categoryplot.getRangeAxis(); |
|
|
|
|
CategoryAxis domainAxis = categoryplot.getDomainAxis(); |
|
|
|
|
// 设置Y轴的提示文字样式
|
|
|
|
|
rangeAxis.setLabelFont(new Font("微软雅黑", Font.PLAIN, 12)); |
|
|
|
|
// 设置Y轴刻度线的长度
|
|
|
|
|
rangeAxis.setTickMarkInsideLength(10f); |
|
|
|
|
|
|
|
|
|
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD); // 横轴上的
|
|
|
|
|
domainAxis.setLowerMargin(0.1); |
|
|
|
|
domainAxis.setUpperMargin(0.1); |
|
|
|
|
|
|
|
|
|
// rangeAxis.setTickMarkOutsideLength(10f);
|
|
|
|
|
// 设置X轴下的标签文字
|
|
|
|
|
domainAxis.setLabelFont(new Font("微软雅黑", Font.PLAIN, 12)); |
|
|
|
|
// 设置X轴上提示文字样式
|
|
|
|
|
domainAxis.setTickLabelFont(new Font("微软雅黑", Font.PLAIN, 12)); |
|
|
|
|
NumberAxis vn = (NumberAxis) categoryplot.getRangeAxis(); |
|
|
|
|
|
|
|
|
|
// 设置Y轴的数字为百分比样式显示设置Y轴的数字为百分比样式显示
|
|
|
|
|
DecimalFormat df = new DecimalFormat("0.0"); |
|
|
|
|
vn.setNumberFormatOverride(df); |
|
|
|
|
// 使柱状图反过来显示
|
|
|
|
|
// vn.setInverted(true);
|
|
|
|
|
// vn.setVerticalTickLabels(true);
|
|
|
|
|
|
|
|
|
|
// 自定义柱状图中柱子的样式
|
|
|
|
|
BarRenderer brender = new BarRenderer(); |
|
|
|
|
brender.setSeriesPaint(0, Color.decode("#C0504D")); // 给series1 Bar
|
|
|
|
|
brender.setSeriesPaint(1, Color.decode("#E46C0A")); // 给series2 Bar
|
|
|
|
|
brender.setSeriesPaint(2, Color.decode("#4F81BD")); // 给series3 Bar
|
|
|
|
|
brender.setSeriesPaint(3, Color.decode("#00B050")); // 给series4 Bar
|
|
|
|
|
brender.setSeriesPaint(4, Color.decode("#7030A0")); // 给series5 Bar
|
|
|
|
|
brender.setSeriesPaint(5, Color.decode("#00BF00")); // 给series6 Bar
|
|
|
|
|
// 设置柱状图的顶端显示数字
|
|
|
|
|
brender.setIncludeBaseInRange(true); |
|
|
|
|
brender.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator()); |
|
|
|
|
brender.setDefaultItemLabelsVisible(true); |
|
|
|
|
// 设置柱子为平面图不是立体的
|
|
|
|
|
brender.setBarPainter(new StandardBarPainter()); |
|
|
|
|
// 设置柱状图之间的距离0.1代表10%;
|
|
|
|
|
brender.setItemMargin(0.3); |
|
|
|
|
// 设置柱子的阴影,false代表没有阴影
|
|
|
|
|
brender.setShadowVisible(false); |
|
|
|
|
|
|
|
|
|
// 设置图的背景为白色
|
|
|
|
|
categoryplot.setBackgroundPaint(Color.WHITE); |
|
|
|
|
// 设置背景虚线的颜色
|
|
|
|
|
categoryplot.setRangeGridlinePaint(Color.decode("#B6A2DE")); |
|
|
|
|
// 去掉柱状图的背景边框,使边框不可见
|
|
|
|
|
categoryplot.setOutlineVisible(false); |
|
|
|
|
// 设置标题的字体样式
|
|
|
|
|
chart.getTitle().setFont(new Font("微软雅黑", Font.PLAIN, 24)); |
|
|
|
|
// 设置图表下方图例上的字体样式
|
|
|
|
|
chart.getLegend().setItemFont(new Font("微软雅黑", Font.PLAIN, 12)); |
|
|
|
|
|
|
|
|
|
categoryplot.setRenderer(brender); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static void iSetBarChartDouble(JFreeChart chart) { |
|
|
|
|
CategoryPlot categoryplot = chart.getCategoryPlot();// 图本身
|
|
|
|
|
ValueAxis rangeAxis = categoryplot.getRangeAxis(); |
|
|
|
|
CategoryAxis domainAxis = categoryplot.getDomainAxis(); |
|
|
|
|
// 设置Y轴的提示文字样式
|
|
|
|
|
rangeAxis.setLabelFont(new Font("微软雅黑", Font.PLAIN, 12)); |
|
|
|
|
// 设置Y轴刻度线的长度
|
|
|
|
|
rangeAxis.setTickMarkInsideLength(10f); |
|
|
|
|
|
|
|
|
|
rangeAxis.setTickMarkOutsideLength(10f); |
|
|
|
|
// 设置X轴下的标签文字
|
|
|
|
|
domainAxis.setLabelFont(new Font("微软雅黑", Font.PLAIN, 12)); |
|
|
|
|
// 设置X轴上提示文字样式
|
|
|
|
|
domainAxis.setTickLabelFont(new Font("微软雅黑", Font.PLAIN, 12)); |
|
|
|
|
NumberAxis vn = (NumberAxis) categoryplot.getRangeAxis(); |
|
|
|
|
|
|
|
|
|
// 设置Y轴的数字为百分比样式显示设置Y轴的数字为百分比样式显示
|
|
|
|
|
DecimalFormat df = new DecimalFormat("0.0"); |
|
|
|
|
vn.setNumberFormatOverride(df); |
|
|
|
|
// 使柱状图反过来显示
|
|
|
|
|
// vn.setInverted(true);
|
|
|
|
|
// vn.setVerticalTickLabels(true);
|
|
|
|
|
|
|
|
|
|
// // 自定义柱状图中柱子的样式
|
|
|
|
|
BarRenderer brender = new BarRenderer(); |
|
|
|
|
brender.setSeriesPaint(0, Color.gray); |
|
|
|
|
brender.setSeriesPaint(1, Color.orange); |
|
|
|
|
// brender.setSeriesPaint(1, Color.decode("#C0504D")); // 给series1 Bar
|
|
|
|
|
// brender.setSeriesPaint(2, Color.decode("#C0504D")); // 给series1 Bar
|
|
|
|
|
// brender.setSeriesPaint(0, Color.decode("#E46C0A")); // 给series2 Bar
|
|
|
|
|
// brender.setSeriesPaint(2, Color.decode("#4F81BD")); // 给series3 Bar
|
|
|
|
|
// brender.setSeriesPaint(3, Color.decode("#00B050")); // 给series4 Bar
|
|
|
|
|
// brender.setSeriesPaint(4, Color.decode("#7030A0")); // 给series5 Bar
|
|
|
|
|
// brender.setSeriesPaint(5, Color.decode("#00BF00")); // 给series6 Bar
|
|
|
|
|
// 设置柱状图的顶端显示数字
|
|
|
|
|
brender.setIncludeBaseInRange(true); |
|
|
|
|
// brender.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
|
|
|
|
|
// brender.setBaseItemLabelsVisible(isBaseItemLabelsVisible());
|
|
|
|
|
// 设置柱子为平面图不是立体的
|
|
|
|
|
brender.setBarPainter(new StandardBarPainter()); |
|
|
|
|
// 设置柱状图之间的距离0.1代表10%;
|
|
|
|
|
brender.setItemMargin(0.1); |
|
|
|
|
// // 设置柱子的阴影,false代表没有阴影
|
|
|
|
|
brender.setShadowVisible(false); |
|
|
|
|
|
|
|
|
|
// 设置图的背景为白色
|
|
|
|
|
categoryplot.setBackgroundPaint(Color.WHITE); |
|
|
|
|
// 设置背景虚线的颜色
|
|
|
|
|
categoryplot.setRangeGridlinePaint(Color.decode("#B6A2DE")); |
|
|
|
|
// 去掉柱状图的背景边框,使边框不可见
|
|
|
|
|
categoryplot.setOutlineVisible(false); |
|
|
|
|
// 设置标题的字体样式
|
|
|
|
|
chart.getTitle().setFont(new Font("微软雅黑", Font.PLAIN, 24)); |
|
|
|
|
// 设置图表下方图例上的字体样式
|
|
|
|
|
chart.getLegend().setItemFont(new Font("微软雅黑", Font.PLAIN, 12)); |
|
|
|
|
|
|
|
|
|
categoryplot.setRenderer(brender); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void mergeCell(XWPFTable table, int beginRowIndex, int endRowIndex, int colIndex) { |
|
|
|
|
if (beginRowIndex == endRowIndex || beginRowIndex > endRowIndex) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//合并行单元格的第一个单元格
|
|
|
|
|
CTVMerge startMerge = CTVMerge.Factory.newInstance(); |
|
|
|
|
startMerge.setVal(STMerge.RESTART); |
|
|
|
|
//合并行单元格的第一个单元格之后的单元格
|
|
|
|
|
CTVMerge endMerge = CTVMerge.Factory.newInstance(); |
|
|
|
|
endMerge.setVal(STMerge.CONTINUE); |
|
|
|
|
table.getRow(beginRowIndex).getCell(colIndex).getCTTc().getTcPr().setVMerge(startMerge); |
|
|
|
|
for (int i = beginRowIndex + 1; i <= endRowIndex; i++) { |
|
|
|
|
table.getRow(i).getCell(colIndex).getCTTc().getTcPr().setVMerge(endMerge); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|