JfreeChart在web開發中如何實現報表:
JfreeChart的下載鏈接地址 http://sourceforge.net/projects/jfreechart/files/
import java.sql.*;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import com.zhaoming.shopping.util.DB;
public class ShowProductSalesServlet extends HttpServlet
{
/**
*
*/
private static final long serialVersionUID = 1L;
private static DefaultCategoryDataset barDataset = new DefaultCategoryDataset();
private static DefaultPieDataset pieDataset = new DefaultPieDataset();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
req.setCharacterEncoding("GBK");
resp.setCharacterEncoding("GBK");
// 創建數據
getDataSet();
// 創建 JFreeChart 對象
//直方圖
JFreeChart chart = ChartFactory.createBarChart("商品銷量圖", "商品", "銷量",
barDataset, PlotOrientation.VERTICAL, true, true, false);
// 配置JFreeChart對象相關信息,如:字體大小,顏色,防止亂碼
ShowProductSalesServlet.configFont(chart);
// 輸出
//創建 Jfreechart對象 實現餅圖
JFreeChart jfreechart = ChartFactory.createPieChart3D("pieChart", pieDataset, true, true, false);
//爲了防止出現亂碼,對於字體進行設置
jfreechart.getTitle().setFont(new Font("宋體", Font.CENTER_BASELINE, 20));//設置標題字體
PiePlot piePlot= (PiePlot) jfreechart.getPlot();//獲取圖表區域對象
piePlot.setLabelFont(new Font("宋體",Font.BOLD,10));
jfreechart.getLegend().setItemFont(new Font("微軟雅黑",Font.BOLD,10));
//得到圖片
FileOutputStream fos_jpg = null;
FileOutputStream fos_jpg2 = null;
try
{
//把圖片存到硬盤的相對位置
fos_jpg = new FileOutputStream(
"F:\\svnTest\\webTest\\project\\Shopping2\\WebRoot\\images\\chart\\Bar.jpg");
ChartUtilities.writeChartAsJPEG(fos_jpg, 0.99f, chart, 800, 600,
null);
fos_jpg2 = new FileOutputStream(
"F:\\svnTest\\webTest\\project\\Shopping2\\WebRoot\\images\\chart\\Pie.jpg");
// 用工具把圖象寫到硬盤,支持兩種格式,JPG,PNG,還支持MAP
ChartUtilities.writeChartAsJPEG(fos_jpg2, 0.99f, jfreechart, 600,
400, null);
this.getServletContext().getRequestDispatcher(
"/admin/ShowProductSalesChart.jsp").forward(req, resp);
fos_jpg.close();
fos_jpg2.close();
} catch (Exception e)
{
e.printStackTrace();
}
}
//連接數據庫,拿到相應的數據,設置到對象中
public static void getDataSet()
{
// 創建數據
// 數據初始化
Connection conn = null;
ResultSet rs = null;
try
{
conn = DB.getConn();
String sql = "select p.name ,sum(pcont) from product p join salesitem si on ( p.id = si.productid) group by p.id";
//System.out.println("sales sql" + sql);
rs = DB.getRs(conn, sql);
while (rs.next())
{
barDataset.addValue(rs.getInt(2),"", rs.getString(1));
pieDataset.setValue(rs.getString(1), rs.getInt(2));
}
} catch (Exception e)
{
e.printStackTrace();
} finally
{
DB.close(rs);
DB.close(conn);
}
}
/**
* 對生成的直方圖像進行設置
* @param chart
*/
public static void configFont(JFreeChart chart)
{
// 設置邊框寬度
chart.setBorderStroke(new BasicStroke(1));
// 設置邊框是否可見
chart.setBorderVisible(true);
// 設置邊框着色
chart.setBorderPaint(Color.cyan);
// 設置背景顏色
// chart.setBackgroundPaint(Color.YELLOW);
// 配置字體
Font xfont = new Font("宋體", Font.CENTER_BASELINE, 20);// X軸
Font yfont = new Font("宋體", Font.CENTER_BASELINE, 20);// Y軸
Font kfont = new Font("宋體", Font.CENTER_BASELINE, 18);// 底部
Font titleFont = new Font("微軟雅黑", Font.CENTER_BASELINE, 25); // 圖片標題
CategoryPlot plot = chart.getCategoryPlot();// 圖形的繪製結構對象
// 數據軸網格線條顏色
plot.setRangeGridlinePaint(Color.BLUE);
// 數據軸網格線條筆觸
plot.setRangeGridlineStroke(new BasicStroke(1.0f));
// 圖片標題
chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));
// 底部字體樣式,防止亂碼
chart.getLegend().setItemFont(kfont);
// X軸
CategoryAxis domainAxis = plot.getDomainAxis();
// 設置X軸標題字體
domainAxis.setLabelFont(xfont);
// 設置X軸字體
domainAxis.setTickLabelFont(xfont);
// 設置字體顏色
domainAxis.setTickLabelPaint(Color.BLUE);
// 橫軸上的label斜顯示
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
// domainAxis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45);
// 分類軸邊距,同種類型之間的距離
// 這是分類之間的距離,和BAR與BAR之間的距離有差別
// domainAxis.setCategoryMargin(0.2f);
// 分類軸下(左)邊距,就是離左邊的距離
domainAxis.setLowerMargin(0.1);
// 分類軸下(右)邊距,就是離最右邊的距離
domainAxis.setUpperMargin(0.1);
// Y 軸
ValueAxis rangeAxis = plot.getRangeAxis();
// 設置Y軸標題字體
rangeAxis.setLabelFont(yfont);
// 設置Y軸字體
rangeAxis.setTickLabelFont(yfont);
// 字體顏色
rangeAxis.setLabelPaint(Color.RED);
// 設置Bar的顏色
BarRenderer renderer = (BarRenderer) plot.getRenderer();
renderer.setSeriesPaint(0, Color.gray);
renderer.setSeriesPaint(1, Color.orange);
// 每個BAR之間的間隔
renderer.setItemMargin(0.0f);
// 每個BAR的最大寬度
// renderer.setMaximumBarWidth(0.5f);
}
}