Web在jsp页面中生成柱状图,折线图,饼状图

一、前言

    在实际开发过程中,柱状图,折线图,饼状图在一些OA,ERP中是非常常见的功能,特别是需求方是业务型,数据分析型公司,下面的例子简单实现了饼状图,柱状图,折线图在jsp中生成。(ps:新手上路,不喜勿喷)

二、前期准备
1.使用的框架:ssm(这里不再配置);
2.需要的第三方包:jfreechart.jar和jcommon.jar

三、配置文件的操作
web.xml:在web.xml中配置jfreechart

  
      
        DisplayChart  
        org.jfree.chart.servlet.DisplayChart  
      
      
        DisplayChart  
        /chart  
 

四、主要代码

1.柱状图
(1).controller层

@RequestMapping(value = "getColumnChart.do")
public ModelAndView getColumnChart(HttpServletRequest request,
        HttpServletResponse response, ModelMap modelMap) throws Exception {
    // 在业务层获取创建的柱状图(此时柱状图已经创建完成的)
    JFreeChart chart = columnarService.createColumnarTools();
    // 将图形转换为图片传到dateSet.jsp
    String fileName = ServletUtilities.saveChartAsJPEG(chart, 700, 400,
            null, request.getSession());
    String chartURL = request.getContextPath() + "/chart?filename="
            + fileName;
    modelMap.put("chartColumnURL", chartURL);
    return new ModelAndView("dateSet", modelMap);
}

(2)业务层
接口:

public interface ColumnarService {
public JFreeChart createColumnarTools();

}

实现接口:

@Service
public class ColumnaServicerImp implements ColumnarService {

 //从柱状图工具类里面获取创建的Columnar柱状图

public JFreeChart createColumnarTools() {
    // TODO Auto-generated method stub
    // 获得数据
    CategoryDataset dataset = getDataSet();
    // 获取柱状图工具类创建的柱状图,(将数据集传入)
    JFreeChart chart = ColumnarTools.createCoColumnar(dataset);
    return chart;
}

 //获取一个演示用的组合数据集对象 为柱状图添加数据

private static CategoryDataset getDataSet() {
    // 数据可以从数据库中得到
    DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    dataset.addValue(88, "外评", "上风港");
    dataset.addValue(86, "内评", "上风港");
    dataset.addValue(85, "外评", "瑞安");
    dataset.addValue(84, "内评", "瑞安");
    dataset.addValue(70, "外评", "花郡");
    dataset.addValue(65, "内评", "花郡");
    dataset.addValue(90, "外评", "IFS");
    dataset.addValue(88, "内评", "IFS");
    dataset.addValue(80, "外评", "万达");
    dataset.addValue(75, "内评", "万达");
    return dataset;
}

}

(3)写一个柱状图的工具类

public class ColumnarTools {

 //创建一个柱状图

 //@param dataset
          柱状图数据
 // @return

public static JFreeChart createCoColumnar(CategoryDataset dataset) {
    // 创建柱状图
    JFreeChart chart = ChartFactory.createBarChart3D("各个项目评分统计", // 图表标题
            "项目名", // x轴的显示标签
            "项目评分", // y轴的显示标签
            dataset, // 数据
            PlotOrientation.VERTICAL, // 图表方向:水平、垂直
            true, // 显示图例
            true, // 生成工具
            true // URL链接
            );
    // 对整个图形设置整个柱状图的颜色和文字针
    chart.setBackgroundPaint(ChartColor.WHITE); // 设置总的背景颜色
    // 获得图形对象,并通过此对象对图形的颜色文字进行设置
    CategoryPlot polt = chart.getCategoryPlot();// 获得图表对象
    polt.setBackgroundPaint(ChartColor.lightGray);// 图形背景颜色
    polt.setRangeGridlinePaint(ChartColor.WHITE);// 图形表格颜色
    // 设置柱宽度
    BarRenderer renderer = (BarRenderer) polt.getRenderer();
    renderer.setMaximumBarWidth(0.06);
    renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
    renderer.setBaseItemLabelsVisible(true);
    renderer.setBaseItemLabelFont(new Font("宋体", Font.BOLD, 15));
    // 设置文字
    getChartByFont(chart);

    return chart;

}


//柱状图设置文字样式
//
// @param chart

private static void getChartByFont(JFreeChart chart) {
    // 图形设置标题文字
    TextTitle textTitle = chart.getTitle();
    textTitle.setFont(new Font("宋体", Font.BOLD, 20));

    // 设置图形X轴坐标文字
    CategoryPlot plot = (CategoryPlot) chart.getPlot();
    CategoryAxis axis = plot.getDomainAxis();
    axis.setLabelFont(new Font("宋体", Font.BOLD, 22)); // 设置X轴坐标上标题的文字
    axis.setTickLabelFont(new Font("宋体", Font.BOLD, 15)); // 设置X轴坐标上的文字

    // 设置图形Y轴坐标文字
    ValueAxis valueAxis = plot.getRangeAxis();
    valueAxis.setLabelFont(new Font("宋体", Font.BOLD, 12)); // 设置Y轴坐标上标题的文字
    valueAxis.setTickLabelFont(new Font("sans-serif", Font.BOLD, 12));// 设置Y轴坐标上的文字
    // 设置提示内容的文字
    chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 15));
}

}

