- 浏览: 176694 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (163)
- POI (8)
- Collection容器 (1)
- java.util (2)
- java调用批处理 (1)
- xml (1)
- jfreechart (3)
- SVN (1)
- tomcat中文 (1)
- jquery (6)
- Log4j (1)
- ppt (1)
- js (48)
- ss (1)
- 综合 (1)
- Spring (2)
- 数据库 (6)
- tomcat (1)
- commons-lang包使用 (1)
- AJAX【Jquery】 (3)
- RMI (2)
- OpenLayers (25)
- html (20)
- css (25)
- Google地图 (2)
- java (1)
- Ibatis (1)
- GoogleMaps (1)
- J2EE (2)
- 软件设计 (1)
- 服务器 (1)
- html5 (4)
- cursor (1)
- AngularJs (5)
- 缓存 (1)
- 构建 (2)
- 域名、空间、服务器 (1)
CreateChartService.java
完成报表的生成,项目只要柱状图和折线图,所以只生成了2中图形,
类中还有JFreeChart 数据的转换方法,JFreeChart相关的配置方法
Java代码
import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.bingosoft.common.config.Config;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.ui.TextAnchor;
public class CreateChartService {
private static Log log = LogFactory.getLog(CreateChartService.class);
// 图片的生成路径
private static final String CHART_PATH = Config.getString("image.filepath");
/**
* 生成折线图
* 1.解析数据<br>
* 2.迭代数据,产出图片数据流,并添加到List<br>
* @throws IOException
*/
public List createLineAndShapeChart(double[][]data , String[]rowKeys,String[] columnKeys,ChartEntity entity) throws IOException {
List list = new ArrayList() ;
byte[] bytes = new byte[]{} ;
// 解析数据
Map map = this.parseDataForBarPage(data, rowKeys, columnKeys) ;
int pageNum = Integer.parseInt(""+map.get("pageNum")) ;
// 迭代,产生图片数据流
for(int i=0 ; i<pageNum ; i++){
bytes = createSingleLineAndShapeChart((double[][])(map.get("data"+i)),(String[])(map.get("rowKeys"+i)),
(String[])(map.get("columnKeys"+i)),entity) ;
list.add(bytes) ;
}
return list ;
}
/**
* 生成单个折线图数据流
* @param data
* @param rowKeys
* @param columnKeys
* @param entity
* @return
* @throws IOException
*/
public byte[] createSingleLineAndShapeChart(double[][]data , String[]rowKeys,String[] columnKeys,ChartEntity entity) throws IOException {
CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
JFreeChart chart = createTimeXYChar(dataset, entity);
byte[] bytes = this.createImage(chart, entity) ;
return bytes ;
}
/**
* 生成柱状图<br>
* 1.解析数据<br>
* 2.迭代数据,产出图片数据流,并添加到List<br>
* @param data 数据
* @param rowKeys 行
* @param columnKeys 列
* @param entity 图片配置对象
* @return 包含多个图片数据流的List
* @throws IOException
*/
public List createStackedBarChart(double[][]data,String[]rowKeys,String[]columnKeys , ChartEntity entity) throws IOException {
// 解析数据
List list = new ArrayList() ;
byte[] bytes = new byte[]{} ;
Map map = this.parseDataForBarPage(data, rowKeys, columnKeys) ;
int pageNum = Integer.parseInt(""+map.get("pageNum")) ;
// 迭代数据,产出图片数据流,并添加到List
for(int i=0 ; i<pageNum ; i++){
bytes = createSingleStackedBarChart((double[][])(map.get("data"+i)),(String[])(map.get("rowKeys"+i)),
(String[])(map.get("columnKeys"+i)),entity) ;
list.add(bytes) ;
}
return list ;
}
/**
* 解析生成柱状图分页数据
* @param data
* @param rowKeys
* @param columnKeys
* @return
*/
private Map parseDataForBarPage(double[][]data,String[]rowKeys,String[]columnKeys){
Map map = new HashMap() ;
double [][] pageData = null ;
String [] pageColumn = null ;
int sumColumnNum = columnKeys.length ; // 总列数
int indexNum = Config.getInt("image.export.pagesize", 10) ;// 分页的列数
int pageNum = sumColumnNum%indexNum==0 ? sumColumnNum/indexNum : sumColumnNum/indexNum+1 ; // 分页数
int rowNum = rowKeys.length ;
// log.debug("data.length="+data.length+"sumColumnNum="+sumColumnNum+" indexNum="+indexNum+" pageNum="+pageNum+" rowNum="+rowNum+" ");
// 解析传递过来的数据
for(int i=0 ; i<pageNum ; i++){
int columnNum = (sumColumnNum-i*indexNum)/indexNum>0 ? indexNum : (sumColumnNum-i*indexNum)%indexNum ;//当前页列数
pageData = new double[rowNum][columnNum] ;
// 取数据值
for(int j=0 ; j<rowNum ; j++){
pageColumn = new String[columnNum] ;
for(int k=0 ; k<columnNum ; k ++){
pageData[j][k] = data[j][k+i*indexNum] ; // 数据
}
}
// 取列值
for(int j=0 ; j<columnNum ; j++){
pageColumn[j] = columnKeys[j+i*indexNum] ; // 列
}
// 保存数据并返回
map.put("data"+i, pageData) ;
map.put("rowKeys"+i, rowKeys) ;
map.put("columnKeys"+i, pageColumn) ;
}
// 保存分页数
map.put("pageNum", pageNum);
return map ;
}
/**
* 解析生成折线图分页数据
* @param data
* @param rowKeys
* @param columnKeys
* @return
*/
private Map parseDataForLinePage(double[][]data,String[]rowKeys,String[]columnKeys){
Map map = new HashMap() ;
double [][] pageData = null ;
String [] pageColumn = null ;
int sumColumnNum = columnKeys.length ; // 总列数
int indexNum = Config.getInt("image.export.pagesize", 10) ;// 分页的列数
int pageNum = sumColumnNum%indexNum==0 ? sumColumnNum/indexNum : sumColumnNum/indexNum+1 ; // 分页数
int rowNum = rowKeys.length ;
// log.debug("data.length="+data.length+"sumColumnNum="+sumColumnNum+" indexNum="+indexNum+" pageNum="+pageNum+" rowNum="+rowNum+" ");
// 解析传递过来的数据
for(int i=0 ; i<pageNum ; i++){
int columnNum = (sumColumnNum-i*indexNum)/indexNum>0 ? indexNum : (sumColumnNum-i*indexNum)%indexNum ;//当前页列数
pageData = new double[rowNum][columnNum] ;
// 取数据值
for(int j=0 ; j<rowNum ; j++){
pageColumn = new String[columnNum] ;
for(int k=0 ; k<columnNum ; k ++){
pageData[j][k] = data[j][k+i*indexNum] ; // 数据
}
}
// 取列值
for(int j=0 ; j<columnNum ; j++){
pageColumn[j] = columnKeys[j+i*indexNum] ; // 列
}
// 保存数据并返回
map.put("data"+i, pageData) ;
map.put("rowKeys"+i, rowKeys) ;
map.put("columnKeys"+i, pageColumn) ;
}
// 保存分页数
map.put("pageNum", pageNum);
return map ;
}
/**
* 生成单个堆栈柱状图
* @return 图片数据流
* @throws IOException
*/
public byte[] createSingleStackedBarChart(double[][]data,String[]rowKeys,String[]columnKeys , ChartEntity entity) throws IOException {
CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
JFreeChart chart = createStackedBarChart(dataset, entity);
byte[] bytes = this.createImage(chart, entity) ;
return bytes ;
}
// 柱状图,折线图 数据集
private CategoryDataset getBarData(double[][] data, String[] rowKeys,
String[] columnKeys) {
return DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
}
/**
* 判断文件夹是否存在,如果不存在则新建
* @param chartPath
*/
private void isChartPathExist(String chartPath) {
File file = new File(chartPath);
if (!file.exists()) {
file.mkdirs();
}
}
/**
* 折线图
*
* @param chartTitle
* @param x
* @param y
* @param xyDataset
* @param charName
* @return
*/
private JFreeChart createTimeXYChar(CategoryDataset xyDataset,ChartEntity entity) {
JFreeChart chart = ChartFactory.createLineChart(
entity.getTitle(),
entity.getXname(),
entity.getYname(),
xyDataset,
PlotOrientation.VERTICAL,
true,
true,
false);
chart.setTextAntiAlias(false);
chart.setBackgroundPaint(Color.WHITE);
CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
// 没有数据时显示
this.configNoData(chart, "没有查询到数据 !") ;
// x轴 // 分类轴网格是否可见
categoryplot.setDomainGridlinesVisible(true);
// y轴 //数据轴网格是否可见
categoryplot.setRangeGridlinesVisible(true);
categoryplot.setRangeGridlinePaint(Color.WHITE);// 虚线色彩
categoryplot.setDomainGridlinePaint(Color.WHITE);// 虚线色彩
categoryplot.setBackgroundPaint(Color.lightGray);
// 配置字体
this.configFont(chart) ;
// x轴设置
CategoryAxis domainAxis = categoryplot.getDomainAxis();
// 设置距离图片左端距离
domainAxis.setLowerMargin(0.0);
// 设置距离图片右端距离
domainAxis.setUpperMargin(0.0);
domainAxis.setTickLabelPaint(Color.BLUE) ;
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的label斜显示
NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
numberaxis.setAutoRangeIncludesZero(true);
// 获得renderer 注意这里是下嗍造型到lineandshaperenderer!!
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot.getRenderer();
lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见
lineandshaperenderer.setBaseLinesVisible(true); // series 点(即数据点)间有连线可见
// 显示折点数据
lineandshaperenderer.setBaseItemLabelGenerator(new
StandardCategoryItemLabelGenerator());
lineandshaperenderer.setBaseItemLabelsVisible(true);
return chart ;
}
/**
* 堆栈柱状图
*
* @param dataset
* @param xName
* @param yName
* @param chartTitle
* @param charName
* @return
*/
private JFreeChart createStackedBarChart(CategoryDataset dataset, ChartEntity entity) {
JFreeChart chart = ChartFactory.createStackedBarChart3D(
entity.getTitle(),
entity.getXname(),
entity.getYname(),
dataset,
PlotOrientation.VERTICAL,
true,
false,
false );
// 没有数据配置
this.configNoData(chart,"没有查询到数据 !") ;
// 配置字体
this.configFont(chart) ;
// 配置 Renderer
this.configBarRenderer(chart) ;
// 其他配置
this.configOtherForBar(chart) ;
return chart ;
}
/**
* 配置字体
* @param chart JFreeChart 对象
*/
private void configFont(JFreeChart chart){
// 配置字体
Font xfont = new Font("宋体",Font.PLAIN,12) ;// X轴
Font yfont = new Font("宋体",Font.PLAIN,12) ;// Y轴
Font kfont = new Font("宋体",Font.PLAIN,12) ;// 底部
Font titleFont = new Font("隶书", Font.BOLD , 25) ; // 图片标题
CategoryPlot plot = chart.getCategoryPlot();// 图形的绘制结构对象
// 图片标题
chart.setTitle(new TextTitle(chart.getTitle().getText(),titleFont));
// 底部
chart.getLegend().setItemFont(kfont);
// X 轴
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(xfont);// 轴标题
domainAxis.setTickLabelFont(xfont);// 轴数值
domainAxis.setTickLabelPaint(Color.BLUE) ; // 字体颜色
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的label斜显示
// Y 轴
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(yfont);
rangeAxis.setLabelPaint(Color.BLUE) ; // 字体颜色
rangeAxis.setTickLabelFont(yfont);
}
/**
* 配置柱状图
* @param chart
*/
private void configBarRenderer(JFreeChart chart){
CategoryPlot categoryplot = (CategoryPlot)chart.getPlot();
// 自定义显示柱子上的总值
ExtendedStackedBarRenderer extendedstackedbarrenderer = new ExtendedStackedBarRenderer();
extendedstackedbarrenderer.setBaseItemLabelsVisible(true);
extendedstackedbarrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
extendedstackedbarrenderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
categoryplot.setRenderer(extendedstackedbarrenderer);
BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer();
barrenderer.setDrawBarOutline(false);
barrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
barrenderer.setBaseItemLabelsVisible(true);
barrenderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER));
barrenderer.setBaseNegativeItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER));
// 柱子显示数值
// barrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}",new DecimalFormat("0.0%")));
// barrenderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
barrenderer.setItemLabelFont(new Font("Arial Unicode MS",Font.PLAIN,9));
barrenderer.setItemLabelsVisible(true);
// 如果数值没有显示空间,设置显示格式
// ItemLabelPosition itemLabelPositionFallback=new ItemLabelPosition(
// ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_LEFT,
// TextAnchor.HALF_ASCENT_LEFT,0D);
// barrenderer.setPositiveItemLabelPositionFallback(itemLabelPositionFallback);
// barrenderer.setNegativeItemLabelPositionFallback(itemLabelPositionFallback);
categoryplot.setRenderer(barrenderer) ;
}
/**
* 配置没有数据时的显示信息
* @param chart
*/
private void configNoData(JFreeChart chart,String message){
CategoryPlot categoryplot = (CategoryPlot)chart.getPlot();
// 没有数据时的显示
categoryplot.setNoDataMessage(message) ;
categoryplot.setNoDataMessageFont(new Font("黑体",Font.BOLD,25)) ;
}
/**
* 其他配置
* @param chart
*/
private void configOtherForBar(JFreeChart chart){
chart.setTextAntiAlias(false); // 图例字体清晰
chart.setBackgroundPaint(Color.WHITE); // 背景颜色
CategoryPlot plot = chart.getCategoryPlot();// 图形的绘制结构对象
NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
numberaxis.setAutoRangeIncludesZero(true);
}
/**
* 创建图片的数据流
* @param chart
* @param entity 图片配置对象
* @return 图片数据流
* @throws IOException
*/
private byte[] createImage(JFreeChart chart , ChartEntity entity) throws IOException{
return ChartUtilities.encodeAsPNG(chart.createBufferedImage(entity.getWidth(), entity.getHeight())) ;
}
/**
* 创建图片文件到硬盘
* @param chart
* @param entity
* @throws IOException
*/
private void createImageFile(JFreeChart chart , ChartEntity entity) throws IOException{
FileOutputStream fos_jpg = null;
try {
isChartPathExist(CHART_PATH);
String chartName = CHART_PATH + entity.getFileName();
fos_jpg = new FileOutputStream(chartName);
ChartUtilities.writeChartAsJPEG(fos_jpg, chart, entity.getWidth(), entity.getHeight()) ;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fos_jpg.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
完成报表的生成,项目只要柱状图和折线图,所以只生成了2中图形,
类中还有JFreeChart 数据的转换方法,JFreeChart相关的配置方法
Java代码
import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.bingosoft.common.config.Config;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.ui.TextAnchor;
public class CreateChartService {
private static Log log = LogFactory.getLog(CreateChartService.class);
// 图片的生成路径
private static final String CHART_PATH = Config.getString("image.filepath");
/**
* 生成折线图
* 1.解析数据<br>
* 2.迭代数据,产出图片数据流,并添加到List<br>
* @throws IOException
*/
public List createLineAndShapeChart(double[][]data , String[]rowKeys,String[] columnKeys,ChartEntity entity) throws IOException {
List list = new ArrayList() ;
byte[] bytes = new byte[]{} ;
// 解析数据
Map map = this.parseDataForBarPage(data, rowKeys, columnKeys) ;
int pageNum = Integer.parseInt(""+map.get("pageNum")) ;
// 迭代,产生图片数据流
for(int i=0 ; i<pageNum ; i++){
bytes = createSingleLineAndShapeChart((double[][])(map.get("data"+i)),(String[])(map.get("rowKeys"+i)),
(String[])(map.get("columnKeys"+i)),entity) ;
list.add(bytes) ;
}
return list ;
}
/**
* 生成单个折线图数据流
* @param data
* @param rowKeys
* @param columnKeys
* @param entity
* @return
* @throws IOException
*/
public byte[] createSingleLineAndShapeChart(double[][]data , String[]rowKeys,String[] columnKeys,ChartEntity entity) throws IOException {
CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
JFreeChart chart = createTimeXYChar(dataset, entity);
byte[] bytes = this.createImage(chart, entity) ;
return bytes ;
}
/**
* 生成柱状图<br>
* 1.解析数据<br>
* 2.迭代数据,产出图片数据流,并添加到List<br>
* @param data 数据
* @param rowKeys 行
* @param columnKeys 列
* @param entity 图片配置对象
* @return 包含多个图片数据流的List
* @throws IOException
*/
public List createStackedBarChart(double[][]data,String[]rowKeys,String[]columnKeys , ChartEntity entity) throws IOException {
// 解析数据
List list = new ArrayList() ;
byte[] bytes = new byte[]{} ;
Map map = this.parseDataForBarPage(data, rowKeys, columnKeys) ;
int pageNum = Integer.parseInt(""+map.get("pageNum")) ;
// 迭代数据,产出图片数据流,并添加到List
for(int i=0 ; i<pageNum ; i++){
bytes = createSingleStackedBarChart((double[][])(map.get("data"+i)),(String[])(map.get("rowKeys"+i)),
(String[])(map.get("columnKeys"+i)),entity) ;
list.add(bytes) ;
}
return list ;
}
/**
* 解析生成柱状图分页数据
* @param data
* @param rowKeys
* @param columnKeys
* @return
*/
private Map parseDataForBarPage(double[][]data,String[]rowKeys,String[]columnKeys){
Map map = new HashMap() ;
double [][] pageData = null ;
String [] pageColumn = null ;
int sumColumnNum = columnKeys.length ; // 总列数
int indexNum = Config.getInt("image.export.pagesize", 10) ;// 分页的列数
int pageNum = sumColumnNum%indexNum==0 ? sumColumnNum/indexNum : sumColumnNum/indexNum+1 ; // 分页数
int rowNum = rowKeys.length ;
// log.debug("data.length="+data.length+"sumColumnNum="+sumColumnNum+" indexNum="+indexNum+" pageNum="+pageNum+" rowNum="+rowNum+" ");
// 解析传递过来的数据
for(int i=0 ; i<pageNum ; i++){
int columnNum = (sumColumnNum-i*indexNum)/indexNum>0 ? indexNum : (sumColumnNum-i*indexNum)%indexNum ;//当前页列数
pageData = new double[rowNum][columnNum] ;
// 取数据值
for(int j=0 ; j<rowNum ; j++){
pageColumn = new String[columnNum] ;
for(int k=0 ; k<columnNum ; k ++){
pageData[j][k] = data[j][k+i*indexNum] ; // 数据
}
}
// 取列值
for(int j=0 ; j<columnNum ; j++){
pageColumn[j] = columnKeys[j+i*indexNum] ; // 列
}
// 保存数据并返回
map.put("data"+i, pageData) ;
map.put("rowKeys"+i, rowKeys) ;
map.put("columnKeys"+i, pageColumn) ;
}
// 保存分页数
map.put("pageNum", pageNum);
return map ;
}
/**
* 解析生成折线图分页数据
* @param data
* @param rowKeys
* @param columnKeys
* @return
*/
private Map parseDataForLinePage(double[][]data,String[]rowKeys,String[]columnKeys){
Map map = new HashMap() ;
double [][] pageData = null ;
String [] pageColumn = null ;
int sumColumnNum = columnKeys.length ; // 总列数
int indexNum = Config.getInt("image.export.pagesize", 10) ;// 分页的列数
int pageNum = sumColumnNum%indexNum==0 ? sumColumnNum/indexNum : sumColumnNum/indexNum+1 ; // 分页数
int rowNum = rowKeys.length ;
// log.debug("data.length="+data.length+"sumColumnNum="+sumColumnNum+" indexNum="+indexNum+" pageNum="+pageNum+" rowNum="+rowNum+" ");
// 解析传递过来的数据
for(int i=0 ; i<pageNum ; i++){
int columnNum = (sumColumnNum-i*indexNum)/indexNum>0 ? indexNum : (sumColumnNum-i*indexNum)%indexNum ;//当前页列数
pageData = new double[rowNum][columnNum] ;
// 取数据值
for(int j=0 ; j<rowNum ; j++){
pageColumn = new String[columnNum] ;
for(int k=0 ; k<columnNum ; k ++){
pageData[j][k] = data[j][k+i*indexNum] ; // 数据
}
}
// 取列值
for(int j=0 ; j<columnNum ; j++){
pageColumn[j] = columnKeys[j+i*indexNum] ; // 列
}
// 保存数据并返回
map.put("data"+i, pageData) ;
map.put("rowKeys"+i, rowKeys) ;
map.put("columnKeys"+i, pageColumn) ;
}
// 保存分页数
map.put("pageNum", pageNum);
return map ;
}
/**
* 生成单个堆栈柱状图
* @return 图片数据流
* @throws IOException
*/
public byte[] createSingleStackedBarChart(double[][]data,String[]rowKeys,String[]columnKeys , ChartEntity entity) throws IOException {
CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
JFreeChart chart = createStackedBarChart(dataset, entity);
byte[] bytes = this.createImage(chart, entity) ;
return bytes ;
}
// 柱状图,折线图 数据集
private CategoryDataset getBarData(double[][] data, String[] rowKeys,
String[] columnKeys) {
return DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
}
/**
* 判断文件夹是否存在,如果不存在则新建
* @param chartPath
*/
private void isChartPathExist(String chartPath) {
File file = new File(chartPath);
if (!file.exists()) {
file.mkdirs();
}
}
/**
* 折线图
*
* @param chartTitle
* @param x
* @param y
* @param xyDataset
* @param charName
* @return
*/
private JFreeChart createTimeXYChar(CategoryDataset xyDataset,ChartEntity entity) {
JFreeChart chart = ChartFactory.createLineChart(
entity.getTitle(),
entity.getXname(),
entity.getYname(),
xyDataset,
PlotOrientation.VERTICAL,
true,
true,
false);
chart.setTextAntiAlias(false);
chart.setBackgroundPaint(Color.WHITE);
CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
// 没有数据时显示
this.configNoData(chart, "没有查询到数据 !") ;
// x轴 // 分类轴网格是否可见
categoryplot.setDomainGridlinesVisible(true);
// y轴 //数据轴网格是否可见
categoryplot.setRangeGridlinesVisible(true);
categoryplot.setRangeGridlinePaint(Color.WHITE);// 虚线色彩
categoryplot.setDomainGridlinePaint(Color.WHITE);// 虚线色彩
categoryplot.setBackgroundPaint(Color.lightGray);
// 配置字体
this.configFont(chart) ;
// x轴设置
CategoryAxis domainAxis = categoryplot.getDomainAxis();
// 设置距离图片左端距离
domainAxis.setLowerMargin(0.0);
// 设置距离图片右端距离
domainAxis.setUpperMargin(0.0);
domainAxis.setTickLabelPaint(Color.BLUE) ;
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的label斜显示
NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
numberaxis.setAutoRangeIncludesZero(true);
// 获得renderer 注意这里是下嗍造型到lineandshaperenderer!!
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot.getRenderer();
lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见
lineandshaperenderer.setBaseLinesVisible(true); // series 点(即数据点)间有连线可见
// 显示折点数据
lineandshaperenderer.setBaseItemLabelGenerator(new
StandardCategoryItemLabelGenerator());
lineandshaperenderer.setBaseItemLabelsVisible(true);
return chart ;
}
/**
* 堆栈柱状图
*
* @param dataset
* @param xName
* @param yName
* @param chartTitle
* @param charName
* @return
*/
private JFreeChart createStackedBarChart(CategoryDataset dataset, ChartEntity entity) {
JFreeChart chart = ChartFactory.createStackedBarChart3D(
entity.getTitle(),
entity.getXname(),
entity.getYname(),
dataset,
PlotOrientation.VERTICAL,
true,
false,
false );
// 没有数据配置
this.configNoData(chart,"没有查询到数据 !") ;
// 配置字体
this.configFont(chart) ;
// 配置 Renderer
this.configBarRenderer(chart) ;
// 其他配置
this.configOtherForBar(chart) ;
return chart ;
}
/**
* 配置字体
* @param chart JFreeChart 对象
*/
private void configFont(JFreeChart chart){
// 配置字体
Font xfont = new Font("宋体",Font.PLAIN,12) ;// X轴
Font yfont = new Font("宋体",Font.PLAIN,12) ;// Y轴
Font kfont = new Font("宋体",Font.PLAIN,12) ;// 底部
Font titleFont = new Font("隶书", Font.BOLD , 25) ; // 图片标题
CategoryPlot plot = chart.getCategoryPlot();// 图形的绘制结构对象
// 图片标题
chart.setTitle(new TextTitle(chart.getTitle().getText(),titleFont));
// 底部
chart.getLegend().setItemFont(kfont);
// X 轴
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(xfont);// 轴标题
domainAxis.setTickLabelFont(xfont);// 轴数值
domainAxis.setTickLabelPaint(Color.BLUE) ; // 字体颜色
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的label斜显示
// Y 轴
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(yfont);
rangeAxis.setLabelPaint(Color.BLUE) ; // 字体颜色
rangeAxis.setTickLabelFont(yfont);
}
/**
* 配置柱状图
* @param chart
*/
private void configBarRenderer(JFreeChart chart){
CategoryPlot categoryplot = (CategoryPlot)chart.getPlot();
// 自定义显示柱子上的总值
ExtendedStackedBarRenderer extendedstackedbarrenderer = new ExtendedStackedBarRenderer();
extendedstackedbarrenderer.setBaseItemLabelsVisible(true);
extendedstackedbarrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
extendedstackedbarrenderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
categoryplot.setRenderer(extendedstackedbarrenderer);
BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer();
barrenderer.setDrawBarOutline(false);
barrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
barrenderer.setBaseItemLabelsVisible(true);
barrenderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER));
barrenderer.setBaseNegativeItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER));
// 柱子显示数值
// barrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}",new DecimalFormat("0.0%")));
// barrenderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
barrenderer.setItemLabelFont(new Font("Arial Unicode MS",Font.PLAIN,9));
barrenderer.setItemLabelsVisible(true);
// 如果数值没有显示空间,设置显示格式
// ItemLabelPosition itemLabelPositionFallback=new ItemLabelPosition(
// ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_LEFT,
// TextAnchor.HALF_ASCENT_LEFT,0D);
// barrenderer.setPositiveItemLabelPositionFallback(itemLabelPositionFallback);
// barrenderer.setNegativeItemLabelPositionFallback(itemLabelPositionFallback);
categoryplot.setRenderer(barrenderer) ;
}
/**
* 配置没有数据时的显示信息
* @param chart
*/
private void configNoData(JFreeChart chart,String message){
CategoryPlot categoryplot = (CategoryPlot)chart.getPlot();
// 没有数据时的显示
categoryplot.setNoDataMessage(message) ;
categoryplot.setNoDataMessageFont(new Font("黑体",Font.BOLD,25)) ;
}
/**
* 其他配置
* @param chart
*/
private void configOtherForBar(JFreeChart chart){
chart.setTextAntiAlias(false); // 图例字体清晰
chart.setBackgroundPaint(Color.WHITE); // 背景颜色
CategoryPlot plot = chart.getCategoryPlot();// 图形的绘制结构对象
NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
numberaxis.setAutoRangeIncludesZero(true);
}
/**
* 创建图片的数据流
* @param chart
* @param entity 图片配置对象
* @return 图片数据流
* @throws IOException
*/
private byte[] createImage(JFreeChart chart , ChartEntity entity) throws IOException{
return ChartUtilities.encodeAsPNG(chart.createBufferedImage(entity.getWidth(), entity.getHeight())) ;
}
/**
* 创建图片文件到硬盘
* @param chart
* @param entity
* @throws IOException
*/
private void createImageFile(JFreeChart chart , ChartEntity entity) throws IOException{
FileOutputStream fos_jpg = null;
try {
isChartPathExist(CHART_PATH);
String chartName = CHART_PATH + entity.getFileName();
fos_jpg = new FileOutputStream(chartName);
ChartUtilities.writeChartAsJPEG(fos_jpg, chart, entity.getWidth(), entity.getHeight()) ;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fos_jpg.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
相关推荐
Java反编译是将已编译的字节码(.class文件)转换回源代码的...然而,反编译他人的代码可能存在法律风险,必须确保遵循开源许可协议,并尊重原作者的知识产权。在实际操作中,建议先查阅相关许可信息,确保合法合规。
”意味着这个jar包是开发人员分享出来供他人使用的资源,可以帮助需要进行数据可视化的开发者快速构建图形界面。 在标签中提到的“jfreechart”,再次强调了这个话题的核心——JFreeChart库。它是Java开发中处理...
在修改代码时,建议重构以提高可读性和维护性,同时添加适当的注释以方便他人理解。 总之,这个项目展示了如何结合JFreeChart、JSP和Oracle数据库实现数据可视化的Web应用。通过学习这个项目,你可以掌握如何在Java...
这是一个struts2+jfreechart的完整源码程序。tomcat运行后可看到简单的饼形图和柱状图。运行DemoTest/RealTimeChart可看到即时曲线图示例。本来这些应资源共享,可下载别人好东西时需要积分,所以设置为1分。希望...
别的组问我们项目经理要报表模块,本来不打算给的,但是是经理要求,没办法,既然打包发给别人了,顺便穿一份上来,能看懂的就尽管下吧,与人有益 与我有益。本包是一个jfreechart的完整模块,只是口径不是很多,...
10. **社区参与:** 开源项目需要社区的支持,因此改进过程应考虑与社区的沟通,接受反馈并鼓励他人贡献。 通过以上分析,我们可以看到改善JFreeChart涉及的知识点广泛,涵盖Java编程、测试技术、性能优化等多个...
它包括普通的人员关系,物品管理等最特色的是他使用Jfreechart.jar 实现的报表效果,折线图 显示当前月,天,年,各类物品的销售,圆饼图,柱形图用于各类信息的动态显示(数据从数据库动态提取),可以通过鼠标放大,...
### 教你一步一步反编译并得到所有源代码 在软件开发领域,有时我们需要对一些已有的二进制文件或类文件进行逆向工程...需要注意的是,在进行此类操作时应确保不会侵犯他人的知识产权,合理合法地使用这些工具和技术。
此外,我还学习了JavaWeb、Servlet、JDBC数据库操作,掌握了快速建模和数据池的应用,了解了单态模式的设计思想,并通过JFreechart实现了数据可视化,同时参与了多个项目,如俄罗斯方块、人力资源管理系统和购物网站...
学员意识到自己在学习态度上的松懈,有时会偷懒,对待任务不够认真,这导致与他人的差距逐渐拉大。此外,缺乏有效的交流平台和团队合作经验,如实训小组中缺少能够相互讨论和学习的伙伴,这直接影响到学习效果。面对...
3. **3D图形库**:为了生成3D柱状图,实验可能使用了Java的3D图形库,如Java3D或JFreeChart。这些库提供了丰富的API,可以方便地创建和定制3D图形。 4. **数据可视化**:在Java中,数据可视化是通过将数据转换为...
12. **报表与统计**:系统可能包含报表功能,使用JFreeChart或ECharts生成库存、销售等数据的可视化报表,辅助决策。 对于学习者和开发者来说,这个开源项目提供了一个实践Java Web开发、理解企业进销存管理流程的...
为了将分析后的数据转化为可视化的词云,项目可能使用了Java的数据可视化库,如JFreeChart或JavaFX。这些库提供了创建图形,包括饼图、柱状图和自定义形状的能力,使得可以以艺术化的形式展示词频。 **5. 字体处理*...
通过收集他人的经验分享,旨在帮助更多开发者解决问题。 ### 2. JSP问题集锦 #### 2.1. 上传问题 - **链接**: [http://topic.csdn.net/t/20050105/09/3699823.html]...
10. **文档与注释**:良好的项目文档和代码注释可以帮助他人理解和维护项目。 总体来说,"Segundo-Proyecto-EDM-"是一个涉及Java编程、GUI设计、数据处理和可视化的综合项目,对于想要提升Java技能和数据可视化能力...
页面可以做的很漂亮,结合echopoint,可以作出很多图形效果(里面用了jfreechart包)。使用SWING的思想来作网页,把HTML当作JAVA的类来做。但是大量使用Session,页面分帧(Frame)很多,系统资源消耗很大。??免费。?...
6. **可视化展示**:结果可能需要通过图表展示出来,如使用JavaFX或JFreeChart等库制作图形,以便直观地理解数据分布和趋势。 7. **文件操作**:可能需要将抓取和处理的数据保存到本地文件,以便后续分析或备份。...
4. **图形绘制**:Java提供了多种库来绘制图形,例如Java AWT和Swing库可以创建基本的图形界面,JFreeChart库则支持更复杂的图表绘制。在Kata 2中,可能需要你使用这些库或者自定义方法来绘制直方图。 5. **输入/...