Jfreechart生成图表图片

1、先引入对应的依赖

<!--用于jfreechart生成图片  -->
        <dependency>
            <groupId>org.jfree</groupId>
            <artifactId>jfreechart</artifactId>
            <version>1.0.19</version>
        </dependency>
        <dependency>
            <groupId>org.jfree</groupId>
            <artifactId>jcommon</artifactId>
            <version>1.0.17</version>
</dependency>

 2、生成柱状图

/**
     * 生成柱状图
     * @return
     */
    public static String DefaultCategoryDataset(){
        // List<T> list
        DefaultCategoryDataset dataset=new DefaultCategoryDataset();
        //添加数据
        dataset.addValue(20, "", "瑞安市政府");
        dataset.addValue(35, "", "三位一体");
        dataset.addValue(10, "", "司鉴院都好好的");
        dataset.addValue(38, "", "方法反反复复");
        dataset.addValue(15, "", "瑞安市政府1");
        dataset.addValue(23, "", "三位一体1");
        dataset.addValue(3, "", "司鉴院都好好的1");
        dataset.addValue(78, "", "方法反反复复1");

        JFreeChart chart = ChartFactory.createBarChart3D(
                "数据支撑业务",
                "",//X轴的标签
                "",//Y轴的标签
                dataset, //图标显示的数据集合
                PlotOrientation.VERTICAL, //图像的显示形式(水平或者垂直)
                false,//是否显示子标题 就是图例 显示的话需要设置为true把56、99、100行代码取消注释
                false,//是否生成提示的标签
                true); //是否生成URL链接
        //处理图形上的乱码
        //处理主标题的乱码
        chart.getTitle().setFont(new Font("宋体",Font.BOLD,18));
        //处理子标题乱码
        // chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,15));
        //获取图表区域对象
        CategoryPlot categoryPlot = (CategoryPlot)chart.getPlot();
        //获取X轴的对象
        CategoryAxis3D categoryAxis3D = (CategoryAxis3D)categoryPlot.getDomainAxis();
        // 设置X轴文本倾斜45度
        categoryAxis3D.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
        //获取Y轴的对象
        NumberAxis3D numberAxis3D = (NumberAxis3D)categoryPlot.getRangeAxis();
        //处理X轴上的乱码
        categoryAxis3D.setTickLabelFont(new Font("宋体",Font.BOLD,15));
        //处理X轴外的乱码
        categoryAxis3D.setLabelFont(new Font("宋体",Font.BOLD,15));
        //处理Y轴上的乱码
        numberAxis3D.setTickLabelFont(new Font("宋体",Font.BOLD,15));
        //处理Y轴外的乱码
        numberAxis3D.setLabelFont(new Font("宋体",Font.BOLD,15));
        //处理Y轴上显示的刻度,以10作为1格
        numberAxis3D.setAutoTickUnitSelection(false);
        NumberTickUnit unit = new NumberTickUnit(10);
        numberAxis3D.setTickUnit(unit);
        //获取绘图区域对象
        BarRenderer3D barRenderer3D = (BarRenderer3D)categoryPlot.getRenderer();
        //设置柱形图的宽度
        barRenderer3D.setMaximumBarWidth(0.03);
        //在图形上显示数字
        barRenderer3D.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        // 设置为false柱子上就不显示数字
        barRenderer3D.setBaseItemLabelsVisible(false);
        barRenderer3D.setBaseItemLabelFont(new Font("宋体",Font.BOLD,15));

        //设定柱子上面的颜色
        CategoryPlot plot = (CategoryPlot) chart.getCategoryPlot();
        BarRenderer3D customBarRenderer = (BarRenderer3D) plot.getRenderer();
        customBarRenderer.setSeriesPaint(0, Color.decode("#005AB5"));
        // 设置背景透明度
        plot.setBackgroundAlpha(0.1f);
        // 设置网格横线颜色
        plot.setRangeGridlinePaint(Color.gray);
        // 设置网格横线大小
        plot.setDomainGridlineStroke(new BasicStroke(0.2F));
        plot.setRangeGridlineStroke(new BasicStroke(0.2F));
        // 设置图例展示位置
//        LegendTitle legend = chart.getLegend();
//        legend.setPosition(RectangleEdge.RIGHT);
        //bar实例化
        BarRenderer renderer = (BarRenderer) plot.getRenderer();
        //设置条形图上bar是否显示背景阴影
        renderer.setDrawBarOutline(false);

        //在D盘目录下生成图片
        File file = new File("D:/数据支撑业务.jpeg");
        try {
            ChartUtilities.saveChartAsJPEG(file, chart, 800, 600);
            System.out.println(getImageBase(file.getPath()));
        } catch (IOException e) {
            e.printStackTrace();
        }

        //使用ChartFrame对象显示图像
        /*ChartFrame frame = new ChartFrame("xyz",chart);
        frame.setVisible(true);
        frame.pack();*/
        return getImageBase(file.getPath());
    }

    public static void main(String[] args) {
        DefaultCategoryDataset();
    }

