当前位置:编程学习 > JAVA >>

报表(曲线图),求助~~~

求助各路高手,用JfreeChart做过报表的高手们多多给点意见哈!!!! 谢谢了~~

当点击页面左边指数时:

页面右侧出现相应的曲线图:


图片怎么实现动态生成呢?
曲线图代码如下(Servlet):
package org.zhx.report.service;

import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.List;

import javax.servlet.http.HttpSession;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardXYItemLabelGenerator;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.time.Month;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.TextAnchor;
import org.zhx.report.dao.MonthSalaryDao;
import org.zhx.report.dao.MonthSalaryDaoJdbcImpl;
import org.zhx.report.entity.MonthSalary;
 
public class LineXYChart{

/**
     * 返回生成图片的文件名
     * @param session
     * @param pw
     * @return 生成图片的文件名
     * @throws Exception 
     */
    public String getLineXYChart(HttpSession session, PrintWriter pw) throws Exception
    {
        XYDataset dataset = this.createDateSet();//建立数据集
        String fileName = null;
        //建立JFreeChart
        JFreeChart chart = ChartFactory.createTimeSeriesChart(
                "2013年度数据统计分析", // title
                "(—— 时间  ——)", // x-axis label
                "(—— 万元  ——)", // y-axis label
                dataset, // data
                true, // create legend?
                true, // generate tooltips?
                false // generate URLs?
                );
        //设置JFreeChart的显示属性,对图形外部部分进行调整
        chart.setBackgroundPaint(Color.white);//设置曲线图背景色
        //设置字体大小,形状
        Font font = new Font("宋体", Font.BOLD, 30);
        TextTitle title = new TextTitle("数据统计分析", font);
        chart.setTitle(title);
 
        
        XYPlot plot = (XYPlot) chart.getPlot();//获取图形的画布
        XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) plot
.getRenderer();
        plot.setBackgroundPaint(Color.white);//设置网格背景色
        plot.setDomainGridlinePaint(Color.pink);//设置网格竖线(Domain轴)颜色
        plot.setRangeGridlinePaint(Color.pink);//设置网格横线颜色
        plot.setAxisOffset(new RectangleInsets(0D, 0D, 0D, 0D));//设置曲线图与xy轴的距离
        xylineandshaperenderer.setBaseShapesVisible(true);
        XYItemRenderer xyitem = plot.getRenderer();
xyitem.setBaseItemLabelsVisible(true);
xyitem.setBasePositiveItemLabelPosition(new ItemLabelPosition(
ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
xyitem.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
xyitem.setBaseItemLabelFont(new Font("Dialog", 1, 10));
plot.setRenderer(xyitem);
        if (xyitem instanceof XYLineAndShapeRenderer)
        {
            XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) xyitem;
            //renderer.setDefaultShapesVisible(true);
            renderer.setShapesVisible(true);
            //renderer.setDefaultShapesFilled(true);
            renderer.setShapesFilled(true);
            renderer.setShapesVisible(true);//设置曲线是否显示数据点
        }
 
        //设置Y轴
        NumberAxis numAxis = (NumberAxis) plot.getRangeAxis();
        NumberFormat numFormater = NumberFormat.getNumberInstance();
        numFormater.setMinimumFractionDigits(2);
        numAxis.setNumberFormatOverride(numFormater);
 
        //设置提示信息
        StandardXYToolTipGenerator tip=new StandardXYToolTipGenerator();
        //StandardXYToolTipGenerator tipGenerator = 
            //new StandardXYToolTipGenerator(
                //"历史信息{1} 16:00,{2})", new SimpleDateFormat("MM-dd",numFormater),new SimpleDateFormat("MM-dd",numFormater));
       // r.setToolTipGenerator(tipGenerator);
 
        //设置X轴(日期轴)
        DateAxis axis = (DateAxis) plot.getDomainAxis();
        axis.setDateFormatOverride(new SimpleDateFormat("yyyy-MM"));
 
        ChartRenderingInfo info = new ChartRenderingInfo(
                new StandardEntityCollection());
        try
        {
            fileName = ServletUtilities.saveChartAsPNG(chart, 900, 500, info,
                    session);//生成图片
//          Write the image map to the PrintWriter
            ChartUtilities.writeImageMap(pw, fileName, info, false);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        pw.flush();
        return fileName;//返回生成图片的文件名
    }
 
    /**
     * 建立生成图形所需的数据集
     * @return 返回数据集
     * @throws Exception 
     */
    private XYDataset createDateSet( ) throws Exception{
        TimeSeriesCollection dataset = new TimeSeriesCollection();//时间曲线数据集合
        TimeSeries s1 = new TimeSeries("2013年度",Month.class);//创建时间数据源,每一个//TimeSeries在图上是一条曲线
            MonthSalaryDao monsaldao = new MonthSalaryDaoJdbcImpl(); 
            List<MonthSalary> list =  monsaldao.findAll();
              for(MonthSalary mon:list){
              MonthSalary monsal = mon;
              String s = monsal.getSalaryMonth();
              double data = monsal.getSalary();
              int x = Integer.parseInt(s.substring(0, 4));
              int y = Integer.parseInt(s.substring(4, 6));
              s1.add(new Month(y,x), data);
              }
                 dataset.addSeries(s1);
                 dataset.setDomainIsPointsInTime(true);
                 return dataset;
                 
//               s1.add(new Month (1, 2006), 125000);
//               s1.add(new Month (2, 2006), 220000);
//               s1.add(new Month (3, 2006), 320000);
//               s1.add(new Month (4, 2006), 420000);
//               s1.add(new Month (5, 2006), 520000);
//               s1.add(new Month (6, 2006), 420000);
//               s1.add(new Month (7, 2006), 320000);
//               s1.add(new Month (8, 2006), 620000);
//               s1.add(new Month (9, 2006), 720000);
//               s1.add(new Month (10, 2006), 520000);
//               s1.add(new Month (11, 2006), 320000);
//               s1.add(new Month (12, 2006), 120000);
//               dataset.addSeries(s1);
//               dataset.setDomainIsPointsInTime(true);
//               return dataset;

    }  
}
页面中也是死代码:
<%
   LineXYChart xyChart=new LineXYChart();
   String fileName=xyChart.getLineXYChart(session,new PrintWriter(out));
   String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + fileName; 
%>
......
....
...
<img src="<%= graphURL %>" width=900 height=500 border=0 usemap="#<%= fileName %>" id="img1">

目前还有个ActionServlet:

package org.zhx.report.web;

import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.zhx.report.dao.IndexNameDao;
import org.zhx.report.dao.IndexNameDaoJdbcImpl;
import org.zhx.report.dao.MonthSalaryDao;
import org.zhx.report.dao.MonthSalaryDaoJdbcImpl;
import org.zhx.report.entity.IndexName;
import org.zhx.report.entity.MonthSalary;

public class ActionServlet extends HttpServlet {

public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String uri = request.getRequestURI();
String action = uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf("."));
if(action.equals("/saveIndexName")){
String name  = request.getParameter("name");
try{
IndexNameDao indexNameDao = new IndexNameDaoJdbcImpl();
IndexName in = new IndexName();
in.setName(name);
indexNameDao.save(in);
response.sendRedirect("right.jsp");
}catch(Exception e){
e.printStackTrace();
throw new ServletException(e);
}
}else if(action.equals("/saveMonthSalary")){
String salarymonth = request.getParameter("salarymonth");
String salary = request.getParameter("salary");
String indexname = request.getParameter("indexname");
try{
MonthSalaryDao dao = new MonthSalaryDaoJdbcImpl();
MonthSalary monthSalary = new MonthSalary();
monthSalary.setSalaryMonth(salarymonth);
monthSalary.setSalary(Long.parseLong(salary));
monthSalary.setIndexname(indexname);
dao.SaveMonthSalary(monthSalary);
response.sendRedirect("right.jsp");
}catch(Exception e){
e.printStackTrace();
throw new ServletException(e);
}
}else if(action.equals("/findIndexName")){
try {
IndexNameDao dao = new IndexNameDaoJdbcImpl();
List<IndexName> indexnames = dao.findAll();
request.setAttribute("indexnames", indexnames);
RequestDispatcher rd = request.getRequestDispatcher("left.jsp");
rd.forward(request, response);
response.sendRedirect("left.jsp");
} catch (Exception e) {
e.printStackTrace();
}
}else if(action.equals("/findByIndexName")){

                           写入生成报表的代码
                           .......
                           .......
                           
}
}
}
页面中该如何显示。

--------------------编程问答-------------------- 你是要问jfreechart图片动态生成问题吗? --------------------编程问答--------------------
<img src="<%= graphURL %>" width=900 height=500 border=0 usemap="#<%= fileName %>" id="img1">

这里的代码已经写过了,在那个Servlet中就把图片的输出流输出到客户端就可以了吧。
OutputStream os = response.getOutputStream();
//以JPEG格式向客户端发送图形验证码
ImageIO.write(image, "JPEG", os);
--------------------编程问答-------------------- 嗯~ 两个servlet浓缩到一个servlet中
--------------------编程问答-------------------- 原来做的是把生成的图片放到一个URL里,然后前台使用这个URL
后台:
String graphURL =request.getContextPath()+"/servlet/DisplayChart?filename="+filename;
request.setAttribute("graphURL", graphURL);

前台:
</div>
<p align="center">
<% String url = (String)request.getAttribute("graphURL"); 
if(url != null)
out.print("<img src='"+url+"' />");
%>
</p>
</div> --------------------编程问答-------------------- 去网上找画图插件...
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,