用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

折线图和柱状图excle导出

2013-08-26 作者: 云代码会员举报

[java]代码库

public class ChartUtil {  
  
    /** 
     * 产生报表折线图的方法,可以产生一张1或者两张折线图供前台页面展示 
     *  
     *  
     * @param condVo 
     * @param list 
     * @return JFreeChart[]对象数组 
     * @throws IOException 
     */  
    private static final Logger logger = Logger.getLogger(ReportDao.class);  
  
    public JFreeChart[] createLineChart(ReportCondVo condVo, List list)  
            throws IOException, Exception {  
  
        // 创建一个解析配置文件类的对象  
        ParseProperties parse = new ParseProperties(String.valueOf(condVo  
                .getReportId()));  
  
        // 新建一个二维JfreeChart数组  
        JFreeChart[] jfreechart = new JFreeChart[2];  
        String ChartTitle = "";  
        ChartTitle = parse.getName();  
        JFreeChart chart = ChartFactory.createLineChart(ChartTitle, // 图标题(第一张图的标题)  
                "", // x 轴标题  
                "", // y 轴标题  
                getLineDataset(condVo, list, parse), // 数据源  
                PlotOrientation.VERTICAL, // 显示方向  
                true, // 显示图例  
                true, false);  
  
        logger.debug("第一张图形名字:" + parse.getName());  
        // 设置背景色  
        chart.setBackgroundPaint(new Color(218, 235, 255));  
  
        CategoryPlot plot = chart.getCategoryPlot();  
        // 设置数据区(中间部分背景色)  
        plot.setBackgroundPaint(new Color(255, 255, 206));  
        // x轴 // 分类轴网格是否可见  
        plot.setDomainGridlinesVisible(false);  
        plot.setDomainGridlinePaint(Color.WHITE);// 虚线色彩  
        // y轴 //数据轴网格是否可见  
        plot.setRangeGridlinesVisible(true);  
        plot.setRangeGridlinePaint(Color.BLACK);// 虚线色彩  
  
        // 设置轴和面板之间的距离  
        // plot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));  
  
        // 获取 x 轴操作  
        CategoryAxis domainAxis = plot.getDomainAxis();  
        domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);// X轴45度斜  
        // 设置距离图片左端距离  
        domainAxis.setLowerMargin(0.0);  
        // 设置距离图片右端距离  
        domainAxis.setUpperMargin(0.0);  
  
        // 获取 y 轴操作:  
        NumberAxis yAxis = (NumberAxis) plot.getRangeAxis();  
        // 设置y轴最小值  
        yAxis.setLowerBound(0.0D);  
        // 设置Legend的位置 图例的位置  
        // ((JFreeChart) chart).getLegend().setPosition(RectangleEdge.RIGHT);  
  