public static void main(String[] args) {
		double[] forwardItems = {12,34,45};//转发量
		double[] commentItems = {24,14,35};//评论量
		// double[] seeItems = {};//查看量

    	String[] items = { "残疾人联合会", "财政局", "公用集团" };
    	String[] series = new String[] { "已归集", "未归集"};

		double[][] data = new double[][] { forwardItems, commentItems};
    	CategoryDataset barDataset = DatasetUtilities.createCategoryDataset(series, items, data);

    	DefaultCategoryDataset lineDataset = new DefaultCategoryDataset();
    	lineDataset.addValue(10,  "归集数据量", items[0]);
    	lineDataset.addValue(5,  "归集数据量", items[1]);
    	lineDataset.addValue(25,  "归集数据量", items[2]);

    	getPhoFilePathYulun(barDataset, lineDataset, "图片标题", "pubOpinion");
	}

    /**
     *
     * 柱状图(堆叠)+折线图
     * @param categoryBarDataset 柱状图数据
     * @param categoryLineDataset 折线图数据
     * @param title 图片标题
     * @return
     */
    public static String getPhoFilePathYulun(CategoryDataset categoryBarDataset, CategoryDataset categoryLineDataset, String title, String fileName){

        JFreeChart chart = createCharts(categoryBarDataset,categoryLineDataset, title);
        // 处理主标题的乱码
        chart.getTitle().setFont(new Font("黑体", Font.BOLD, 18));
        chart.getLegend().setItemFont(new Font("黑体",Font.BOLD,10));//图例文字
        // 获取图表区域对象
        CategoryPlot categoryPlot = (CategoryPlot) chart.getPlot();
        // 获取X轴的对象
        CategoryAxis categoryAxis = (CategoryAxis) categoryPlot.getDomainAxis();
        categoryAxis.setLabelFont(new Font("黑体", Font.BOLD, 10));
        categoryAxis.setTickLabelFont(new Font("黑体", Font.BOLD, 10));
        // 设置X轴文本倾斜45度
        categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);

        // 获取Y轴的对象
        NumberAxis numberAxis = (NumberAxis) categoryPlot.getRangeAxis();

        // 处理X轴上的乱码
        categoryAxis.setTickLabelFont(new Font("黑体", Font.BOLD, 10));

        // 处理X轴外的乱码
        categoryAxis.setLabelFont(new Font("黑体", Font.BOLD, 10));

        // 处理Y轴上的乱码
        numberAxis.setTickLabelFont(new Font("黑体", Font.BOLD, 10));

        // 处理Y轴外的乱码
        numberAxis.setLabelFont(new Font("黑体", Font.BOLD, 10));
 		/*String path = System.getProperty("user.dir") + File.separator + "template" + File.separator;
	    String filePath = path + fileName + ".png";
        File file = new File(filePath);
		try {
			ChartUtilities.saveChartAsJPEG(file, chart, 800, 600);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return filePath;*/
        ChartFrame chartFrame=new ChartFrame("汽车口碑排行榜",chart);


        CategoryPlot plot = (CategoryPlot) chart.getCategoryPlot();
        BarRenderer customBarRenderer = (BarRenderer) plot.getRenderer();
        //设置柱状图颜色
        // customBarRenderer.setSeriesPaint(0, Color.decode("#F75000"));
        // customBarRenderer.setSeriesPaint(1, Color.decode("#FFD306"));
        //设置柱形图的宽度
        customBarRenderer.setMaximumBarWidth(0.03);
        //在图形上显示数字
        customBarRenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        // 设置为false柱子上就不显示数字
        customBarRenderer.setBaseItemLabelsVisible(false);
        customBarRenderer.setBaseItemLabelFont(new Font("宋体",Font.BOLD,15));
        // 设置背景透明度
        plot.setBackgroundAlpha(0.1f);
        // 设置网格横线颜色
        plot.setRangeGridlinePaint(Color.gray);
        // 设置网格横线大小
        plot.setDomainGridlineStroke(new BasicStroke(0.2F));
        plot.setRangeGridlineStroke(new BasicStroke(0.2F));

        //以合适的大小展现图形
        chartFrame.pack();
        //在D盘目录下生成图片
        File file = new File("D:/数据归集情况.jpeg");
        try {
            ChartUtilities.saveChartAsJPEG(file, chart, 800, 600);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //图形是否可见
        // chartFrame.setVisible(true);
        return getImageBase(file.getPath());
    }

    /**
     * 初始化
     * @param categoryBarDataset
     * @param categoryLineDataset
     * @return
     */
    private static JFreeChart createCharts(CategoryDataset categoryBarDataset, CategoryDataset categoryLineDataset, String title) {
        //参数: title,x轴说明,y轴说明,图例
        JFreeChart chart = ChartFactory.createBarChart(title, "", "", categoryBarDataset, PlotOrientation.VERTICAL,
                true, true, true);
        CategoryPlot plot = (CategoryPlot) chart.getPlot();
        //设置折线图颜色
        /*BarRenderer customBarRenderer = (BarRenderer) plot.getRenderer();
        customBarRenderer.setSeriesPaint(0, Color.decode("#F75000"));
        customBarRenderer.setSeriesPaint(1, Color.decode("#FFD306"));
        customBarRenderer.setSeriesPaint(2, Color.decode("#00A600"));*/
        // set right margin
        plot.getDomainAxis().setUpperMargin(0.1);
        // set X axis Label lines
        plot.getDomainAxis().setMaximumCategoryLabelLines(2);
        //NumberAxis na = (NumberAxis) plot.getRangeAxis();
        // stack bar chart
        StackedBarRenderer rederer = new StackedBarRenderer();
        plot.setRenderer(0, rederer);
        rederer.setBaseItemLabelsVisible(false);
        rederer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        rederer.setBaseItemLabelFont(new Font("Calibri", Font.ITALIC, 15));
        rederer.setMaximumBarWidth(0.07);
        rederer.setMinimumBarLength(0.1);
        rederer.setBarPainter(new StandardBarPainter());
        rederer.setSeriesPaint(0, new Color(65,105,225));
        rederer.setSeriesPaint(1, new Color(203,196,52));
        rederer.setSeriesPaint(2, new Color(128,7,248));

        // line chart
        LineAndShapeRenderer lineRenderer = new LineAndShapeRenderer();
        plot.setRenderer(1, lineRenderer);

        lineRenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        lineRenderer.setBaseItemLabelFont(new Font("Calibri", Font.ITALIC, 15));
        lineRenderer.setBasePositiveItemLabelPosition(
                new ItemLabelPosition(ItemLabelAnchor.INSIDE12, TextAnchor.BASELINE_LEFT));
        lineRenderer.setBaseItemLabelsVisible(false);
        lineRenderer.setBaseShapesVisible(false);
        // point style
        lineRenderer.setSeriesShape(0, new Rectangle(5, 5));
        lineRenderer.setBaseShapesVisible(false);

        NumberAxis rightYAxis = new NumberAxis("");
        rightYAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

        plot.setRangeAxis(1, rightYAxis);
        plot.setDataset(1, categoryLineDataset);
        plot.mapDatasetToRangeAxis(1, 1);
        // set render order
        plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
        return chart;
    }

