- 浏览: 21334 次
- 性别:
- 来自: 广州
最新评论
-
hanmiao:
上述方法在我的 jfreechart 1.0.15 版本上无法 ...
JFreeChart 中文乱码 一站式解决 一个方法搞定 -
zhaochy:
谢谢!呵呵 解决了我的问题。。。
JFreeChart 中文乱码 一站式解决 一个方法搞定 -
brucehe:
jfreechart在swing中如果字体不设置成中文字体,中 ...
JFreeChart 中文乱码 一站式解决 一个方法搞定 -
ak47acao:
非常实用,非常清晰,对新接触jfreeChart的人来说真是太 ...
JFreeChart 中文乱码 一站式解决 一个方法搞定 -
成溪先生:
看着很清楚
JFreeChart 中文乱码 一站式解决 一个方法搞定
CreateChartService.java
完成报表的生成,项目只要柱状图和折线图,所以只生成了2中图形,
类中还有JFreeChart 数据的转换方法,JFreeChart相关的配置方法
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(); } } } }
发表评论
-
JFreeChart 中文乱码 一站式解决 一个方法搞定
2009-01-15 14:51 10160最近刚使用JFreeChart 完成项目的图片导出任务,中文乱 ... -
jfreechart完整使用(4)- DrawImageUtil.java
2009-01-15 14:22 1468DrawImageUtil.java 提供方法为外部调用 /* ... -
jfreechart完整使用(2)- ChartEntity.java
2009-01-15 14:18 1515ChartEntity.java 完成图片的配置,包括X轴名称 ... -
jfreechart完整使用(1)概述
2009-01-15 14:16 1550项目报表中使用JfreeChart 导出图片,通过查看 ...
相关推荐
struts2-jfreechart-plugin-2.1.8.1.jar
包含 jfreechart-1.0.19-demo.jar(java 环境下点击就可以查看) 包含jar包 jfreechart-1.0.19.jar,jfreechart-1.0.19-swt.jar,jcommon-1.0.23.jar,junit-4.11等,具体项目中需要哪些jar 包 ...
jfreechart-1.0.14.zip中包含jfreechart-1.0.14-demo.jar所对应的源码。
struts2-jfreechart-plugin-2.0.11.jarstruts2-jfreechart-plugin-2.0.11.jarstruts2-jfreechart-plugin-2.0.11.jar
jfreechart-1.0.1-demo.rarjfreechart-1.0.1-demo.rar
struts2-jfreechart-plugin-2.3.4.1.jar
jfreechart-1.0.14-swt.jar
jfreechart-1.0.19-demo.jar
JFreeChart目前是最好的java图形解决方案,基本能够解决目前的图形方面的需求,主要包括如下几个方面: pie charts (2D and 3D):饼图(平面和立体) bar charts (regular and stacked, with an optional 3D ...
jfreechart-1.0.11-demo.jar Inside MySpace.com LiveJournalScaling Flickr Scaling
struts2-jfreechart-plugin-2.1.8.1
更新详情:增加了借助jfreechart生成的图表,包括饼状图(2D/3D),柱状图(2D/3D),折线图,雷达图等图表。 yujianbo-java-tools.jar是本人平时里用到的工具类,分离出来打包成一个单独的jar工具包,里面包括: 1...
jfreechart(包jfreechart(包含jfreechart.jar和jcommon-1.0.13.jar) jfreechart(包含jfreechart.jar和jcommon-1.0.13.jar) jfreechart(包含jfreechart.jar和jcommon-1.0.13.jar) jfreechart(包含jfreechart.jar和...
3.1.4.jar jbpm-identity-3.1.4.jar jbpm-identity-src-3.1.4.jar jbpm-src-3.1.4.jar jbpm-webapp-3.1.4.jar jcommon-1.0.0.jar jfreechart-1.0.1.jar junit-3.8.1.jar jxl.jar log4j-1.2.8.jar mysqldriver.jar ...
jcommon-1.0.23.jar File
struts2-jfreechart-plugin-2.1.6.jar
struts2-jfreechart-plugin-2.0.8.jar
jcommon-1.0.13.jar+jfreechart-1.0.13.jar jcommon-1.0.13.jar+jfreechart-1.0.13.jar jcommon-1.0.13.jar+jfreechart-1.0.13.jar jcommon-1.0.13.jar+jfreechart-1.0.13.jar 用strust2做报表时画图
JFreeChart中文api (JFreeChart-1.0.5-Ch.chm) JFreeChart中文api (JFreeChart-1.0.5-Ch.chm)
jcommon-1.0.0.jar jfreechart-1.0.0.jar 包 jcommon-1.0.0.jar jfreechart-1.0.0.jar 包