        // 显示百分比  
        NumberFormat nf = new DecimalFormat("00.00");  
        yAxis.setNumberFormatOverride(nf);// 设置y轴以百分比方式显示  
        LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) plot  
                .getRenderer();  
  
         //lineandshaperenderer.setSeriesPaint(31, new Color(16,98,204));//天蓝  
          
          
        // 设置Series颜色(线条的颜色)  
        // lineandshaperenderer.setSeriesPaint(0, new Color(0,0,128));//蓝 1  
        // lineandshaperenderer.setSeriesPaint(1, new Color(255,0,255));//桃红2  
        // lineandshaperenderer.setSeriesPaint(2, new Color(255,255,128));//黄色3  
        // lineandshaperenderer.setSeriesPaint(3, new Color(0,255,255));//蓝4  
        // lineandshaperenderer.setSeriesPaint(4, new Color(128,0,128));//紫5  
        // lineandshaperenderer.setSeriesPaint(5, new Color(0,0,255));//墨绿6  
        // lineandshaperenderer.setSeriesPaint(6, new Color(0,0,128));//蓝7  
        // lineandshaperenderer.setSeriesPaint(7, new Color(0,204,255));//草绿  
        // lineandshaperenderer.setSeriesPaint(8, new Color(192,192,192));//天蓝  
        // lineandshaperenderer.setSeriesPaint(9, new Color(204,255,204));//天蓝  
  
        lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见  
        lineandshaperenderer.setBaseLinesVisible(true); // series 点(即数据点)间有连线可见  
  
        // 显示折点数据  
        lineandshaperenderer  
                .setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());  
        lineandshaperenderer.setBaseItemLabelsVisible(false);  
  
        jfreechart[0] = chart;  
  
        // 是否包含第二张图  
        boolean isRate = false;  
        isRate = parse.isIncludeRate();  
  
        logger.debug("是否包含比率图 :" + parse.isIncludeRate());  
  
        if (true == isRate) {// 是否包含第二张图  
            // 比率图的标题  
            String rateTitle = "";  
            rateTitle = parse.getRateImgName();  
  
            JFreeChart chart2 = ChartFactory.createLineChart(rateTitle, // 图标题(第二张图的标题)  
                    "", // x 轴标题  
                    "", // y 轴标题  
                    getLineRateDataset(condVo, list, parse), // 数据源  
                    PlotOrientation.VERTICAL, // 显示方向  
                    true, // 显示图例  
                    true, false);  
  
            logger.debug("第二张比率图名称:" + parse.getRateImgName());  
            // 设置背景色  
            chart2.setBackgroundPaint(new Color(218, 235, 255));  
  
            CategoryPlot plot2 = chart2.getCategoryPlot();  
  
            // 获取 x 轴操作  
            // 设置数据区(中间部分背景色)  
            plot2.setBackgroundPaint(new Color(255, 255, 206));  
            // x轴 // 分类轴网格是否可见  
            plot2.setDomainGridlinesVisible(false);  
            plot2.setDomainGridlinePaint(Color.WHITE);// 虚线色彩  
            // y轴 //数据轴网格是否可见  
            plot2.setRangeGridlinesVisible(true);  
            plot2.setRangeGridlinePaint(Color.BLACK);// 虚线色彩  
  
            CategoryAxis axis2 = plot2.getDomainAxis();  
            axis2.setCategoryLabelPositions(CategoryLabelPositions.UP_45);  
            // 设置距离图片左端距离  
            axis2.setLowerMargin(0.0);  
            // 设置距离图片右端距离  
            axis2.setUpperMargin(0.0);  
  
            // 获取 y 轴操作:  
            NumberAxis numAxis2 = (NumberAxis) plot2.getRangeAxis();  
            // 设置y轴最小值  
            numAxis2.setLowerBound(0.0D);  
            // 设置Legend的位置 图例的位置(默认位置在图形的下面)  
            // ((JFreeChart)  
            // chart).getLegend().setPosition(RectangleEdge.RIGHT);  
            // 显示百分比  
            NumberFormat nf22 = new DecimalFormat("00.00%");  
            numAxis2.setNumberFormatOverride(nf22);// 设置y轴以百分比方式显示  
  
            // 设置y显示方式 就是y轴间距(一般自动就可以)  
            // numAxis2.setAutoTickUnitSelection(false);// 数据轴的数据标签是否自动确定  
            // double rangetick = 1000D;  
            // numAxis2.setTickUnit(new NumberTickUnit(rangetick)); //  
            // y轴单位间隔为0.1  
            // 下面使纵坐标的最小单位格为整数  
            // numAxis2.setStandardTickUnits(NumberAxis.createIntegerTickUnits());  
  
            // 自动设置数据轴数据范围时数据范围的最小跨度(未确定)  
            // void setAutoRangeMinimumSize(double size)  
  
            // void setTickUnit(NumberTickUnit unit)数据轴的数据标签(未确定)  
            // (需要将AutoTickUnitSelection设false)  
            // numAxis2.setTickUnit(new NumberTickUnit(5));  
            // numAxis2.setAutoTickUnitSelection(false);  
  
            LineAndShapeRenderer lineRenderer2 = (LineAndShapeRenderer) plot2  
                    .getRenderer();  
  
            // series点(即数据点)可见  
            lineRenderer2.setBaseShapesVisible(true);  
            // series点(即数据点)间有连线可见  
            lineRenderer2.setBaseLinesVisible(true);  
            // 显示折点数据  
            // lineRenderer2.setBaseItemLabelGenerator(new  
            // StandardCategoryItemLabelGenerator());  
            // 设置ItemLabel点对应的数据是否显示  
            lineRenderer2.setBaseItemLabelsVisible(false);  
  
            // 设置Series颜色  
            // lineRenderer2.setSeriesPaint(0, new Color(0,0,128));//蓝  
            // lineRenderer2.setSeriesPaint(0, new Color(255,0,255));//桃红  
            // lineRenderer2.setSeriesPaint(0, new Color(255,255,128));//黄色  
            // lineRenderer2.setSeriesPaint(0, new Color(0,0,128));//蓝  
            // lineRenderer2.setSeriesPaint(0, new Color(0,0,128));//蓝  
            // lineRenderer2.setSeriesPaint(0, new Color(0,0,128));//蓝  
            // lineRenderer2.setSeriesPaint(0, new Color(0,0,128));//蓝  
  
            // 设置第一条曲线数据点"填充"为红色,如果一个图表有多条曲线可分别设置  
            // lineRenderer2.setSeriesFillPaint(0, new Color(155,155,155)); //红  
            // lineRenderer2.setUseFillPaint(true); //应用  
  
            jfreechart[1] = chart2;// 将创建好的比率图JFreeChart 对象放入JfreeChart数组  
  
        }  
        logger.debug("这个JfreeChart对象数组大小:" + jfreechart.length);  
  
        return jfreechart;  
    }  
  
    /** 
     * 产生折线图所需要的数据,供createLineChart()方法调用 
     *  
     * @param condVo 
     * @param list 
     * @return 
     * @throws UnsupportedEncodingException 
     */  
    private DefaultCategoryDataset getLineDataset(ReportCondVo condVo,  
            List list, ParseProperties parse)  
            throws UnsupportedEncodingException, Exception {  
  
        logger.debug("创建折线图数据开始...");  
        DefaultCategoryDataset categoryDataset = new DefaultCategoryDataset();  
  
        // 取出字段类型  
        String[] rate = parse.getFieldName();  
  
        for (int i = 0; i < rate.length; i++) {  
            logger.debug("  ##包含统计类型:" + rate[i].toString());  
            // 第一步,先初始化一次数据,每个类型默认值0.0  
            // 产生时间格式样式  
            String datam = "000000";// 格式YYYYMM  
            // 获取当月天数  
            ReportParams params = ReportService.getReportParams(condVo);  
            // 取得当前循环类型  
            String Type = rate[i];  
            for (int h = 1; h <= params.getColumns(); h++) {  
                datam = condVo.getMonth();  
                String end = "";  
                if (10 > h) {  
                    end = 0 + Integer.toString(h);  
                } else {  
                    end = Integer.toString(h);  
                }  
                datam = datam + end;  
                categoryDataset.addValue(getDouble("0"), Type, getDay(datam)  
                        .toString());  
            }  
            // 把数据库取出来的List 赋值给categoryDataset对象  
            int size = list.size();  
            for (int y = 0; y < size; y++) {  
                RsVo rsVo = (RsVo) list.get(y);  
                if (!("".equals(Type))) {  
                    if (Type.equals(rsVo.getType())) {  
                        categoryDataset.setValue(getDouble(rsVo.getValue()),  
                                Type, getDay(rsVo.getCurDate()).toString());  
                    }  
                }  
            }  
        }  
        logger.debug("创建折线图数据结束...");  
        return categoryDataset;  
    }  
  
    /** 
     * 产生比率图所需要数据,供createLineChart()方法调用 
     *  
     * @param condVo 
     * @param list 
     * @param parse 
     * @return 
     * @throws UnsupportedEncodingException 
     */  
  
    private CategoryDataset getLineRateDataset(ReportCondVo condVo, List list,  
            ParseProperties parse) throws UnsupportedEncodingException,  
            Exception {  
        logger.debug("创建折线图(比率图)数据开始...");  
        DefaultCategoryDataset categoryDataset = new DefaultCategoryDataset();  
  
        // 取出比率图的字段类型(重要)  
        String[] rate = parse.getRateFieldName();  
  
        // 开始创建数据  
  
        for (int i = 0; i < rate.length; i++) {  
  
            logger.debug("  ##包含统计类型(比率图):" + rate[i].toString());  
  
            // 产生时间格式  
            String datam = "000000";// 格式YYYYMM  
            // 获取当月天数  
            ReportParams params = ReportService.getReportParams(condVo);  
            // 先初始化一次值  
  
            // 取得当前循环类型  
            String Type = rate[i];  
  
            // 第一步:初始化折现图标比率图数据,给每日数据都0.00D  
            for (int h = 1; h <= params.getColumns(); h++) {  
                datam = condVo.getMonth();  
                String end = "";  
                if (h < 10) {  
                    end = 0 + Integer.toString(h);  
                } else {  
                    end = Integer.toString(h);  
                }  
                datam = datam + end;  
                categoryDataset.addValue(0.00d, rate[i], getDay(datam));  
            }  
  
            // 第二步:赋值给比率图  
  
            int size = list.size();  
            logger.debug("比率图中所含数据List的size值:" + list.size());  
            for (int y = 0; y < size; y++) {  
                RsVo rsVo = (RsVo) list.get(y);  
                // 判断当前类型是否与rsVo.getType()类型一致  
  
                if (!("".equals(Type))) {  
                    if (Type.equals(rsVo.getType())) {  
                        categoryDataset.setValue(  
                                getRateDouble(rsVo.getValue()), Type, getDay(  
                                        rsVo.getCurDate()).toString());  
                    }  
                }  
            }  
  
        }  
        logger.debug("创建折线图(比率图)数据成功...");  
        return categoryDataset;  
    }  
  
    /** 
     * X轴时间的产生 例:将字符串"20090103"转化为"1月03日"的字符串 
     *  
     * @param dayStr 
     * @return 
     */  
    private String getDay(String dayStr) {  
        // 如果为空或者长度不等于8位,直接返回  
        if ("".equals(dayStr)) {  
            return dayStr;  
        } else if (8 != dayStr.length()) {  
            return dayStr;  
        } else {  
            String month = dayStr.substring(4, 6);  
            if (month.startsWith("0")) {  
                month = month.substring(1, 2);  
            }  
            month = month + "月";  
            String date = dayStr.substring(6, 8) + "日";  
            String day = month + date;  
            return day;  
        }  
  
    }  
  
    /** 
     * 将传入字符串转化为double类型 
     *  
     * @param valueStr 
     * @return 
     */  
    private double getDouble(String valueStr) {  
        if (valueStr.endsWith("%")) {  
            valueStr = valueStr.substring(0, valueStr.length() - 1);  
        }  
        if ("".equals(valueStr)) {  
            return 0.0d;  
        }  
        if (null == valueStr) {  
            return 0.0d;  
        }  
        double value = Double.parseDouble(valueStr);  
        return value;  
    }  
  
    /** 
     * 将传入字符串转化为double类型 (比率图) 
     *  
     * @param valueStr 
     * @return 
     */  
    private double getRateDouble(String valueStr) {  
        if (valueStr.endsWith("%")) {  
            valueStr = valueStr.substring(0, valueStr.length() - 1);  
        }  
        if ("".equals(valueStr)) {  
            return 0.0d;  
        }  
        if (null == valueStr) {  
            return 0.0d;  
        }  
  
        double value = Double.parseDouble(valueStr);  
        value = value / 100;  
        return value;  
    }  
  
    /** 
     * 创建饼图对象的JFreeChart 对象 
     *  
     * @param condVo 
     * @param list 
     * @return 
     * @throws Exception 
     */  
    public JFreeChart[] createPieChart(ReportCondVo condVo, List list)  
            throws Exception {  
  
        // 创建一个解析配置文件类的对象  
        ParseProperties parse = new ParseProperties(String.valueOf(condVo  
                .getReportId()));  
  
        JFreeChart[] jfreechart = new JFreeChart[2];  
  
        // 饼图的标题  
        String ChartTitle = "";  
        ChartTitle = parse.getName();  
  
        // 用工厂类创建饼图  
        JFreeChart pieChart = ChartFactory.createPieChart(ChartTitle,  
                createPieDataset(condVo, list, parse), true, true, false);  
  
        // RenderingHints做文字渲染参数的修改  
        // VALUE_TEXT_ANTIALIAS_OFF表示将文字的抗锯齿关闭.  
        pieChart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,  
                RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);  
  
        // 设置Legend的位置 图例的位置  
        // ((JFreeChart) pieChart).getLegend().setPosition(RectangleEdge.RIGHT);  
  
        // 设置图片背景色  
        pieChart.setBackgroundPaint(new Color(191, 191, 255));  
  
        // 设置图标题的字体重新设置title  
        Font font = new Font("隶书", Font.BOLD, 25);  
        TextTitle title = new TextTitle(ChartTitle);  
        title.setFont(font);  
        // pieChart.setTitle(title); //用来控制Chart标题的  
  
        // 得到饼图的Plot对象  
        PiePlot piePlot = (PiePlot) pieChart.getPlot();  
  
        // 指定饼图轮廓线的颜色  
        piePlot.setBaseSectionOutlinePaint(Color.BLACK);  
        piePlot.setBaseSectionPaint(Color.BLACK);  
  
        // 设置背景区域背景色  
        piePlot.setBackgroundPaint(new Color(191, 191, 255));  
        setSection(piePlot);  
        setLabel(piePlot);  
  
        // 设置没数据显示信息  
        setNoDataMessage(piePlot);  
        // 设置对于null数据和0数据的处理  
        setNullAndZeroValue(piePlot);  
        jfreechart[0] = pieChart;  
        return jfreechart;  
    }  
  
    /** 
     * 创建饼图对象的数据源 DefaultPieDataset 
     *  
     * @param condVo 
     * @param list 
     * @param parse 
     * @return 
     * @throws UnsupportedEncodingException 
     * @throws Exception 
     */  
    public DefaultPieDataset createPieDataset(ReportCondVo condVo, List list,  
            ParseProperties parse) throws UnsupportedEncodingException,  
            Exception {  
        logger.debug("创建饼图数据开始...");  
        int size = list.size();  
        logger.debug("饼图list数据大小" + size);  
        DefaultPieDataset pieDataset = new DefaultPieDataset();  
  
        String[] TypeName = parse.getFieldName();  
        for (int i = 0; i < TypeName.length; i++) {  
            logger.debug("  ##饼图包含统计类型:" + TypeName[i].toString());  
            pieDataset.setValue(TypeName[i].toString(), 0);  
            String keyWord = "";  
            keyWord = TypeName[i].toString();  
            // 设置数据  
            for (int y = 0; y < size; y++) {  
                RsVo rsVo = (RsVo) list.get(y);  
                if (!("".equals(keyWord))) {  
                    if (keyWord.equals(rsVo.getType())) {  
  
                        pieDataset.setValue(rsVo.getType(), Integer  
                                .parseInt(rsVo.getValue()));  
                    }  
                }  
            }  
        }  
        logger.debug("创建饼图数据成功...");  
        return pieDataset;  
    }  
  
    /** 
     * plot对象设置的方法,提供配置饼图扇区颜色的方法 
     *  
     * @param pieplot 
     */  
    @SuppressWarnings("deprecation")  
    public void setSection(PiePlot pieplot) {  
        // 扇区颜色设置  
        pieplot.setSectionPaint(0, new Color(153, 153, 255));  
        pieplot.setSectionPaint(1, new Color(153, 53, 102));  
        pieplot.setSectionPaint(2, new Color(255, 255, 204));  
        pieplot.setSectionPaint(3, new Color(204, 255, 255));  
        pieplot.setSectionPaint(4, new Color(102, 0, 102));// 紫色  
        pieplot.setSectionPaint(5, new Color(255, 128, 128));// 桃红  
        pieplot.setSectionPaint(6, new Color(0, 102, 204));// 蓝  
        pieplot.setSectionPaint(7, new Color(204, 204, 255));  
  
        // 设置扇区分离显示  
        // pieplot.setExplodePercent("测试数据1", 0.2D);  
        // 设置扇区边框不可见  
        // pieplot.setSectionOutlinesVisible(false);  
    }  
  
    /** 
     * 设置扇区标题格式的方法类 
     *  
     * @param pieplot 
     */  
    public void setLabel(PiePlot pieplot) {  
        // 设置扇区标签显示格式:关键字:值(百分比)  
        // pieplot.setLabelGenerator(new StandardPieSectionLabelGenerator(  
        // "{0}:{1}({2} percent)"));  
        pieplot.setLabelGenerator(new StandardPieSectionLabelGenerator(  
                "{0} {2}", NumberFormat.getNumberInstance(), new DecimalFormat(  
                        "0.00%")));  
        // 设置扇区标签颜色  
        pieplot.setLabelBackgroundPaint(new Color(220, 220, 220));  
        pieplot.setLabelFont((new Font("宋体", Font.PLAIN, 15)));// 设置扇区标签字体大小  
  
    }  
  
    /** 
     * 设置饼图对象没数据时所显示内容和字体 
     *  
     * @param pieplot 
     */  
    public void setNoDataMessage(PiePlot pieplot) {  
        // 设置没有数据时显示的信息  
        pieplot.setNoDataMessage("无数据");  
        // 设置没有数据时显示的信息的字体  
        pieplot.setNoDataMessageFont(new Font("宋体", Font.BOLD, 14));  
        // 设置没有数据时显示的信息的颜色  
        pieplot.setNoDataMessagePaint(Color.red);  
    }  
  
    /** 
     * 设置饼图对象数据是否忽略0和null值 
     *  
     * @param piePlot 
     */  
    public void setNullAndZeroValue(PiePlot piePlot) {  
        // 设置是否忽略0和null值  
        piePlot.setIgnoreNullValues(false);  
        piePlot.setIgnoreZeroValues(false);  
    }  
  
} 


网友评论    (发表评论)

共1 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...