报表(曲线图),求助~~~
求助各路高手,用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();--------------------编程问答-------------------- 嗯~ 两个servlet浓缩到一个servlet中
//以JPEG格式向客户端发送图形验证码
ImageIO.write(image, "JPEG", os);
--------------------编程问答-------------------- 原来做的是把生成的图片放到一个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