调用方法

@ApiOperation(value = "下载健康报告文件")
    @GetMapping("/downloadResWord")
    public void downloadResWord(HttpServletResponse response) throws IOException, TemplateException, BizException {
        String newDte = DateUtil.dateToString(new Date(), "yyyyMMddHHmmss");
        String startMerge = "<w:vMerge w:val=\"restart\"/>";
        String endMerge = "<w:vMerge/>";
        Map<String, Object> dataMap = new HashMap<>(16);
        // 手动填充数据
        List<HealthReport> healthReport = healthReportService.list();
        dataMap.put("healthReport",healthReport.get(0));

        //数据业务支撑图表数据查询   业务场景多少事项
        Page<BusinessScene> page = new Page<>();
        Page<BusinessSceneDTO> data = businessSceneService.getBusinessScenePage(page,"","");
        // 生成柱状图表的数据
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        String imageStr = "";
        if(data.getRecords().size() >0) {
            for (BusinessSceneDTO dto: data.getRecords()) {
                dataset.addValue(dto.getMatterTotal(),"",dto.getName());
            }
            imageStr = JfreeChartUtil.DefaultCategoryDataset(dataset, "数据支撑业务",2);
        }
        dataMap.put("imageStr", imageStr);

        // 业务场景所需资源项清单-表格数据
        List<Map<String, Object>> dataList = new ArrayList<>();
        List<BusinessScene> list = businessSceneService.list(Wrappers.<BusinessScene>lambdaQuery()
                .orderByDesc(BusinessScene::getUpdateTime));
        if(list.size() >0) {
            int a = 1;
            for (int i=0;i< list.size(); i++) {
                // 根据场景ID查询事项
                List<BusinessMatter> matterList = matterService.list(Wrappers.<BusinessMatter>lambdaQuery()
                        .eq(BusinessMatter::getBusinessId, list.get(i).getId()));
                if(matterList.size() >0) {
                    for (int j = 0; j < matterList.size(); j++) {
                        Map<String, Object> map = new HashMap<>();
                        map.put("number", a);
                        // 场景名称
                        map.put("name", list.get(i).getName());
                        map.put("matterName", matterList.get(j).getMatterName());
                        if(j == 0) {
                            map.put("startMerge", startMerge);
                        } else {
                            map.put("endMerge", endMerge);
                        }
                        dataList.add(map);
                    }
                    a++;
                }
            }
        }
        dataMap.put("dataList", dataList);
        // 风险规则列表数据
        List<RiskPlanning> riskPlanningList = riskPlanningService.list(Wrappers.<RiskPlanning>lambdaQuery()
                .orderByDesc(RiskPlanning::getUpdateTime));
        dataMap.put("riskPlanningList", riskPlanningList);
        // 异常监测列表数据
        List<AnomalyDetection> anomalyDetectionList = anomalyDetectionService.list(Wrappers.<AnomalyDetection>lambdaQuery()
                .orderByDesc(AnomalyDetection::getUpdateTime));
        dataMap.put("anomalyDetectionList", anomalyDetectionList);
        // 数据归集告警列表数据
        List<AlarmManage> alarmManageList = alarmManageService.getAlarmManageList(0);
        dataMap.put("alarmManageList", alarmManageList);
        // 数据共享告警
        List<AlarmManage> alarmManages = alarmManageService.getAlarmManageList(1);
        dataMap.put("alarmManages", alarmManages);
        // 提供接口图表数据列表
        /*Date date = new Date();
        String startDate = DateUtil.dateToString(DateUtil.addDate(date,-7),DATE_FORMAT);
        String endDate = DateUtil.dateToString(date,DATE_FORMAT);*/
        List<CountDataDTO> callSituation = dataCollectionMapper.callSituationAll();
        // 生成柱状图表的数据
        DefaultCategoryDataset dataset1 = new DefaultCategoryDataset();
        String interFaceImag = "";
        if(callSituation.size() >0) {
            for (int k=0; k<callSituation.size();k++) {
                if(k<10){
                    dataset1.addValue(Double.valueOf(callSituation.get(k).getValue()),"",callSituation.get(k).getAbscissaName());
                }
            }
            interFaceImag = JfreeChartUtil.DefaultCategoryDataset(dataset1, "接口调用量",100000);
        }
        dataMap.put("interFaceImag", interFaceImag);
        @SuppressWarnings("deprecation")
        Configuration configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
        configuration.setClassForTemplateLoading(this.getClass(), "/file");
        //文件名,获取模板
        response.setContentType("application/msword");
        response.setHeader("Content-Disposition", "attachment;fileName=" + new String(("数据健康分析报告" + newDte + ".doc").getBytes("GBK"), "ISO-8859-1"));
        response.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();
        Template template = configuration.getTemplate("数据健康分析报告.ftl", "utf-8");
        template.process(dataMap, out);
        out.flush();
        out.close();
    }

posted @   码奴生来只知道前进~  阅读(151)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示