1. 本文概况
POI可以操作Word文档,Excel文档等,本片文章只说对于Excel文件的读入与写出的问题。其中涉及到Excel文件中包含图片,以及利用Excel文件的数据生成折线图的问题。
2. 注意的问题
在开始的时候,也许你会去官网下载POI的官方包,然后导入工程中,其实经过试验以及网上的论调,我们可以发现会出现只能读取.xls的文档,当你读取.xlsx的文档的时候,会出现错误。
所以,POI的官方包并不适合Android使用,<a href = https://github.com/andruhon/android5xlsx>https://github.com/andruhon/android5xlsx</a>这个网址上的包是经过国外大神修剪过的。可以在Android上使用。(亲测)
3. 一些基础知识的讲解
这里我只是写出大致的代码,具体的可以在下面的源代码中获取
读取
List<Integer> x = new ArrayList<>();
List<Double> 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<PictureData> pics = (ArrayList<PictureData>) 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<Number> xs = DataSources.fromNumericCellRange(sheet,new CellRangeAddress(0,x.size() - 1,0,0)); // X轴设置数据(注意后面的参数的意义)
ChartDataSource<Number> 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>