按区域统计采购金额 jfreechart 图表显示

本文介绍了一种基于jFreeChart的区域采购金额统计方法,通过SQL查询获取数据,并利用jFreeChart生成柱状图进行可视化展示。

1.1 需求
根据查询条件,按区域统计采购金额

这里写图片描述

1.2 实现

1.2.1 dao
根据查询条件,获取jfreechart的dataset所需要的统计数据。

Sql:
统计数据的原始数据,是交易明细列表。

select yybusiness.areaname, sum(yybusiness.cgje) cgje
  from (select yybusiness.*,
               (select bss_sys_area.areaname
                  from bss_sys_area
                 where areaid = yybusiness.parentid) areaname
          from (select yybusiness.*,
                       (select parentid
                          from bss_sys_area
                         where areaid = yybusiness.useryydq) parentid
                  from (select yybusiness.useryyid,
                               (select dq
                                  from useryy
                                 where id = yybusiness.useryyid) useryydq,

                               yybusiness.cgje
                          from (

                                select useryy.id      useryyid,
                                        useryy.mc      useryymc,
                                        yycgd.bm       yycgdbm,
                                        yycgd.id       yycgdid,
                                        usergys.id     usergysid,
                                        usergys.mc     usergysmc,
                                        yycgdmx.ypxxid,
                                        ypxx.id,
                                        ypxx.bm,
                                        ypxx.mc,
                                        ypxx.jx,
                                        ypxx.gg,
                                        ypxx.zhxs,
                                        ypxx.scqymc,
                                        ypxx.spmc,

                                        ypxx.jyzt,

                                        (select info
                                           from dictinfo
                                          where ypxx.jyzt = dictcode
                                            and typecode = '003') jyztmc,
                                        (select info
                                           from dictinfo
                                          where typecode = '011'
                                            and dictcode = yycgdmx.cgzt) cgztmc,
                                        yycgdmx.cgl,
                                        yycgdmx.cgje,
                                        yycgdmx.rkl,
                                        yycgdmx.rkje,
                                        yycgdmx.thl,
                                        yycgdmx.thje,
                                        yycgdmx.jsl,
                                        yycgdmx.jsje

                                  from yybusiness2015 yycgdmx,
                                        yycgd2015      yycgd,
                                        useryy,
                                        usergys,
                                        ypxx
                                 where yycgdmx.yycgdid = yycgd.id
                                   and yycgd.useryyid = useryy.id
                                   and yycgdmx.usergysid = usergys.id
                                   and yycgdmx.ypxxid = ypxx.id

                                ) yybusiness) yybusiness) yybusiness) yybusiness
 group by yybusiness.areaname


//区域采购金额统计查询列表  图表显示用
    public List<YycgdmxCustom> findYybusinessGroupByAearList(
            YycgdQueryVo yycgdQueryVo) throws Exception;

1.2.2 service

// 区域采购金额统计查询列表 图表显示用
    @Override
    public List<YycgdmxCustom> findYybusinessGroupByAearList(String year,
            String sysid, String groupid, YycgdQueryVo yycgdQueryVo)
            throws Exception {
        YycgdQueryVo yycgdQueryVo_query = query_findYybusiness(year, sysid,
                groupid, yycgdQueryVo);
        return yybusinessMapperCustom
                .findYybusinessGroupByAearList(yycgdQueryVo_query);
    }

Action

    // 按区域查询 图标显示
    @RequestMapping("/groupbyarea")
    public String groupbyarea(Model model, HttpSession httpSession,
            String year, ActiveUser activeUser, YycgdQueryVo yycgdQueryVo)
            throws Exception {
        if (year == null) {
            year = MyUtil.get_YYYY(MyUtil.getDate());
        }
        // 单位id
        String sysid = activeUser.getSysid();
        // 用户类型
        String groupid = activeUser.getGroupid();
        // 调用service查询数据
        List<YycgdmxCustom> list = businessService
                .findYybusinessGroupByAearList(year, sysid, groupid,
                        yycgdQueryVo);
        // jfreechart定义
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        for (YycgdmxCustom yycgdmxCustom : list) {
            dataset.addValue(yycgdmxCustom.getCgje(), "药品采购金额",
                    yycgdmxCustom.getAreaname());
        }
        JFreeChart chart = ChartFactory.createBarChart3D("药品采购金额汇总",// 图形名称
                "",// 分类名称,为横坐标名称
                "采购金额(元)",// 值名称,为纵坐标名称
                dataset,// 数据集合
                PlotOrientation.VERTICAL,// 垂直显示
                false,// 是否显示图例
                false,// 是否使用工具提示
                false);// 是否使用url

        // 在柱上显示数值
        CategoryPlot plot = chart.getCategoryPlot();

        BarRenderer3D renderer = new BarRenderer3D();

        // 设置柱的颜色
        // renderer.setSeriesPaint(0, Color.decode("#ff0000"));

        renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        renderer.setBaseItemLabelsVisible(true);
        // 默认的数字显示在柱子中,通过如下两句可调整数字的显示
        // 注意:此句很关键,若无此句,数字的显示会被覆盖
        renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(
                ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
        renderer.setItemLabelAnchorOffset(10D);
        // 设置每个地区所包含的平行柱的之间距离
        // renderer.setItemMargin(0.3);
        plot.setRenderer(renderer);
        // 设置字体
        // 配置字体
        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); // 图片标题
        // 图形的绘制结构对象,对于饼图不适用

        // 图片标题
        chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));

        // 底部
        LegendTitle legendTitle = chart.getLegend();
        if (legendTitle != null) {
            legendTitle.setItemFont(kfont);
        }

        // X 轴
        CategoryAxis domainAxis = plot.getDomainAxis();
        domainAxis.setLabelFont(xfont);// 轴标题
        domainAxis.setTickLabelFont(xfont);// 轴数值
        domainAxis.setTickLabelPaint(Color.BLUE); // 字体颜色
        // domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);

        // Y 轴
        ValueAxis rangeAxis = plot.getRangeAxis();
        rangeAxis.setLabelFont(yfont);
        rangeAxis.setLabelPaint(Color.BLUE); // 字体颜色
        rangeAxis.setTickLabelFont(yfont);

        // 将图形放在session,得到filename
        String jfreechart_filename = ServletUtilities.saveChartAsPNG(chart,
                900, 500, null, httpSession);

        model.addAttribute("jfreechart_filename", jfreechart_filename);

        return "/business/tj/groupbyarea";
    }

页面

        <TABLE border=0 cellSpacing=0 cellPadding=0 width="99%" align=center>
            <TBODY>
                <TR>
                    <TD>
                        <!-- jfreechart图形
                        jfreechart 为servlet 的名字
                        filename 为action  中的key  
                         --> <img
                        src="${baseurl }/jfreechart?filename=${jfreechart_filename }"
                        border=0 />
                    </TD>
                </TR>
            </TBODY>
        </TABLE>

1.3 小结

使用jfreechart进行统计图形生成:

第一步:了解统计需求,获取统计数据
第二步:使用jfreechart生成统计图形
1、 定义dataset
将第一步获取的统计数据填充到dataset中
2、 定义chart(根据图形的类型调用不同的api(常用的:柱状图、饼图、折线图))
注意:设置字体,否则 会出现中文乱码
如果需要修改图形的布局,可以通过CategoryPlot plot = chart.getCategoryPlot();来操作
3、 输出图形
a) 使用response直接输出(输出的图片)
b) 使用jfreechart的servlet输出图形(常用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值