POI库在Android设备上的使用

1. 本文概况

POI可以操作Word文档,Excel文档等,本片文章只说对于Excel文件的读入与写出的问题。其中涉及到Excel文件中包含图片,以及利用Excel文件的数据生成折线图的问题。

2. 注意的问题

在开始的时候,也许你会去官网下载POI的官方包,然后导入工程中,其实经过试验以及网上的论调,我们可以发现会出现只能读取.xls的文档,当你读取.xlsx的文档的时候,会出现错误。

所以,POI的官方包并不适合Android使用,https://github.com/andruhon/android5xlsx这个网址上的包是经过国外大神修剪过的。可以在Android上使用。(亲测)

3. 一些基础知识的讲解

这里我只是写出大致的代码,具体的可以在下面的源代码中获取

读取

List x = new ArrayList<>();
List y = new ArrayList<>();

InputStream input = new FileInputStream(PATH + "Mission01_2.xlsx"); // 将文件读取成流
Workbook wb = WorkbookFactory.create(input);    // Workbook 代表一个xls或xlsx文档
Sheet sheet = wb.getSheetAt(0);     // sheet 代表一个工作薄
Cell cell;                          // Cell 代表一个单元格
for (Row row : sheet) {            // Row 代表工作簿中的一行
    cell = row.getCell(0);
    if (cell != null && cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
        x.add((int) cell.getNumericCellValue());
        System.out.println(cell.getNumericCellValue());
    }
    cell = row.getCell(1);
    if (cell != null && cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
    y.add(cell.getNumericCellValue());
    System.out.println(cell.getNumericCellValue());
    }
}
wb.close();

上面只是把两列的数据读取出来了,工作中一般不会这么简单,具体的还要看你自己的了。

读取图片

PictureData pic = null;

InputStream input = new FileInputStream(PATH + "Mission01_1.xlsx"); // 包含图片的Excel文档
Workbook wb = WorkbookFactory.create(input);  
ArrayList pics = (ArrayList) wb.getAllPictures();
pic = pics.get(0);
wb.close();

//获取图片的类型
String ext = pic.suggestFileExtension();
System.out.println(ext);

这里只是把第一张图片获取出来了,其实图片在有数据的Excel文件里面也是可以获取到的。

写入

Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet("linechart"); // 工作簿的名称

//写入数据
for (int r = 0; r < x.size(); r++) {
    Row row = sheet.createRow(r);
    Cell cell = row.createCell(0);
    cell.setCellValue(x.get(r));
    cell = row.createCell(1);
    cell.setCellValue(y.get(r));
    }

这样就把数据给写入到文档中了,只是这时还没有生成文档。

绘制散点图

//散点图
Drawing drawing = sheet.createDrawingPatriarch(); // 创建画布

ClientAnchor anchor = drawing.createAnchor(0,0,0,0,3,1,13,17); // 创建锚点(画在哪?大小)

Chart chart = drawing.createChart(anchor); // 创建一个图表

ScatterChartData data = chart.getChartDataFactory().createScatterChartData(); // 散点图的数据类型

ChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM); // X轴

ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT); // Y轴

leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);

ChartDataSource xs = DataSources.fromNumericCellRange(sheet,new CellRangeAddress(0,x.size() - 1,0,0)); // X轴设置数据(注意后面的参数的意义)

ChartDataSource ys = DataSources.fromNumericCellRange(sheet,new CellRangeAddress(0,x.size() - 1,1,1));  // Y轴设置数据(注意后面的参数的意义)

data.addSerie(xs,ys);

chart.plot(data,new ChartAxis[] {bottomAxis,leftAxis}); // 画图

这样一个简单的散点图就可以画好了。

写入图片

if (pic != null) {
    int pictureIdx = wb.addPicture(pic.getData(),Workbook.PICTURE_TYPE_PNG);
    CreationHelper helper = wb.getCreationHelper();
    ClientAnchor pic_anchor = helper.createClientAnchor();
    pic_anchor.setCol1(3);
    pic_anchor.setRow1(20);
    pic_anchor.setCol2(13);
    pic_anchor.setRow2(40);
    Picture pict = drawing.createPicture(pic_anchor,pictureIdx);
    }

写入图片的这几个函数我也忘记了,自己查查API吧。

写入到Excel文档中

FileOutputStream fileOut = new FileOutputStream(PATH + "Mission01_2_out.xlsx");
wb.write(fileOut);
wb.close();

这样就可以了。

好了,大致写了一下步骤,其中还有一些X轴标题,Y轴标题,辅助线等可以到源码中查找。

源代码的网址: https://git.coding.net/wumeng_1993/TextXLSX_POI.githttps://git.coding.net/wumeng_1993/TextXLSX_POI.git>

你可能感兴趣的:(POI库在Android设备上的使用)