精华内容
下载资源
问答
  • 资源描述:一个使用java做的导出数据,并且可以在excel表生成折线图的工具类,使用简单操作方便。
  • java生成 折线图

    万次阅读 多人点赞 2019-01-21 11:10:32
    标题上就是生成的效果了, 下面是代码 package com.szboanda.ewaq_hn.jjrbg; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Paint; import java.io.File; ...
    Charts
    标题

    上图就是生成的效果了, 下面是代码

    
    
    package com.szboanda.ewaq_hn.jjrbg;
    
    import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Paint;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.NumberFormat;
    import java.util.List;
    import java.util.Vector;
    
    import javax.swing.SwingUtilities;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.ChartUtilities;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.StandardChartTheme;
    import org.jfree.chart.axis.ValueAxis;
    import org.jfree.chart.block.BlockBorder;
    import org.jfree.chart.labels.ItemLabelAnchor;
    import org.jfree.chart.labels.ItemLabelPosition;
    import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
    import org.jfree.chart.plot.CategoryPlot;
    import org.jfree.chart.plot.DefaultDrawingSupplier;
    import org.jfree.chart.plot.PieLabelLinkStyle;
    import org.jfree.chart.renderer.category.LineAndShapeRenderer;
    import org.jfree.chart.renderer.category.StandardBarPainter;
    import org.jfree.chart.renderer.xy.StandardXYBarPainter;
    import org.jfree.data.category.DefaultCategoryDataset;
    import org.jfree.ui.RectangleInsets;
    import org.jfree.ui.TextAnchor;
    
    
    /**
     * @Title:创建折线图
     * @author  
     * @since   JDK1.6
     * @history
     */
    public class CreatLineChart {
    
        /**
        * Jfreechart工具类
        * <p>
        * 解决中午乱码问题<br>
        * 用来创建类别图表数据集、创建饼图数据集、时间序列图数据集<br>
        * 用来对柱状图、折线图、饼图、堆积柱状图、时间序列图的样式进行渲染<br>
        * 设置X-Y坐标轴样式
        * <p>
        * 
        */
           private static String NO_DATA_MSG = "数据加载失败";
           private static Font FONT = new Font("宋体", Font.PLAIN, 12);
          
           public static Color[] CHART_COLORS = {
                   new Color(31,129,188), new Color(92,92,97), new Color(144,237,125), new Color(255,188,117),
                   new Color(153,158,255), new Color(255,117,153), new Color(253,236,109), new Color(128,133,232),
                   new Color(158,90,102),new Color(255, 204, 102) };//颜色
           /**
            * 静态代码块
            */
           static {
               setChartTheme();
           }
    
           /**
            * 无参构造器
            */
           public CreatLineChart() {
               
           }
           
           /** TODO  可以通过调用这个方法, 提供对应格式的参数即可生成图片,并存在指定位置
            * 生成一个这先出并保存为png格式,
            * @param title 图片标题
            * @param xtitle x轴标题
            * @param ytitle y轴标题
            * @param filepath 文件路径+文件名
            * @param categorie 横坐标类型
            * @param series 数据内容
            * @param width 图片宽度
            * @param height 图片高度
            * @throws Exception
            */
           public  static void CreateNewLineChartForPng(String title,String xtitle,String ytitle,String filepath,List<String> categorie,List<Serie> series,int width,int height) throws Exception{
                 ChartPanel  chartPanel = new CreatLineChart().createChart(title, xtitle, ytitle, categorie,series);
                 //将图片保存为png格式 
                 saveAsFile(chartPanel.getChart(),filepath,width,height);
           }
           
    
           /**
            * 中文主题样式 解决乱码
            */
           public static void setChartTheme() {
               // 设置中文主题样式 解决乱码
               StandardChartTheme chartTheme = new StandardChartTheme("CN");
               // 设置标题字体
               chartTheme.setExtraLargeFont(FONT);
               // 设置图例的字体
               chartTheme.setRegularFont(FONT);
               // 设置轴向的字体
               chartTheme.setLargeFont(FONT);
               chartTheme.setSmallFont(FONT);
               chartTheme.setTitlePaint(new Color(51, 51, 51));
               chartTheme.setSubtitlePaint(new Color(85, 85, 85));
    
               chartTheme.setLegendBackgroundPaint(Color.WHITE);// 设置标注
               chartTheme.setLegendItemPaint(Color.BLACK);//
               chartTheme.setChartBackgroundPaint(Color.WHITE);
               // 绘制颜色绘制颜色.轮廓供应商
               // paintSequence,outlinePaintSequence,strokeSequence,outlineStrokeSequence,shapeSequence
    
               Paint[] OUTLINE_PAINT_SEQUENCE = new Paint[] { Color.WHITE };
               // 绘制器颜色源
               DefaultDrawingSupplier drawingSupplier = new DefaultDrawingSupplier(CHART_COLORS, CHART_COLORS, OUTLINE_PAINT_SEQUENCE,
                       DefaultDrawingSupplier.DEFAULT_STROKE_SEQUENCE, DefaultDrawingSupplier.DEFAULT_OUTLINE_STROKE_SEQUENCE,
                       DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE);
               chartTheme.setDrawingSupplier(drawingSupplier);
    
               chartTheme.setPlotBackgroundPaint(Color.WHITE);// 绘制区域
               chartTheme.setPlotOutlinePaint(Color.WHITE);// 绘制区域外边框
               chartTheme.setLabelLinkPaint(new Color(8, 55, 114));// 链接标签颜色
               chartTheme.setLabelLinkStyle(PieLabelLinkStyle.CUBIC_CURVE);
    
               chartTheme.setAxisOffset(new RectangleInsets(5, 12, 5, 12));
               chartTheme.setDomainGridlinePaint(new Color(192, 208, 224));// X坐标轴垂直网格颜色
               chartTheme.setRangeGridlinePaint(new Color(192, 192, 192));// Y坐标轴水平网格颜色
    
               chartTheme.setBaselinePaint(Color.WHITE);
               chartTheme.setCrosshairPaint(Color.BLUE);// 不确定含义
               chartTheme.setAxisLabelPaint(new Color(51, 51, 51));// 坐标轴标题文字颜色
               chartTheme.setTickLabelPaint(new Color(67, 67, 72));// 刻度数字
               chartTheme.setBarPainter(new StandardBarPainter());// 设置柱状图渲染
               chartTheme.setXYBarPainter(new StandardXYBarPainter());// XYBar 渲染
    
               chartTheme.setItemLabelPaint(Color.black);
               chartTheme.setThermometerPaint(Color.white);// 温度计
    
               ChartFactory.setChartTheme(chartTheme);
           }
    
           
           /**
            * 创建类别数据集合
            */
           public static DefaultCategoryDataset createDefaultCategoryDataset(List<Serie> series, String[] categories) {
               DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    
               for (Serie serie : series) {
                   String name = serie.getName();
                   Vector<Object> data = serie.getData();
                   if (data != null && categories != null && data.size() == categories.length) {
                       for (int index = 0; index < data.size(); index++) {
                           String value = data.get(index) == null ? "" : data.get(index).toString();
                           if (isPercent(value)) {
                               value = value.substring(0, value.length() - 1);
                           }
                           if (isNumber(value)) {
                               dataset.setValue(Double.parseDouble(value), name, categories[index]);
                           }
                       }
                   }
    
               }
               return dataset;
    
           }
    
           /**
            * 设置图例无边框,默认黑色边框
            */
           public static void setLegendEmptyBorder(JFreeChart chart) {
               chart.getLegend().setFrame(new BlockBorder(Color.WHITE));
    
           }
           
           /**
            * 是不是一个%形式的百分比
            * 
            * @param str
            * @return
            */
           public static boolean isPercent(String str) {
               return str != null ? str.endsWith("%") && isNumber(str.substring(0, str.length() - 1)) : false;
           }
           
           /**
            * 是不是一个数字
            * 
            * @param str
            * @return
            */
           public static boolean isNumber(String str) {
               return str != null ? str.matches("^[-+]?(([0-9]+)((([.]{0})([0-9]*))|(([.]{1})([0-9]+))))$") : false;
           }
           
           /**
            * 设置 折线图样式
            * 
            * @param plot
            * @param isShowDataLabels
            *            是否显示数据标签 默认不显示节点形状
            */
           public static void setLineRender(CategoryPlot plot, boolean isShowDataLabels) {
               setLineRender(plot, isShowDataLabels, false);
           }
           /**
            * 设置折线图样式
            * 
            * @param plot
            * @param isShowDataLabels
            *            是否显示数据标签
            */
           @SuppressWarnings("deprecation")
        public static void setLineRender(CategoryPlot plot, boolean isShowDataLabels, boolean isShapesVisible) {
               plot.setNoDataMessage(NO_DATA_MSG);
               plot.setInsets(new RectangleInsets(10, 10, 0, 10), false);
               LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();
    
               renderer.setStroke(new BasicStroke(1.5F));
               if (isShowDataLabels) {
                   renderer.setBaseItemLabelsVisible(true);
                   renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator(StandardCategoryItemLabelGenerator.DEFAULT_LABEL_FORMAT_STRING,
                           NumberFormat.getInstance()));
                   renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE1, TextAnchor.BOTTOM_CENTER));// weizhi
               }
               renderer.setBaseShapesVisible(isShapesVisible);// 数据点绘制形状
               setXAixs(plot);
               setYAixs(plot);
    
           }
    
           
           /**
            * 设置类别图表(CategoryPlot) X坐标轴线条颜色和样式
            * 
            * @param axis
            */
           public static void setXAixs(CategoryPlot plot) {
               Color lineColor = new Color(31, 121, 170);
               plot.getDomainAxis().setAxisLinePaint(lineColor);// X坐标轴颜色
               plot.getDomainAxis().setTickMarkPaint(lineColor);// X坐标轴标记|竖线颜色
    
           }
    
           /**
            * 设置类别图表(CategoryPlot) Y坐标轴线条颜色和样式 同时防止数据无法显示
            * 
            * @param axis
            */
           public static void setYAixs(CategoryPlot plot) {
               Color lineColor = new Color(192, 208, 224);
               ValueAxis axis = plot.getRangeAxis();
               axis.setAxisLinePaint(lineColor);// Y坐标轴颜色
               axis.setTickMarkPaint(lineColor);// Y坐标轴标记|竖线颜色
               // 隐藏Y刻度
               axis.setAxisLineVisible(false);
               axis.setTickMarksVisible(false);
               // Y轴网格线条
               plot.setRangeGridlinePaint(new Color(192, 192, 192));
               plot.setRangeGridlineStroke(new BasicStroke(1));
    
               plot.getRangeAxis().setUpperMargin(0.1);// 设置顶部Y坐标轴间距,防止数据无法显示
               plot.getRangeAxis().setLowerMargin(0.1);// 设置底部Y坐标轴间距
    
           }
           
           /**
            * 必须设置文本抗锯齿
            */
           public static void setAntiAlias(JFreeChart chart) {
               chart.setTextAntiAlias(false);
    
           }
    
           //-----------------------------------------------------------------------------------------------------------------
           /**
            * 
            * 折线图
            *       <p>
            *       创建图表步骤:<br/>
            *       1:创建数据集合<br/>
            *       2:创建Chart:<br/>
            *       3:设置抗锯齿,防止字体显示不清楚<br/>
            *       4:对柱子进行渲染,<br/>
            *       5:对其他部分进行渲染<br/>
            *       6:使用chartPanel接收<br/>
            * 
            *       </p>
            */
           //创建折线图图表
           public DefaultCategoryDataset createDataset(List<String> categorie,List<Serie> series) {
               // 标注类别
               String[] categories = categorie.toArray(new String[categorie.size()]);
               //横坐标
    //           String[] categories = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
    //           series = new Vector<Serie>();
    //           // 柱子名称:柱子所有的值集合
    //           //纵坐标
    //           series.add(new Serie("Tokyo", new Double[] { 49.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4 }));
    //           series.add(new Serie("New York", new Double[] { 83.6, 78.8, 98.5, 93.4, 106.0, 84.5, 105.0, 104.3, 91.2, 83.5, 106.6, 92.3 }));
    //           series.add(new Serie("London", new Double[] { 48.9, 38.8, 39.3, 41.4, 47.0, 48.3, 59.0, 59.6, 52.4, 65.2, 59.3, 51.2 }));
    //           series.add(new Serie("Berlin", new Double[] { 42.4, 33.2, 34.5, 39.7, 52.6, 75.5, 57.4, 60.4, 47.6, 39.1, 46.8, 51.1 }));
               // 1:创建数据集合
               DefaultCategoryDataset dataset = CreatLineChart.createDefaultCategoryDataset(series, categories);
               return dataset;
           }
    
           /**
            * 创建折线图
            * @param title 折线图标题
            * @param xtitle x轴标题
            * @param ytitle y轴标题
            * @param categorie 横坐标类别
            * @param series 数据集
            * @return
            * @throws Exception
            */
           public ChartPanel createChart(String title,String xtitle,String ytitle,List<String> categorie,List<Serie> series) throws Exception {
               
               // 2:创建Chart[创建不同图形]
               JFreeChart chart = ChartFactory.createLineChart(title, xtitle, ytitle, createDataset(categorie,series));
               // 3:设置抗锯齿,防止字体显示不清楚
               CreatLineChart.setAntiAlias(chart);// 抗锯齿
               // 4:对柱子进行渲染[[采用不同渲染]]
               CreatLineChart.setLineRender(chart.getCategoryPlot(), false,true);//
               // 5:对其他部分进行渲染
               CreatLineChart.setXAixs(chart.getCategoryPlot());// X坐标轴渲染
               CreatLineChart.setYAixs(chart.getCategoryPlot());// Y坐标轴渲染
               // 设置标注无边框
               chart.getLegend().setFrame(new BlockBorder(Color.WHITE));
               // 6:使用chartPanel接收
               ChartPanel chartPanel = new ChartPanel(chart);
               return chartPanel;
           }
    
           
           /**
            * 主方法 用来测试  `
            * @param args
            */
           public static void main(String[] args) {
    //           final JFrame frame = new JFrame();
    //           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //           frame.setSize(1024, 420);
    //           frame.setLocationRelativeTo(null);
            try {
                List<String> categorie = null;
                List<Serie> series = null;
                //横坐标
                String[] categories = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
                series = new Vector<Serie>();
                // 柱子名称:柱子所有的值集合
                //纵坐标
                series.add(new Serie("Tokyo", new Double[] { 49.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4 }));
                series.add(new Serie("New York", new Double[] { 83.6, 78.8, 98.5, 93.4, 106.0, 84.5, 105.0, 104.3, 91.2, 83.5, 106.6, 92.3 }));
                series.add(new Serie("London", new Double[] { 48.9, 38.8, 39.3, 41.4, 47.0, 48.3, 59.0, 59.6, 52.4, 65.2, 59.3, 51.2 }));
                series.add(new Serie("Berlin", new Double[] { 42.4, 33.2, 34.5, 39.7, 52.6, 75.5, 57.4, 60.4, 47.6, 39.1, 46.8, 51.1 }));
                
                ChartPanel  chartPanel = new CreatLineChart().createChart(NO_DATA_MSG, NO_DATA_MSG, NO_DATA_MSG, categorie,series);
    //            frame.getContentPane().add(chartPanel);
    //            frame.setVisible(true);
                //将图片保存为png格式 
    //            saveAsFile(chartPanel.getChart(),"D:\\1\\lol.png",900,500);
                CreateNewLineChartForPng("lol2.png", NO_DATA_MSG, NO_DATA_MSG, NO_DATA_MSG, categorie, series, 900, 500);
                
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            
            //swing 运行
               SwingUtilities.invokeLater(new Runnable() {
                   @Override
                   public void run() {
                       // 创建图形
                    try {
                        
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                   }
               });
           }
          
           
            
            /**
             * 将图表保存为PNG、JPEG图片
             * @param chart  折线图对象
             * @param outputPath 文件保存路径, 包含文件名
             * @param weight  宽
             * @param height 高
             * @throws Exception
             */
           public static void saveAsFile(JFreeChart chart, String outputPath, int weight, int height)throws Exception {      
               FileOutputStream out = null;      
                   File outFile = new File(outputPath);      
                   if (!outFile.getParentFile().exists()) {      
                       outFile.getParentFile().mkdirs();      
                   }      
                   out = new FileOutputStream(outputPath);      
                   // 保存为PNG      
                   ChartUtilities.writeChartAsPNG(out, chart, weight, height);      
                   // 保存为JPEG      
                   // ChartUtilities.writeChartAsJPEG(out, chart, weight, height);      
                   out.flush();      
                   if (out != null) {      
                       try {      
                           out.close();      
                       } catch (IOException e) {      
                           // do nothing  
                           e.printStackTrace();
                       }      
    
               }      
           }
           
           
           
           
    }
       
    

    下面是 一个实体类

     

    package com.szboanda.ewaq_hn.jjrbg;
    
    import java.io.Serializable;
    import java.util.Vector;
    
    /**
     * 系列:名字和数据集合 构成一条曲线</br> 可以将serie看作一根线或者一根柱子:
     * 
     * <p>
     * 参照JS图表来描述数据:series: [{ name: 'Tokyo', data: [7.0, 6.9, 9.5, 14.5]
     * }, { name: 'New York', data: [-0.2, 0.8, 5.7, 11.3} ]
     * 
     * 
     */
    public class Serie implements Serializable {
    
        private static final long serialVersionUID = 1L;
        private String name;// 名字
        private Vector<Object> data;// 数据值ֵ
    
        public Serie() {
    
        }
    
        /**
         * 
         * @param name
         *            名称(线条名称)
         * @param data
         *            数据(线条上的所有数据值)
         */
        public Serie(String name, Vector<Object> data) {
    
            this.name = name;
            this.data = data;
        }
    
        /**
         * 
         * @param name
         *            名称(线条名称)
         * @param array
         *            数据(线条上的所有数据值)
         */
        public Serie(String name, Object[] array) {
            this.name = name;
            if (array != null) {
                data = new Vector<Object>(array.length);
                for (int i = 0; i < array.length; i++) {
                    data.add(array[i]);
                }
            }
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Vector<Object> getData() {
            return data;
        }
    
        public void setData(Vector<Object> data) {
            this.data = data;
        }
    
    }
    

    上面代码是一个完整的类, 可以通过调用其中的 CreateNewLineChartForPng() 方法 并传入对应参数自动生成折线图

    展开全文
  • //div用来实现折线图 <div class="echarts" id="look" style="width:47%; height:350px;background-color: #4e896f;float: left;margin-left: 10px;display: inline"></div> //引入echarts.js 可以...

    页面效果:

    在这里插入图片描述

    页面代码:

    //div用来实现折线图
     <div class="echarts" id="look" style="width:47%; height:350px;background-color: #4e896f;float: left;margin-left: 10px;display: inline"></div> 
     //引入echarts.js  可以echarts官网进行下载,然后放入项目中即可。如下图所示:
     <script src="admin/plugins/echarts/echarts.min.js"></script>
    <script>
        // 根据div的ID获取实例
        var myChart = echarts.init(document.getElementById('look'));
        option = {
            tooltip: {
                trigger: 'axis',
                axisPointer: {
                    crossStyle: {
                        color: '#999'
                    }
                }
            },
            toolbox: {
                feature: {
                    dataView: {show: true, readOnly: false},
                    magicType: {show: true, type: ['line', 'bar']},
                    restore: {show: true},
                    saveAsImage: {show: true}
                }
            },
            //在折线图正上方设置说明
            legend: {
                data: ['浏览量']
            },
            //在这里设置x轴  data为x轴上面显示的数据
            xAxis: [
                {
                    type: 'category',
                    data: [],
                }
            ],
            //在这里设置y轴 
            //name是y轴上面的说明
            //min是y轴最小值
            //max是y轴最大值
            //interval是y轴的区间
            yAxis: [
                {
                    type: 'value',
                    name: '人数',
                    min: 0,
                    max: 250,
                    interval: 50,
                    axisLabel: {
                        formatter: '{value} 人'
                    }
                },
    
            ],
            //数据源
            //type为类型,line:折线图,bar:柱状图
            //
            series: [
                {
                    name: '浏览量',
                    type: 'line',
                    data: []
                },
            ]
        };
        myChart.showLoading(); //数据加载完之前先显示一段简单的loading动画
        //声明两个数组,用来临时存放数据
        var weeks1 = [];
        var looks = [];
        $.ajax({
            type : "POST",
            async : true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
            url : "/article/looklist",
            dataType : "json",
            success : function(data) {
                //请求成功时执行该函数内容,result即为服务器返回的json对象
                if (data.status==200) {
                    var obj = eval(data.data);     //解析后台传来的json数据
                    for (var i = 0; i < obj.length; i++) {
                        weeks1.push(obj[i].name);
                    }
                    for (var i = 0; i < obj.length; i++) {
                        looks.push(obj[i].num);
                    }
                    myChart.hideLoading(); //隐藏加载动画
                    myChart.setOption({ //加载数据图表
                        xAxis : {
                            data : weeks1
                        },
                        series : [ {
                            // 根据名字对应到相应的系列
                            name : '浏览量',
                            data : looks
                        } ]
                    });
                }else{
                    alert("后台数据获取失败!");
                }
            },
            error : function(errorMsg) {
                //请求失败时执行该函数
                alert("图表请求数据失败!");
                myChart.hideLoading();
            }
        })
        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);
    </script>
    

    echarts.js在项目中存放的位置(供参考)
    在这里插入图片描述

    后台代码:

    从数据库获取数据,返回给前台
    
    	//EchartsEntity 是一个对象 里面有count和time属性
        @PostMapping("/looklist")
        @ResponseBody
        public ResponseVo looklist(){
        	//先获取近七天的日期
            List<String> sevenDate = getSevenDate();
            //查询近七天的数据量  sql语句在后面
            List<EchartsEntity>  articleList = articleService.selectWeekLookCount(sevenDate);
            //创建一个新集合  用来存放最终的数据
            List<EchartsEntity> list = new ArrayList<>();
            //遍历七天的日期 
            for(int i = 0; i < sevenDate.size(); i++){
                EchartsEntity echartsEntity = new EchartsEntity();
                echartsEntity.setTime(sevenDate.get(i));
                boolean b = false;
                //遍历获取到的数据
                for(int y =- 0; y < articleList.size(); y++){
                	//用来判断某一天是否有数据 如果有就存到list中
                    if (sevenDate.get(i).equals(articleList.get(y).getTime())){
                        echartsEntity.setNum(articleList.get(y).getNum());
                        list.add(echartsEntity);
                        b = true;
                        break;
                    }
                }
                //如果没有 就设置num为0,再存放到list中
                if(!b){
                    echartsEntity.setNum("0");
                    list.add(echartsEntity);
                }
            }
            return ResultUtil.vo(CoreConst.SUCCESS_CODE,"获取浏览量成功",list);
        }
    
    获取近七天的日期(包含今天)
      //获取近七天日期
        public static List<String> getSevenDate() {
            List<String> dateList = new ArrayList<>();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            for (int i = 0; i < 7; i++) {
                Date date = DateUtils.addDays(new Date(), -i);
                String formatDate = sdf.format(date);
                dateList.add(formatDate);
            }
            return dateList;
        }
    

    sql语句

    //download_log_time是条件字段
    <select id="selectWeekDownloadCount" resultType="com.puboot.module.admin.model.EchartsEntity">
    		SELECT
    		COUNT(*) AS 'num',  //给条数设置别名为num
    		DATE_FORMAT(download_log_time,'%Y-%m-%d') AS 'time'  //给时间设置别名为time
    		FROM
    		download_log
    		WHERE
    		DATE_FORMAT(download_log_time, '%Y-%m-%d') IN //因为是近七天 所以要in七天的日期
    		<foreach collection="list" item="sevenDate" separator="," open="(" close=")">
    			#{sevenDate}
    		</foreach>
    		GROUP BY
    		DATE_FORMAT(download_log_time, '%Y-%m-%d')
    		ORDER BY
    		DATE_FORMAT(download_log_time, '%Y-%m-%d') DESC; //排序
    	</select>
    
    sql语句执行结果如下:

    在这里插入图片描述

    展开全文
  • java连接mysql绘制折线图

    千次阅读 2018-11-18 17:36:18
    eclipse使用java连接本地mysql服务器获取数据绘制折线图。 连接数据库需要mysql-connector-java,画折线图需要jfreechart、和jcommon。(https://sourceforge.net/projects/jfreechart/files/) 除了弹窗显示流程...

    java连接mysql绘制折线图

    介绍

    eclipse使用java连接本地mysql服务器获取数据绘制折线图。
    连接数据库需要mysql-connector-java,画折线图需要jfreechart、和jcommon。(https://sourceforge.net/projects/jfreechart/files/)
    除了弹窗显示折线图外,还使用ChartUtilities.saveChartAsPNG()保存到本地。

    mysql表格

    在这里插入图片描述

    代码

    package dsa;
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.io.File;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.text.SimpleDateFormat;
    import javax.swing.JFrame;
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.ChartUtilities;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.DateAxis;
    import org.jfree.chart.axis.ValueAxis;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.data.time.Day;
    import org.jfree.data.time.Hour;
    import org.jfree.data.time.Minute;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    import org.jfree.data.xy.XYDataset;
    public class demo_test_final {
    	static String sql = "select * from environmental_information";//SQL语句    输入表名
    	static ResultSet rs = null;
    	public static final String url = "jdbc:mysql://localhost:3306/chatdb?serverTimezone=UTC";//输入数据库名
    	public static final String user = "root";
    	public static final String password = "rootroot";
    	public static Connection conn = null;
    	public static PreparedStatement ps = null;    
    	ChartPanel frame1;
    	JFreeChart jfreechart;
    	public static double co=0; 
    	public static double co2=0;	
    	public demo_test_final(){		
    		try {
        		Class.forName("com.mysql.cj.jdbc.Driver");//指定连接类型
        		conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/chatdb?user=root&password=rootroot&useSSL=false&userUnicode=true&characterEncoding=GBK");//获取连接
        		ps = conn.prepareStatement(sql);//准备执行语句
        		} 
        	catch (Exception e) {
        		e.printStackTrace();
        		}    
    		XYDataset xydataset = createDataset();
    		jfreechart = ChartFactory.createTimeSeriesChart("环境浓度变化", "时间", "气体浓度",xydataset, true, true, true);
    		XYPlot xyplot = (XYPlot) jfreechart.getPlot();
    		DateAxis dateaxis = (DateAxis) xyplot.getDomainAxis();
            dateaxis.setDateFormatOverride(new SimpleDateFormat("hh:mm"));
            frame1=new ChartPanel(jfreechart,true);
            dateaxis.setLabelFont(new Font("黑体",Font.BOLD,14));         
            dateaxis.setTickLabelFont(new Font("宋体",Font.BOLD,12)); 
            ValueAxis rangeAxis=xyplot.getRangeAxis();
            rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));
            jfreechart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15));
            jfreechart.getTitle().setFont(new Font("宋体",Font.BOLD,20));
    	} 
    	 private static XYDataset createDataset() {  
    		 	Day day = new Day(11, 18, 2018);
    			Hour hour = new Hour(12, day);
    			TimeSeries timeseries1 = new TimeSeries("CO浓度",Minute.class);
    			TimeSeries timeseries2 = new TimeSeries("CO2浓度",Minute.class);
    			try {
    				rs = ps.executeQuery();
    				double time;
    				double gettime = 0;
    				
    				while (rs.next()) {		
    					gettime=rs.getDouble("Time");//输入要输出的元素名
    					co2 = rs.getDouble("CO2");
    					co=rs.getDouble("CO");
    				    time=((gettime-12.0)*100);
    					timeseries1.add(new Minute((int) Math.round(time), hour), co);
    					timeseries2.add(new Minute((int) Math.round(time), hour), co2);
    				}
    				//关闭连接
    				rs.close();
    				conn.close();
    				ps.close();
    			} 
    			catch (SQLException e) {
    				e.printStackTrace();
    				}
    	        TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
    	        timeseriescollection.addSeries(timeseries2);
    	        timeseriescollection.addSeries(timeseries1);
    	        return timeseriescollection;
    	    }
    	  public ChartPanel getChartPanel(){
    	    	return frame1;	
    	    }
    	  
    	  public void getChart() {
    		    JFrame frame=new JFrame("Java数据统计图");
    			frame.setLayout(new GridLayout(2,2,10,10));
    			frame.add(new demo_test_final().getChartPanel());    //添加折线图
    			frame.setBounds(50, 50, 700, 500);
    			frame.setVisible(true);
    			File file = new File("d:\\a.png");
    			try {
                    ChartUtilities.saveChartAsPNG(file, jfreechart, 700, 500);
                   } catch (IOException e) {
                      e.printStackTrace();
                 }
    	  }	
    	  public static void main(String args[]){
    		    demo_test_final testf=new demo_test_final();
    			testf.getChart();
    		}
    }
    
    

    结果

    在这里插入图片描述

    展开全文
  • 牛刀小试Highcharts表格 最近做了一个小项目,里面需要做个柱状,柱状来表示两个关联的属性,账单内容context,账单金额money,大概如下: 而且由于这个图表库Highcharts代码对参数的格式限制,只能把...

    牛刀小试Highcharts图表格

    最近做了一个小项目,里面需要做个柱状图,柱状图来表示两个关联的属性,账单内容context,账单金额money,大概如下图:

    而且由于这个图表库Highcharts代码对参数的格式限制,只能把context和money分别存在不同数组里。

    直接上代码!

    Billmapper.xml   SQL语句

    <select id="queryEachbillsBigMoney" parameterType="String" resultType="map" >
            SELECT money,context
            FROM ssm_bill
            WHERE category = "大额支出" AND SUBSTR(create_time,1,7) = #{dates}
            AND context is not null  AND money is not null order by create_time asc;
        </select>

    在BillDao.java 

    public List<Map<String,Object>>  queryEachbillsBigMoney(String dates);

    在BillSerivceImpl.java  核心代码

    @Override
        public BigMoneyBill queryEachbillsBigMoney(DateBean dateBean) {
            String dates = fun(dateBean);//转换日期
    
            List<Map<String, Object>>  list = null;
            try{
                //1、获取所有键值对对象的集合
                list = billDao.queryEachbillsBigMoney(dates.substring(0,7));
            }catch(Exception e){
                System.out.println(dates.substring(7)+"查询某年某月的每一笔的大额支出:无数据");
            }
    
            int size = billDao.CountBillsBigMoney(dates.substring(0,7));
            BigDecimal[] money = new BigDecimal[size]; //账单金额
            String[] context = new String[size]; //账单内容
            //应该这样定义,否则会爆java.lang.NullPointException:java空指针异常。这就是代码规范的重要性
    
            int i=0,j=0;//两个循环变量
            //2、foreach遍历键值对对象的集合,得到每一个键值对对象
            for(Map<String, Object> map : list) {
                for(Map.Entry e: map.entrySet()) {
                    // 3、根据键值对对象获得键和值
    
                    if(e.getKey().equals("context")){
                        context[i++] = (String) e.getValue();
                    }
                    if(e.getKey().equals("money")){
                        money[j++] = (BigDecimal) e.getValue();
                    }
                }
            }
            //一个自定义对象要这样初始化定义,不要BigMoneyBill bigMoneyBill.
            BigMoneyBill bigMoneyBill = new BigMoneyBill();
            bigMoneyBill.setMoney(money);
            bigMoneyBill.setContext(context);
            return bigMoneyBill;
        }

    注意看里面的1,2,3步。从这里,我们才知道前面定义的函数类型 List<Map<String,Object>>,list里面有两个 Map<String,Object>,包括一个Map<"context",String>,一个Map<"money",BigDecimal>,接下来只要把这两个map里包含的N条数据读取到数组里就可以,然后把数组赋值到为向前端传参特意封装的BillMoneyBill对象里。

    public class BigMoneyBill {
        private BigDecimal[] money; //账单金额
        private String[] context; //账单内容
    
        getset方法,省略了哈
    }
    

    在BillController.java里

     /**
         * 查询某年某月的每一笔的大额支出 ,生成柱状图
         */
        @RequestMapping("/queryEachbillsBigMoney")
        public Result queryEachbillsBigMoney(@RequestBody DateBean dateBean){
            BigMoneyBill bigMoneyBill = billService.queryEachbillsBigMoney(dateBean);
            return Result.ok().put("bigMoneyBill",bigMoneyBill);
        }

    这时候前端js就可以直接调用api接口得到封装好的数据了。

    $(document).ready(function() {
        var url = 'bill/queryEachbillsBigMoney';
        $.ajax({
            type: 'POST',//方法类型
            dataType: "json",//预期服务器返回的数据类型
            url: url,//url
            contentType: "application/json; charset=utf-8",
            data: JSON.stringify(data),
    
            success: function (result) {
                console.log(result);//打印服务端返回的数据
                if (result.code == 200 && result.bigMoneyBill != null) {
    
                    //柱状图-start
                    var chart = {
                        type: 'column'
                    };
                    var title = {
                        text:  month+'月大额支出统计'
                    };
                    var subtitle = {
                        text: 'Source: Hello_Bill'
                    };
                    var xAxis = {
                        categories: result.bigMoneyBill.context,
                        crosshair: true
                    };
                    var yAxis = {
                        min: 0,
                        title: {
                            text: '人民币¥(元)'
                        }
                    };
                    var tooltip = {
                        headerFormat: '<span style="font-size:10px">{point.key}</span><table>',
                        pointFormat: '<tr><td style="color:{series.color};padding:0">{series.name}: </td>' +
                            '<td style="padding:0"><b>{point.y:.2f} 元</b></td></tr>',
                        footerFormat: '</table>',
                        shared: true,
                        useHTML: true
                    };
                    var plotOptions = {
                        column: {
                            pointPadding: 0.2,
                            borderWidth: 0
                        }
                    };
                    var credits = {
                        enabled: false
                    };
    
                    var series= [{
                        name: '大额支出',
                        data: result.bigMoneyBill.money
                    }];
    
                    var json = {};
                    json.chart = chart;
                    json.title = title;
                    json.subtitle = subtitle;
                    json.tooltip = tooltip;
                    json.xAxis = xAxis;
                    json.yAxis = yAxis;
                    json.series = series;
                    json.plotOptions = plotOptions;
                    json.credits = credits;
                    $('#bigmoneyGraph').highcharts(json);
                    //柱状图-end
                }
                else {
                    swal("查询失败", {
                        icon: "error",
                    });
                };
            },
            error: function () {
                swal("服务器出错", {
                    icon: "error",
                });
            }
        });
    });
    

    参考:https://blog.csdn.net/adudeboke/article/details/78853510

    https://www.cnblogs.com/quyixuanblog/p/5217310.html

    http://www.runoob.com/highcharts/highcharts-column-basic.html

    展开全文
  • Java实现Word画折线图(非图片)

    千次阅读 2020-03-01 13:16:21
    最近需要实现Java在Word中画折线图功能,不能简单的生成折线图再导入。实现方法就是利用Apache poi 工具。实现的效果如下,把鼠标放上去可以显示值。 比较简单,有一些坑,发出来记录一下。 模板 要实现上述效果...
  • // 折线图 public static String getLineNumOption(String title, List<String> legend, List<String> xAxis, List<String> series) { String legendStr = ""; for (int i = 0; i < l...
  • 最终效果 饼状:饼状示例,使劲点我!!! 柱状:柱状实例,使劲点我!...渲染数据 html代码 <template> <section class="chart-container"> <el-row> <el-badge ...
  • java后端实现生成折线图等统计图表

    千次阅读 2020-02-16 12:09:09
    需求:java通过poi往word里插入统计图,例如用水用电趋势图,企业纳税折线图等。 方案一:通过jfeechart实现,代码如下: import java.awt.Color; import java.awt.Font; import java.io.File; import java.io....
  • 本文给大家介绍使用java实现各种数据统计图(柱形图,饼图,折线图),需要的朋友可以参考下 最近在做数据挖掘的课程设计,需要将数据分析的结果很直观的展现给用户,这就要用到数据统计图,要实现这个功能就需要几...
  • 场景一,前端页面需要展示近7天,近30天,近x天的数据 。 数据库里面带着开始时间和结束时间去查数据的时候,(前端只给7/10x需要自己拼凑开始和结束时间)不是每一天都有数据,例如8.5是0,数据库是没有记录的,...
  • controller层 ... * 查询一段时间内的折线图 */ @GetMapping("/getAddFansTrendLineChart") @ApiOperation(value = "查询一段时间内的折线图") public R getAddTrendLineChart( @RequestParam(defaultV...
  • 需求如下 1、数据库中有一张表名为alarm_data的表,有time(时间),address(地址),shift(位移)三列  这个表是用来存储当发生位移报警时,发生的时间、报警... 折线图横坐标是时间0,1,2,3,4,5,6,7,8,9,10.........
  • 此篇博客内容主要是本人实际工作经验。话不多说,直接附上具体实现 因js原太长,所以直接附上js源码
  • 用于统计的折线图点类NumberVO @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @ApiModel(value="数据统计类") public class NumberVO { @ApiModelProperty(value = "统计属性的名称,如...
  • 仅通过POI的话,只能实现折线图和散点图 但POI还支持Open Xml,通过这种方式可以实现很多类型的chart POI版本 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</...
  • [java使用poi操作world生成饼图,柱状图,折线图,组合图:一](https://blog.csdn.net/weixin_44440642/article/details/119004129)直接上代码maven测试类:单图表(入口)测试类:组合图表(入口)工具类:组合数据类...
  • // 处理图表数据,柱状图、折线图、饼图啊之类的 } /** * 处理段落文字 * * @param doc * @throws InvalidFormatException * @throws FileNotFoundException * @throws IOException */ public ...
  • Echarts折线图获取数据库数据展示

    千次阅读 2020-05-23 15:56:38
    Echarts折线图获取mysql中的数据展示
  • swing绘制折线图

    千次阅读 热门讨论 2019-10-16 15:57:03
    swing开发数据变化折线图(显示0时到当前时间的)案例:详细描述效果图片折线图工具类测试类数据类 案例:详细描述 需求要求定时刷新该折线图,只展示此刻之前的数据,但横坐标要求显示一天0点到23点。 效果图片 ...
  • JSP中JS获取java传值日期作为折线图横坐标显示 01. 数据准备 (1) 错误获取数据分析 此处要重要强调的是,js接收JSP中 java 数据部分,接收得到的值是字符串型,还要根据需要的类型转换,若需要日期xxxx-xx-xx年月日...
  • // 处理图表数据,柱状图、折线图、饼图啊之类的 } /** * 处理段落文字 * * @param doc * @throws InvalidFormatException * @throws FileNotFoundException * @throws IOException */ public static void ...
  • ECharts折线图渲染json格式数据(json格式,为数组) 需要对数组进行循环取值,将取到的值分别赋值给x轴和y轴 json格式,data为数组 { "msg": "查询成功", "code": 1, "data": [{ "statTime": "2021-03", ...
  • 接上上次的学习,这次学习的内容是如何动态的显示数据。 目录一、学习动态显示数据前的准备工作二、如何建立长连接,来实现前后端通信。1. 编写一个 WebSocket 的配置2. 编写一个 WebSocket 用来处理连接3. 前端...
  • 使用Apache POI绘制折线图

    千次阅读 2016-10-05 14:10:08
    最近因为项目需要,学习了一下使用Apache POI绘制Excel折线图,话不多说,直接上代码。 String filePath = "DTD.xlsx"; FileInputStream inPut = new FileInputStream(filePath); Workbook workBook = ...
  • 使用折线图来显示查询结果 一、. 首先需要进行查询,先拿到数据; 废话不多说直接上代码 浏览量和Ip量 二、独立新IP 三、成单 四、成交总额 查询设置条件 ...
  • 每个系列通过type决定自己的图表类型 series: [ { name: '访问量', //折线图 type: 'line', data: data.vdate,//处理小数点数据 markPoint: { data: [ {type: 'max', name: '最大值'}, {type: 'min', name: '最小值'...
  • Echarts多条折线图(前后端代码)

    千次阅读 2020-05-19 14:56:00
    Echarts多条折线图 先来看一下效果 前端代码 <script type="text/javascript"> $(top.hangge()); $(function () { // 基于准备好的dom,初始化echarts实例 var myChart = echarts.init(document....
  • 折线图 条形图 点图 或实现自己的自定义类型。 主要功能 折线图,条形图,点 不同图形类型的组合 垂直和水平滚动。 您可以用手指触摸手势滚动。 缩放/缩放垂直和水平。 使用两指触摸比例手势(多点触摸),可以...
  • 文章目录1、散点图1.1、导入数据1.2、数据可视化1.3、设置参数1.4、自定义样式1.5、解决中文不能显示2、折线图2.1、导入数据2.2、日期类型转换2.3、数据可视化3、饼图3.1、导入数据3.2、分组统计数量3.2、饼图展示4...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,420
精华内容 2,568
关键字:

java折线图数据类型

java 订阅