这两天学习了一些jfreechart 和 poi操作excel 的方法。
仅作备忘吧。
先说饼图,柱图,折线图
饼图
数据使用 DefaultPieDataset进行封装
DefaultPieDataset data=new DefaultPieDataset();
data.setValue("高中以下", 0.1);
data.setValue("高中", 0.1);
data.setValue("大专", 0.1);
data.setValue("本科", 0.1);
data.setValue("硕士", 0.1);
data.setValue("博士", 5);
将数据放到3d饼图类中
PiePlot3D plot=new PiePlot3D(data);// 生成一个3D饼图
JFreeChart chart=new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot, true);// 生成一个图
chart.setBackgroundPaint(java.awt.Color.white);// 可选,设置图片背景色
chart.setTitle("程序员学历情况调查表-By Alpha");// 可选,设置图片标题
最后将chart 数据放byteArrayOutputStream 中,共其他的方法使用
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
ChartUtilities.writeChartAsJPEG(byteArrayOutputStream, chart, 500, 300);
完整方法
private static void genPieJPG() throws IOException {
DefaultPieDataset data=new DefaultPieDataset();
// 数据初始化
// data.setValue("高中以下", 380);
// data.setValue("高中", 1620);
// data.setValue("大专", 6100);
// data.setValue("本科", 8310);
// data.setValue("硕士", 3520);
// data.setValue("博士", 80);
data.setValue("高中以下", 0.1);
data.setValue("高中", 0.1);
data.setValue("大专", 0.1);
data.setValue("本科", 0.1);
data.setValue("硕士", 0.1);
data.setValue("博士", 5);
PiePlot3D plot=new PiePlot3D(data);// 生成一个3D饼图
JFreeChart chart=new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot, true);// 生成一个图
chart.setBackgroundPaint(java.awt.Color.white);// 可选,设置图片背景色
chart.setTitle("程序员学历情况调查表-By Alpha");// 可选,设置图片标题
// plot.setToolTipGenerator(new StandardPieToolTipGenerator());
// 500是图片长度,300是图片高度
// String filename = ServletUtilities.saveChartAsPNG(chart,500,300,info,session);
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
ChartUtilities.writeChartAsJPEG(byteArrayOutputStream, chart, 500, 300);
FileOutputStream file=new FileOutputStream("d:/a.jpg");
file.write(byteArrayOutputStream.toByteArray());
file.close();
}
下面是图例
柱图
private static void genBarJPG() throws IOException {
// row keys...
final String series1="First";
// column keys...
final String category1="Category 1";
final String category2="Category 2";
final String category3="Category 3";
final String category4="Category 4";
final String category5="Category 5";
// create the dataset...
final DefaultCategoryDataset dataset=new DefaultCategoryDataset();
dataset.addValue(1.0, series1, category1);
dataset.addValue(4.0, series1, category2);
dataset.addValue(3.0, series1, category3);
dataset.addValue(5.0, series1, category4);
dataset.addValue(5.0, series1, category5);
final JFreeChart chart=ChartFactory.createBarChart("中文", // chart title
"类别", // domain axis label
"四圣兽", // range axis label
dataset, // data
PlotOrientation.VERTICAL, // orientation
true, // include legend
true, // tooltips?
true // URLs?
);
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
ChartUtilities.writeChartAsJPEG(byteArrayOutputStream, chart, 500, 300);
FileOutputStream file=new FileOutputStream("d:/a.jpg");
file.write(byteArrayOutputStream.toByteArray());
file.close();
}
图例
折线图
private static void genLineJPG() throws IOException {
// 数据源
XYSeriesCollection seriesCollection=new XYSeriesCollection();
XYSeries series1=new XYSeries("平均收视率");
// x, y 都是数字型
series1.add(1, 7.25);
series1.add(2, 4.81);
series1.add(3, 3.69);
series1.add(4, 3.53);
series1.add(5, 2.95);
series1.add(6, 3.96);
seriesCollection.addSeries(series1);
/**
* String title, // 图标题 String xAxisLabel x 轴标题 String yAxisLabel, y 轴标题 XYDataset dataset, 数据源 PlotOrientation orientation,
* 显示方向 boolean legend, 是否显示图例 boolean tooltips, 是否显示 tooltip boolean urls 是否指定 url )
**/
JFreeChart chart=
ChartFactory.createXYLineChart("无敌珊宝妹收视率走势图", "集数", "收视率百分点", seriesCollection, PlotOrientation.VERTICAL, true, true,
false);
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
ChartUtilities.writeChartAsJPEG(byteArrayOutputStream, chart, 500, 300);
FileOutputStream file=new FileOutputStream("d:/a.jpg");
file.write(byteArrayOutputStream.toByteArray());
file.close();
}
图例
一.POI简介
Jakarta POI 是apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java API
目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。
二.HSSF概况
HSSF 是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”。 也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。
HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多。
使用poi 写入操作
一个简单的操作流程,
先创建一个excel文件对象 HSSFWorkbook,
根据excel对象创建一个sheet,
根据sheet创建一个行对象,
向行对象写入数据,
将excel文件对象写入输出流或写入到文件中。
// 创建一个Excel文件
HSSFWorkbook wb=new HSSFWorkbook();
//获得CreationHelper对象,这个应该是一个帮助类
//英文对这个类的解释 An object that handles instantiating concrete classes of the various instances one needs for HSSF and XSSF.
CreationHelper createHelper=wb.getCreationHelper();
// 创建一个Excel的Sheet
HSSFSheet sheet=wb.createSheet("数据表");
//向excel中插入图片,在这里可以将上面的生成的图传递过来,插入到excel中
//start
HSSFPatriarch patriarch=sheet.createDrawingPatriarch();
HSSFClientAnchor anchor=new HSSFClientAnchor(0, 0, 512, 255, (short)1, 1, (short)10, 20);
anchor.setAnchorType(3);
patriarch.createPicture(anchor, wb.addPicture(baos.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
//end
//向excel中写入数据
for(int i=0; i < 10; i++) {
// Create a row and put some cells in it. Rows are 0 based.
Row row=sheet.createRow(i);
// Create a cell and put a value in it.
Cell cell=row.createCell(0);
cell.setCellValue(1000);
// Or do it on one line.
row.createCell(1).setCellValue(1.2);
row.createCell(2).setCellValue(createHelper.createRichTextString("中文"));
row.createCell(3).setCellValue(true);
}
// Write the output to a file
FileOutputStream fileOut=new FileOutputStream("d:/workbook33.xls");
wb.write(fileOut);
fileOut.close();
最后生成图片如下
参考:
jfreechart
http://www.java2s.com/Code/Java/Chart/JFreeChartBarChartDemo.htm
http://liliugen.iteye.com/blog/510838
poi excel
http://ltc603.iteye.com/blog/30184
http://developer.51cto.com/art/201202/319070.htm
http://poi.apache.org/