(7) 如何用Apache POI操作Excel文件-----如何用Apache POI 画一个离散图

原创 2015年05月29日 23:53:02

有的时候,我们需要Excel中的数据,通过一个图画,可视化的表现出来。 那么这个时候,应该如何做呢?现在就借花献佛,以Apache POI自己提供的一个例子为例,给大家演示一下POI的API 如何画图的。下面是一个最终的效果图。然后分别给大家解释每段代码的作用和意义。


代码如下,

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.ss.usermodel.charts.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * Illustrates how to create a simple scatter chart.
 *
 * @author Roman Kashitsyn
 */
public class ScatterChart {

    public static void main(String[] args) throws Exception {
        Workbook wb = new XSSFWorkbook();
        Sheet sheet = wb.createSheet("Sheet 1");
        final int NUM_OF_ROWS = 3;
        final int NUM_OF_COLUMNS = 10;

        // Create a row and put some cells in it. Rows are 0 based.
        Row row;
        Cell cell;
        for (int rowIndex = 0; rowIndex < NUM_OF_ROWS; rowIndex++) {
            row = sheet.createRow((short) rowIndex);
            for (int colIndex = 0; colIndex < NUM_OF_COLUMNS; colIndex++) {
                cell = row.createCell((short) colIndex);
                cell.setCellValue(colIndex * (rowIndex + 1));
            }
        }

        Drawing drawing = sheet.createDrawingPatriarch();
        ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);

        Chart chart = drawing.createChart(anchor);
        ChartLegend legend = chart.getOrCreateLegend();
        legend.setPosition(LegendPosition.TOP_RIGHT);

        ScatterChartData data = chart.getChartDataFactory().createScatterChartData();

        ValueAxis bottomAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.BOTTOM);
        ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT);
        leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);

        ChartDataSource<Number> xs = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
        ChartDataSource<Number> ys1 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
        ChartDataSource<Number> ys2 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));


        data.addSerie(xs, ys1);
        data.addSerie(xs, ys2);

        chart.plot(data, bottomAxis, leftAxis);

        // Write the output to a file
        FileOutputStream fileOut = new FileOutputStream("ooxml-scatter-chart.xlsx");
        wb.write(fileOut);
        fileOut.close();
    }
}
下面逐一来分解:

1.下面的代码新建一个工作簿和工作表单的对象

   Workbook wb = new XSSFWorkbook();
        Sheet sheet = wb.createSheet("Sheet 1");

2.下面这段代码是用生成初始化数据的,总共的数据有3行10列。

 final int NUM_OF_ROWS = 3;
 final int NUM_OF_COLUMNS = 10;

        // Create a row and put some cells in it. Rows are 0 based.
        Row row;
        Cell cell;
        for (int rowIndex = 0; rowIndex < NUM_OF_ROWS; rowIndex++) {
            row = sheet.createRow((short) rowIndex);
            for (int colIndex = 0; colIndex < NUM_OF_COLUMNS; colIndex++) {
                cell = row.createCell((short) colIndex);
                cell.setCellValue(colIndex * (rowIndex + 1));
            }
        }


3. 下面这段代码设置了画图的区域:从第5行开始,到15行结束;总共占用10列

Drawing drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);

4.创建一个离散图的坐标系

 Chart chart = drawing.createChart(anchor);
 ChartLegend legend = chart.getOrCreateLegend();
 legend.setPosition(LegendPosition.TOP_RIGHT);

 ScatterChartData data = chart.getChartDataFactory().createScatterChartData();

 ValueAxis bottomAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.BOTTOM);
 ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT);
 leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
5.往离散图上填充数据

 ChartDataSource<Number> xs = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
 ChartDataSource<Number> ys1 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
 ChartDataSource<Number> ys2 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));

 data.addSerie(xs, ys1);
 data.addSerie(xs, ys2);

其中,下面的方法定义

DataSources.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));


如下,

 public static ChartDataSource<Number> fromNumericCellRange(Sheet sheet, CellRangeAddress cellRangeAddress) 