柱状图的图片就制作出来了,现在只需要传输到jsp页面就可以了。

(4) dataSet.jsp


柱状图

点击生成柱状图getMajorChart

饼状图

点击生成饼状图getMajorChart

折线图

点击生成折线图getMajorChart

整个柱状图就在jsp能够显示了。
后面就是饼状图和折线图的工具类和业务层了。 controller就不在赘述了,跟柱状图是一样的

2.饼状图

(1) 业务层

   @Service
public class PieServiceImp implements PieService {
/**
 * 从饼状图工具类里面获取创建的Columnar柱状图
 */
public JFreeChart createPieTools() {
    // TODO Auto-generated method stub
    // 获取饼状图的数据集
    DefaultPieDataset dataset = getDataSet();
    // 获取饼状图工具类创建的饼状图
    JFreeChart chart = PieTools.createPie(dataset);
    return chart;
}

/**
 * 添加饼状图的数据
 * 
 * @return
 */
private static DefaultPieDataset getDataSet() {
    // 数据可以从数据库中得到
    DefaultPieDataset dataset = new DefaultPieDataset();
    // 添加数据
    Map map = new HashMap();
    map.put("张三", (double) 33);
    map.put("李期", (double) 14);
    map.put("李四", (double) 27);
    map.put("王六", (double) 11);
    Double sum = 0.0;
    int count = map.size();
    Set keys = map.keySet();
    for (String key : keys) {
        sum += sum + map.get(key);

    }
    for (String key : keys) {

        dataset.setValue(key, map.get(key));
    }
    // dataset.setValue("张三",30);
    // dataset.setValue("李四",12);
    // dataset.setValue("李四",12);
    // dataset.setValue("王六",10);

    return dataset;

}

(2) 工具类

public class PieTools {
/**
 * 创建饼状图
 * @param dataset 饼状图数据源
 * @return
 */
public static JFreeChart createPie(DefaultPieDataset  dataset){
    //创建饼状图
    JFreeChart chart =ChartFactory.createPieChart3D("占比分析", dataset, true, true, true);
    //为饼状图设置字体
    getChartByFont(chart);      
    return chart;
}
/**
 * 处理饼状图的文字
 * @param chart
 */
private static void getChartByFont(JFreeChart chart){
    //处理图形上的乱码
            //处理主标题的乱码
            chart.getTitle().setFont(new Font("宋体",Font.BOLD,18));
            //处理子标题乱码
            chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,15));
            //获取图表区域对象
            PiePlot3D categoryPlot = (PiePlot3D)chart.getPlot();
            //处理图像上的乱码
            categoryPlot.setLabelFont(new Font("宋体",Font.BOLD,15));
            //设置图形的生成格式为(张三  23 (10%))(姓名 值 百分比)
            String fm = "{0} {1} ({2})";
            categoryPlot.setLabelGenerator(new StandardPieSectionLabelGenerator(fm));
}
}

3.折线图

(1)业务层