从上面可以看出,其实填充数据的关键方法是,
<pre name="code" class="java">new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1)


那么这个方式是如何定义的呢?

public CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)
从上面可以看出,其让我们制定数据是从那一行开始的,那一行结束的,那一列开始的,那一列结束。

在上面的代码的5句话中,分别把第1行的1到10列做为基准,然后把第2行的1到10列做一个比较,画出曲线系列1

把第1行的1到10列做为基准,然后把第3行的1到10列做一个比较,画出曲线系列2


6. 开始画图

chart.plot(data, bottomAxis, leftAxis);

7. 保存成一个Excel文件

 FileOutputStream fileOut = new FileOutputStream("ooxml-scatter-chart.xlsx");
 wb.write(fileOut);
 fileOut.close();





版权声明:本文为博主原创文章,未经博主允许不得转载。

使用Apache POI绘制折线图

最近因为项目需要,学习了一下使用Apache POI绘制Excel折线图,话不多说,直接上代码。 String filePath = "DTD.xlsx"; FileInputStream...
  • u011968063
  • u011968063
  • 2016年10月05日 14:10
  • 1711

POI charts

/* * ==================================================================== * Licensed to the Ap...
  • shen332401890
  • shen332401890
  • 2014年11月10日 14:11
  • 2834

poi操作ppt图表史上最完整示例演示

poi操作ppt图表史上最完整示例演示 完整下载地址:http://download.csdn.net/detail/mike_caoyong/9841635 其它操作ppt的基础资料见:http:/...
  • mike_caoyong
  • mike_caoyong
  • 2017年05月13日 17:58
  • 1266

POI与JXL的实战性能对比

目前我所负责的系统中有POI和JXL两种方式的导出数据实现。 项目初期数据量不大一般使用JXL的方式,可以满足需求,后来在进行一些盘点,等月度出入库查询报表统计的时候出现了超过最大sheet行的错误,...
  • rj597306518
  • rj597306518
  • 2017年06月13日 10:59
  • 695

使用poi和jfreechart生成excel图表图片

最近项目在频繁的操作excel,里边涉及到很多和图表有关的东西。有时候需要使用java操作excel自带的图标,比较复杂的我们都是使用excel模板的形式实现。 除此之外,也有一些功能只需要生成对应...
  • tuzongxun
  • tuzongxun
  • 2016年09月19日 11:17
  • 3998

POI创建DOCX常用操作

NPOI创建DOCX常用操作 1、  创建文档 XWPFDocument m_Docx = new XWPFDocument(); 2、  页面设置            //1‘=1440t...
  • ligiwen1
  • ligiwen1
  • 2017年09月06日 15:26
  • 262

poi操作ppt生成图表

POI版本3.14 操作ppt的HSLF中没有找到操作图表的类。 操作pptx的XSLF中有操作图表的类:org.apache.poi.xslf.usermodel.XSLFChart。 ppt...
  • starandsea
  • starandsea
  • 2016年06月23日 10:39
  • 2518

poi获取excel2003,excel2007,ppt2007图表类型

excel2003---hssf excel2003通过HSSFChart实例的getType方法来获取图表的类型。其返回值是HSSFChart.HSSFChartType,定义为: public...
  • starandsea
  • starandsea
  • 2016年07月05日 20:02
  • 1463

Apache POI 插入图片至 Excel 的两种方法

方法 1 插入图片至坐标   ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); BufferedIma...
  • joyous
  • joyous
  • 2013年07月31日 10:50
  • 14062

java导出Excel 改变部分字体颜色,合并单元格,加斜线等

sheet wb创建等不再赘述算了,复制粘贴下:Workbook wb = new XSSFWorkbook(); Sheet sheet = wb.createSheet(); 改变部分字体颜色:...
  • yuefenghui
  • yuefenghui
  • 2017年03月28日 22:43
  • 1387
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(7) 如何用Apache POI操作Excel文件-----如何用Apache POI 画一个离散图
举报原因:
原因补充:

(最多只允许输入30个字)