@Service
public class FoldLineServiceImp implements FoldLineService{
 /**
 * 从折线图工具类中获取创建完成的折线图
 */
public JFreeChart createFoldLineTools() {
    // TODO Auto-generated method stub
    //获取折线图数据源
    DefaultCategoryDataset dataset=getDataSet();
    //从折线图工具类中获取创建完成的折线图
    JFreeChart chart=FoldLineTools.createFoldLine(dataset);

    return chart;
}
/**
 * 为折线图创建数据
 * @return
 */
public static DefaultCategoryDataset getDataSet(){
    //创建数据集
    DefaultCategoryDataset dataset=new DefaultCategoryDataset();
    //添加数据
    dataset.addValue(15636.36, "张三", "一月");
    dataset.addValue(10001.36, "张三", "二月");
    dataset.addValue(8856.20, "张三", "三月");
    dataset.addValue(5964.26, "张三", "四月");
    dataset.addValue(12365.23, "李四", "一月");
    dataset.addValue(20056.12, "李四", "二月");
    dataset.addValue(7896.36, "李四", "三月");
    dataset.addValue(23005.45, "李四", "四月");
    return dataset;

}

}

(2),工具类

public class FoldLineTools {
/**
 * 创建一个折线图
 * 
 * @return
 */
public static JFreeChart createFoldLine(DefaultCategoryDataset dataset) {
    JFreeChart chart = ChartFactory.createLineChart("业绩分析", "月份", "业绩(元)",
            dataset, PlotOrientation.VERTICAL, true, true, true);
    // 数据的行数 即折线的条数
    int datasetSize = dataset.getRowCount();
    System.out.println(datasetSize);
    getChartByFont(chart, datasetSize);

    return chart;

}

/**
 * 处理折线图上的文字
 * 
 * @param chart
 * @param datasetSize
 *            数据的行数 即折线的条数
 */
private static void getChartByFont(JFreeChart chart, int datasetSize) {
    // 处理主标题的文字
    chart.getTitle().setFont(new Font("宋体", Font.BOLD, 18));
    // 处理子标题文字
    chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 15));
    // 获取图表区域
    CategoryPlot categoryPlot = (CategoryPlot) chart.getPlot();
    // 获取X轴
    CategoryAxis categoryAxis = (CategoryAxis) categoryPlot.getDomainAxis();
    // 获取Y轴
    NumberAxis numberAxis = (NumberAxis) categoryPlot.getRangeAxis();
    // 处理X轴上的文字
    categoryAxis.setTickLabelFont(new Font("宋体", Font.BOLD, 12));
    // 处理X轴外的文字
    categoryAxis.setLabelFont(new Font("宋体", Font.BOLD, 12));
    // 处理Y轴上的文字
    numberAxis.setTickLabelFont(new Font("宋体", Font.BOLD, 15));
    // 处理Y轴外的文字
    numberAxis.setLabelFont(new Font("宋体", Font.BOLD, 15));
    // 处理Y轴上显示的刻度,以5000作为1格
    numberAxis.setAutoTickUnitSelection(false);
    NumberTickUnit unit = new NumberTickUnit(5000);
    numberAxis.setTickUnit(unit);
    // 获取绘图区域
    LineAndShapeRenderer lineAndShapeRenderer = (LineAndShapeRenderer) categoryPlot
            .getRenderer();
    // 在图形上显示数字
    lineAndShapeRenderer
            .setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
    lineAndShapeRenderer.setBaseItemLabelsVisible(true);
    lineAndShapeRenderer
            .setBaseItemLabelFont(new Font("宋体", Font.BOLD, 10));
    // 在图形上添加转折点(小矩形)
    Rectangle shape = new Rectangle(5, 5);
    for (int i = 0; i < datasetSize; i++) {
        lineAndShapeRenderer.setSeriesShape(i, shape);
        lineAndShapeRenderer.setSeriesShapesVisible(i, true);
    }
}
}

至此,柱状图,饼状图,折线图就制作完毕了,

五、效果图
柱状图

Web在jsp页面中生成柱状图,折线图,饼状图_第1张图片

饼形图

Web在jsp页面中生成柱状图,折线图,饼状图_第2张图片

折线图

Web在jsp页面中生成柱状图,折线图,饼状图_第3张图片

六.结语
楼主使用的是spring+springMVC+MyBatiskuang框架。
其实这行图形的制作在第三方包Jfreechart已经提供给我们了。只需要按照的它给的规范,根据自己需求设计就可以了。就像excel的导入导出,poi就是帮助我们做个事情的。
新手上路,如果问题,请多多包含。如有问题,欢迎留言。

你可能感兴趣的:(java)